此文摘抄网名为crazybingo的书中的对三段式状态机的介绍。
在FPGA逻辑设计中,如果状态机比较大,需要的状态转移、信号等的处理比较复杂,建议使用三段式状态机来完成设计,当采用三段式建模描述FSM的状态机输出时,只需要指定case敏感表为次态寄存器,然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。
虽然三段式描述方法的代码结构复杂一些,但是换来了很多的好处:使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定性和毛刺的隐患,而且更利于时序路径的分组,使得其在fpga/cpld中的综合和布局布线的效果更佳。另外三段式状态机的结构统一,便于维护,在设计思路上非常清晰。
在第一个进程中,同步时序always模块,格式化描述次态寄存器转移到现态寄存器:
//FSM:always1
reg [2:0] c_state,n_state;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
c_state<=IDLE;
else
c_state <=n_state;
end
在第二个进程中,组合逻辑always模块,判断状态并且描述状态转移(注意状态要写完整):
//FSM2
always@(*)
begin
n_state = IDLE;
case(c_state)
S1:begin
if(...)
n_state =S2;
else
......
end
S2:...
......
endcase
end
在第三个进程中,同步时钟always模块,格式化的描述次态寄存器的输出。
//FSM3
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
.....
else
case(n_state)
S1:....
S2:....
.....
default:;
endcase
end
状态机是时序电路的万能钥匙,所有时序电路都能通过状态机实现,。状态机是FPGA逻辑电路设计的精髓,现实世界都是线程的并行,熟练掌握状态机,是学好FPGA的必经之路。