使用三个always模块
一个always模块使用同步时序描述状态转移;
例如:
always @(posedge sys_clk or negedge sys_rst_n) begin
if( !sys_rst_n)
curr_st <= S0;
else
curr_st <= next_st;
end
一个always采用组合逻辑判断状态转移条件;
always @(*) begin
case (curr_st)
S0: next_st = S1;
S1: next_st = S2;
S2: next_st = S3;
S3: next_st = S4;
S4: next_st = S5;
S5: next_st = S6;
S6: next_st = S0;
default:next_st = S0;
endcase
end
另一个always描述状态输出(可用组合电路输出,也可以时序电路输出),一般推荐时序电路输出;
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n)
clk_divide_7 <= 1'b0;
else if ((curr_st == S0) | (curr_st == S1) | (curr_st == S2) | (curr_st == S3))
clk_divide_7 <= 1'b0;
else if ((curr_st == S4) | (curr_st == S5) | (curr_st == S6))
clk_divide_7 <= 1'b1;
else
;
end