Verilog代码规范(四)-- 状态机简述

代码规范(四)-- 状态机简述

一般来说,verilog实现状态机一般有一段式、二段式和三段式状态。最常见和便于理解的状态机写法是三段式状态机。


一、一段式状态机(不推荐)

一段式状态机的状态跳转,以及在不同的状态下进行的logic和数据打拍都在一个always中完成。

其缺点是状态机状态跳转,和数据操作混杂在一起,调理不清晰。因此一般不建议写成一段式状态机。

 

二、二段式状态机(不反对)

第一段:时序逻辑采用同步时序的方式描述状态转移;

always @(posedge clk or negedge rst_n) begin
	if(!rst_n)
		state <= IDLE;
	else
		state <= next_state;
end

第二段:组合逻辑的方式判断状态转移条件,描述状态转换规律;并在该状态下输出信号;

always @(*) begin
	case (state)
		IDLE: begin
			if() begin
				a = 1'b0;
				next_state = A_STATE;
			end
			else begin
				a = 1'b0;
				next_state = B_STATE;
			end
		end
		A_STATE: begin
			a = 1'b0;
			next_state = B_STATE;
		end
		B_STATE: begin
			a = 1'b0;
			next_state = A_STATE;
		end
		default: begin
			a = 1'b0;
			next_state = IDLE;
		end
	endcase
end

二段式状态机的输出是组合逻辑输出,这是二段式状态机不太好的地方。因为可能会产生毛刺。

 

三、三段式状态机(推荐)

第一段:时序逻辑采用同步时序的方式描述状态转移;

always @(posedge clk or negedge rst_n) begin
	if(!rst_n)
		state <= IDLE;
	else
		state <= next_state;
end

第二段:组合逻辑的方式判断状态转移条件,描述状态转换规律;

always @(*) begin
	case (state)
		IDLE: begin
			if()
				next_state = A_STATE;
			else
				next_state = B_STATE;
		end
		A_STATE: begin
			next_state = B_STATE;
		end
		B_STATE: begin
			next_state = A_STATE;
		end
		default: begin
			next_state = IDLE;
		end
	endcase
end

第三段:使用同步时序得到方式描述每个状态下的输出(也可以和二段式一样,使用组合逻辑输出)

always @(posedge clk or negedge rst_n)
if(!rst_n)
	a <= 1'b0;
else
	case(state)
		IDLE:     a <= 1'b0;
		A_STATE:  a <= 1'b1;
		B_STATE:  a <= 1'b1;
    default:  a <= 1'b1;
endcase

不要把一个状态机的所有的输出都在一个always块里面!

相比于两段式,三段式的时序逻辑输出解决了两段式组合逻辑的毛刺问题,但是相对的资源消耗多一些;

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值