Nov 6, 2007

关于状态机写法的一点看法 FSM Finite State Machine

关于以下两种状态机,说点自己的见解。
1. reg control_signal;
always @(c_s or other_sensitive_variable)
begin
control_signal = 1'b0;
......
case(c_s)
state0:
state1:
begin
control_signal = 1'b1;
if(sensitive_variable1)
n_s = state2;
end
...
endcase
end
always @(clk or rstj)
if(!rstj)
c_s <= case_init ;
else
c_s <= n_s;
2. wire control_signal = c_s == state2;

always @(c_s or other_sensitive_variable)
begin
case(c_s)
state0:
state1:
if(sensitive_variable1)
n_s = state2;
...
endcase
end
always @(clk or rstj)
if(!rstj)
c_s <= state_init ;
else
c_s <= n_s;
control_signal调用:
always @(posedge clk or negedge rstj)
if(!negedge rstj)
reg_a <= 1'b0;
else if(control_signal)
reg_a <= reg_x;
reg_x会在state1的时候就ready,当sensitive_variable1有效时,reg_x已经ready。
观察两种写法control_signal的情况:
1.当state1向state2切换时,reg_x的值同时被赋给reg_a;
2.当state1向state2切换时,control_signal被赋1,但此时reg_x的值需要等待1T之后才能赋给reg_a.
分析:
1.两种写法都是可以的,只需要保持数据和控制一致;
2.第二种写法的可读性和维护性更好;
3.初步看来,如果数据控制不做特别的处理的话,第一种写法在每种状态的切换可以省下一个T,对于时间要求很紧促,或者状态切换较多的情况下采用第一种较好。
以上只是对项目中看到的两种状态机的写法的一些个人见解,如有不妥之处,请Email给我指出,Thanks! ^_^

No comments:

Post a Comment