Verilog中三段式状态机模板
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在用Verilog编写状态机时,建议分为三个always段完成。
三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器,然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。
三段式描述方法虽然代码结构复杂了一些,但是换来的优势是:使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。
示列如下:
//第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器
always @ (posedge clk or negedge rst_n) //异步复位
if(!rst_n)
current_state <= IDLE;
else
current_state <= next_state;//注意,使用的是非阻塞赋值
//第二个进程,组合逻辑always模块,描述状态转移条件判断
always @ (current_state) //电平触发,现态寄存器为敏感信号
begin
next_state = x; //要初始化,使得系统复位后能进入正确的状态
//对次态寄存器进行阻塞赋值
case(current_state)
S1: if(...)
next_state = S2; //阻塞赋值
S2:if()
next_state = S3. //阻塞赋值
………….
endcase
end
//第三个进程,同步时序always模块,格式化描述次态寄存器输出
always @ (posedge clk or negedge rst_n)//异步复位
begin
...//初始化
case(next_state) //次态寄存器作为CASE后的表达式
S1:
out1 <= 1'b1; //对输出进行赋值,注意是非阻塞逻辑
S2:
out2 <= 1'b1;
………..
default:... //default的作用是免除综合工具综合出锁存器。
endcase
end
有几个地方需要再注意一下:
1.注意三个进程中使用的赋值方式:只有第二个进程中用阻塞赋值,其他的地方都用非阻
塞赋值
2.注意两个进程的case表达式:第二个进程用current_state作为表达式,第三个进程用
next_state作为表达式。
3.这个三段式并不是说没碰状态机就需要这么写,当状态机比较小时就没有这个必要这样
麻烦的去写。当然,三段式这种写法是不错的习惯,刚开始可能不太习惯,多练习,多琢磨,你就习惯了。在我们开发板提供的例程中也是大量使用了这个三段式的写法。