FSM的描述方法
在FPGA设计中,“有限状态机”(Finite State Machine,FSM)的描述方式主要有三种方式:一段式、两段式、三段式。
一段式写法,整个状态机写到一个always块(进程)中。在该always块中,即描述了状态转移,又描述了状态的输入和输出。
二段式写法,状态机用两个always块描述。在其中一个always块中,采用同步方式描述状态转移;在另外一个always块中,采用组合逻辑判断状态转移条件、状态转移规律和输出。
三段式写法,状态机用三个always快描述。第一个always块采用同步方式描述状态转移;第二个always块采用组合逻辑判断状态转移条件,描述状态转移规律;第三个always块,利用组合或者同步逻辑描述状态输出。
‘两段式写法’相比于‘一段式写法’,优点在于将同步逻辑和组合逻辑放入两个always块中,便于理解和维护,利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线;缺点,则是当前状态的输出用组合逻辑实现,用以产生毛刺。‘三段式写法’则弥补了‘两段式写法’的不足,其根据状态转移规律,在上一状态根据输入条件,判断出当前状态的输出,从而在不插入额外时钟条件的情况下,实现寄存器输出。
例如,编写‘101’序列检测器的状态机程序,当检测到输入序列为101时,输出一个高电平信号。
三段式写法
moduleseqcheck_101(clk,rst,din,dout);
inputclk;//clock signal
inputrst;//reset signal
inputdin;//data in
outputreg dout;//data out
parameteridle=3'b000,one=3'b001,two=3'b010,three=3'b100;
reg[2:0] c_state;
reg[2:0] n_state;
//sequentialstate transition
always@(posedge clk)
begin
if(!rst)
c_state<=idle;
else
c_state<=n_state;
end
//combinationalcondition judgment
always@(c_state or din)
begin
n_state=3'bx;
case(c_state)
idle:
begin
if(din)
n_state=one;
else
n_state=idle;
end
one:
begin
if(din)
n_state=one;
else
n_state=two;
end
two:
begin
if(din)
n_state=three;
else
n_state=idle;
end
three:
begin
if(din)
n_state=one;
else
n_state=two;
end
default:
n_state=idle;
endcase
end
//thesequential output
always@(posedge clk)
begin
if(!rst)
dout<=1'b0;
else
begin
case(n_state)
idle:dout<=1'b0;
one:dout<=1'b0;
two:dout<=1'b0;
three:dout<=1'b1;
default:dout<=1'b0;
endcase
end
end
endmodule
推荐使用三段式描述法,即利于维护,又不会产生毛刺。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
DC和APR阶段,setup,hold的解决办法
DC时,
setup violation解决:
pipeline, retime
降低频率;
增加前级的面积,加大drive,decrease time。
hold violation 解决:等APR后再一起处理
APR时,
setup violation解决:工具自动解决不了的,再ECO
hold violation 解决:加入buffer
buffer, latch, FF, register 区别
buffer:
两个反相器,先后连接
Latch:
开关,加上两个反相器,头尾互连
Flip flop:
两个latch,控制开关为相反信号
Register:
一般由D 触发器组成