Verilog HDL在状态机中的阻塞赋值与非阻塞赋值

在用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版权协议,转载请附上原文出处链接和本声明。