FPGA Base 状态机编写

FPGA Base 状态机编写

说来惭愧,再写了不少HDL代码以后,当被问到三段式状态机的写法是如何实现的,我却不知道,平时基本都是用2个always语句实现。

所以今天补一篇关于状态机的文档,针对以前自己不规范的开发做一个约束。

状态机的基本要素

  • 状态
    状态变量,使用状态划分逻辑顺序和时序规律
  • 输出
    在某一个状态时特定发生的时间
  • 输入
    状态机中进入每个状态的条件,有的状态机没有输入条件,其中的状态转移较为简单;有的状态机有输入条件,当某个输入条件存在时才能转移到相应的状态

分类

  • 摩尔状态机
    输出仅仅依赖于当前状态,而与输入条件无关
  • 米勒状态机
    输出不仅依赖于当前状态,而且取决于该状态的输入条件

描述方式

  • 状态转移图
  • 状态转移列表
  • HDL描述

三段式状态机——RTL最佳实践

// 第一段时序逻辑 状态的跳转
always@(posedge clk) begin
	if(rst)
		cur_state <= IDLE;
	else 
		cur_state <= nxt_state;
end


//第二段组合逻辑 状态机的变化
always@(*)  begin
	case(cur_state)
			IDLE:  nxt_state = S1;
			S1:   nxt_state = S2;
			S2:   nxt_state = S3;
			...
			default : nxt_state  = IDLE;
	endcase
end


// 第三段时序逻辑 状态机的输出
always@(posedge clk) begin
	if(rst)
		fsm_out <= 'd0;
   else begin
		case (nxt_state)
			IDLE:  fsm_out  <=  'd0;
			S1:   fsm_out   <=  'd1;
			S2:   fsm_out   <=  'd2;
			...
			default : fsm_out  <=  'd0;

		endcase
	end
end

总结

三段式状态机状态之间的跳转需要经过一级时序逻辑,同时,状态机的输出也需要经过一级时序逻辑,这样有利于FPGA实现时序约束,并且状态机对外无组合逻辑输出。采样标准的三段式的编码风格,有利于代码的维可读性和维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值