在用Verilog HDL描述状态机下,一般建议使用三段式。如下:
reg[4:0] curr_state,next_state;
always@(posedge clk or posedge rst)
begin
if(rst)
curr_state <= STATE_RESET;
else
curr_state <= next_state;
end
always@(clk,rst,cnt_delay,cnt_bit,start,curr_state)
begin
if(rst)
next_state = STATE_RESET;
else
begin
case(curr_state)
STATE_RESET:
next_state = STATE_IDLE;
STATE_IDLE:
if(start)
next_state = STATE_START;
状态的切换操作
default: next_state = STATE_IDLE;
endcase
end
end
always@(posedge clk)
begin
case(curr_state)
STATE_RESET:
readData <= 16'd0;
STATE_DONE:
readData <= readDataBuf;
default:
readData <= readData;
endcase
end
等后续各种赋值操作。
在开始使用时,在next_state的切换时,使用的是非阻塞赋值。前两天通过看例子,发现在next_state的切换时,都是使用的阻塞赋值,有了这个思考。
一直都知道,在时序逻辑中使用非阻塞赋值,在组合逻辑中使用阻塞赋值。所以在这个基础上,在如下的always中,敏感信号是沿信号,所以是描述的时序电路,使用非阻塞赋值。
always@(posedge clk)
而在next_state的切换中,always的 敏感信号是多个电平信号(非沿信号),则说明该程序块描述的组合逻辑电路,所以应该使用阻塞赋值。
今天在跟同事讲这个的时候,突然想到这里,顿悟了。
很简单的一个“next_state的状态转换应该使用阻塞赋值还是非阻塞赋值“问题,在知道使用阻塞赋值,但并说不清楚为什么使用阻塞赋值的状况下,终于想明白了。
版权声明:本文为u011461844原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。