FPGA三段式状态机如何设计?看看我的代码你就知道了!
扫描二维码
随时随地手机看文章
在这篇文章中,小编将为大家带来FPGA三段式状态机设计的相关内容。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。
三段式状态机使用3个always块,其中一个组合always块用于写状态机的状态跳转逻辑,一个时序always块用于缓存状态寄存器,另一个always块用于写当前状态下的寄存器输出逻辑。这种方式逻辑代码清晰,易于调试和理解,也是比较推荐的一个方式。
三段式状态机则通过在组合逻辑后再增加一级寄存器实现逻辑输出:
· 一个always块采用同步时序描述状态转移
· 一个always块采用组合逻辑判断转移条件、转移状态规律
·一个always块采用同步时序描述状态的输出
这种三段式状态机的写法代码非常清晰,极大降低了编写维护代码的复杂度,最大程度清晰完整的显示出状态机的结构。同时可以有效地滤除两段式状态机组合逻辑输出可能产生的毛刺信号;另外对于总线形式的输出来说,容易使总线数据对齐,从而减小总线数据间的偏移,减小接收端数据采样出错的频率:但是三段式消耗的资源相对多一点,并且三段式从输入到输出比一段式和二段式会延时一个时钟周期。
下面是本人实现的FPGA三段式状态机的代码,大家可以参考:
module state_machine (
input clk,
input rst_n,
input [1:0] inp,
output reg outp
);
// 定义状态
localparam STATE_0 = 0,
STATE_1 = 1,
STATE_2 = 2,
STATE_3 = 3;
// 定义状态寄存器和初始状态
reg [1:0] state_r, next_state ;
// 定义状态寄存器
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
state_r <= STATE_0;
end else begin
state_r <= next_state;
end
end
// 定义状态转移逻辑
always @(*) begin
case (state_r)
STATE_0: begin
if (inp == 2'b00) begin
next_state = STATE_0;
end else if (inp == 2'b01) begin
next_state = STATE_1;
end else if (inp == 2'b10) begin
next_state = STATE_2;
end else begin
next_state = STATE_3;
end
end
STATE_1: begin
if (inp == 2'b00) begin
next_state = STATE_1;
end else if (inp == 2'b01) begin
next_state = STATE_2;
end else if (inp == 2'b10) begin
next_state = STATE_3;
end else begin
next_state = STATE_0;
end
end
STATE_2: begin
if (inp == 2'b00) begin
next_state = STATE_2;
end else if (inp == 2'b01) begin
next_state = STATE_3;
end else if (inp == 2'b10) begin
next_state = STATE_0;
end else begin
next_state = STATE_1;
end
end
STATE_3: begin
if (inp == 2'b00) begin
next_state = STATE_3;
end else if (inp == 2'b01) begin
next_state = STATE_0;
end else if (inp == 2'b10) begin
next_state = STATE_1;
end else begin
next_state = STATE_2;
end
end
endcase
end
// 定义输出逻辑
always @(*) begin
case (state_r)
STATE_0: outp = 0;
STATE_1: outp = 1;
STATE_2: outp = 0;
STATE_3: outp = 1;
endcase
end
endmodule
注意:组合逻辑代码中,if语句和case语句必须写满,否则容易形成latch,导致实际运行出问题。
以上就是小编这次想要和大家分享的有关FPGA三段式状态机设计的内容,希望大家对本次分享的内容已经具有一定的了解。如果您想要看不同类别的文章,可以在网页顶部选择相应的频道哦。