首要顺次答复上篇提出的几个问题:
第一个问题:怎么防止状况机发生lacth 示例如下,经过在always(*)句子块中,增加默许赋值,ns_state = cs_state;
always@(*)
ns_state = cs_state;
case(cs_state)
idle :
if(start)
ns_state = op1_state;
op0_state :
if(op0_over)
ns_state = op1_state;
op1_state :
if(op1_over)
ns_state = op2_state;
op2_state :
if(op2_over)
ns_state = op3_state;
op3_state :
if(op3_over)
ns_state = op4_state;
op4_state :
if(op4_over)
ns_state = op4_state;
default ns_state = idle;
endcase
这样,分支没有赋值的句子全部会赋值为ns_state = cs_state ;以IDLE状况为例,当时cs_state为idle。因而实践上 ns_state=idle。这条句子的作用,即在没有分支赋值的状况下,默许赋值当时状况。
第二个问题:更直观的独热码的状况机完成方法。示例如下
//状况界说
parameter idle == 0,
op0_state == 1,
op1_state == 2,
op2_state == 3,
op3_state == 4,
op4_state == 5;
//(1)当时状况
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
cs_state <= 6’b000001;
else
cs_state <= ns_state;
//(2)下一状况的赋值
always@(*)
ns_state = 0;
case(1)
cs_state[idle] :
if(start)
ns_state[op0_state] = 1’b1;
else
ns_state[idle] = 1’b1;
cs_state[op0_state] :
if(op0_over)
ns_state[op1_state] = 1’b1;
else
ns_state[op0_state] = 1’b1;
cs_state[op1_state] :
if(op1_over)
ns_state[op2_state] = 1’b1;
else
ns_state[op1_state] = 1’b1;
cs_state[op2_state] :
if(op2_over)
ns_state[op3_state] = 1’b1;
else
ns_state[op2_state] = 1’b1;
cs_state[op3_state]:
if(op3_over)
ns_state[op4_state] = 1’b1;
else
ns_state[op3_state] = 1’b1;
cs_state[op4_state] :
if(op4_over)
ns_state[idle]= 1’b1;
else
ns_state[op4_state] = 1’b1;
default ns_state[idle]= 1’b1;
endcase
//(3)输出状况
assign out1 = cs_state [op1_state];
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
out2_reg <= 1’b0;
else if (cs_state[op2_state])
out2_reg <= 1’b1;
else
out2_reg <= 1’b0;
上例中,界说状况机是,相同界说为0,1,2,3,4,5,6的值而不是独热码,只不过运用时,这些值用于赋值的为状况机的某一bit。值得留意的是,在ns_state 经过组合逻辑赋值时,首要需求将ns_state赋值为零,也就数说,除了需求赋值为1的状况,其他都需求赋值为0。但此种编码方法下,就需求慎重对待分支赋值不全的状况,因而此刻,ns_state会赋值为0。发生非想要的结果。
经过第三段的输出赋值可以看出,其输出分别是cs_state [op1_state]的直接输出,cs_state[op2_state]的存放后一拍再输出。其发生的作用与前文(操控-上)中介绍的发生的作用是共同的。因而可根据习气,挑选一种的完成即可。
最终一个问题:状况机运用可以直观的经过界说的状况来操控各个信号的输出和操控,独热码本质上仍是将状况机转变成一组某一时间只要一个起效的存放器,换个视点可以看做加强版的移位存放器。其他需求留意问题有,
(1)假如状况机界说而没有运用,归纳东西将归纳掉此状况,因而归纳后的状况会和工程师所界说的状况不同。经过查看归纳文件,就能得知其对应联系,防止经过嵌入式逻辑分析仪抓信号时,信号与实践不共同现象。
(2)如经过单周期信号发动状况机,要留意,如单周期信号起效时,状况机未跳转回有用状况,会导致犯错,应该将单周期信号转换成电平信号,等发动有用后再将电平信号拉低。
(3)状况如呈现未界说的状况(如独热码呈现全零状况),latch是其间一个首要的原因,上电后未有用复位也会导致此种或许。
(4)状况机结合移位存放器可以有用削减状况的数目。例如某个状况中,每个周期要进行多个操作,不需求再分解成多个小状况,经过移位存放器来操控这些状况的操作可以简化规划。
总归:状况机是FPGA规划的一项根本规划,而“独热码”和“三段式”的规划可以使规划到达事半功倍的作用。也是现实上行业界的FPGA规划的规范写法。而规范化能使难以了解的FPGA的代码可以有更好的移植和IP化的根底。