FPGA状态机设计详解:从Moore到Mealy的完整指南

FPGA状态机设计详解:从Moore到Mealy的完整指南

前言

有限状态机(FSM)是FPGA数字逻辑设计中最为核心的设计方法之一。无论是简单的流水灯控制,还是复杂的通信协议解析,状态机都扮演着不可或缺的角色。

Moore状态机与Mealy状态机

Moore状态机

Moore状态机的输出仅取决于当前状态,与输入信号无关。其结构清晰,时序容易控制。

verilog 复制代码
module fsm_moore(
    input  wire       clk,
    input  wire       rst_n,
    input  wire       din,
    output reg        dout
);
    localparam S0 = 2'b00;
    localparam S1 = 2'b01;
    localparam S2 = 2'b10;
    localparam S3 = 2'b11;
    reg [1:0] current_state, next_state;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) current_state <= S0;
        else current_state <= next_state;
    end
    always @(*) begin
        case (current_state)
            S0: next_state = din ? S1 : S0;
            S1: next_state = din ? S2 : S1;
            S2: next_state = din ? S3 : S2;
            S3: next_state = din ? S0 : S3;
            default: next_state = S0;
        endcase
    end
    always @(*) begin
        case (current_state)
            S3: dout = 1'b1;
            default: dout = 1'b0;
        endcase
    end
endmodule

Mealy状态机

Mealy状态机的输出同时取决于当前状态和输入信号,响应速度更快。

verilog 复制代码
module fsm_mealy(
    input  wire       clk,
    input  wire       rst_n,
    input  wire       din,
    output reg        dout
);
    localparam S0 = 2'b00;
    localparam S1 = 2'b01;
    localparam S2 = 2'b10;
    reg [1:0] current_state, next_state;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) current_state <= S0;
        else current_state <= next_state;
    end
    always @(*) begin
        dout = 1'b0;
        next_state = current_state;
        case (current_state)
            S0: if (din) begin next_state = S1; dout = 1'b1; end
            S1: if (din) next_state = S2; else next_state = S0;
            S2: if (!din) begin next_state = S0; dout = 1'b1; end
            default: next_state = S0;
        endcase
    end
endmodule

三段式状态机推荐写法

  1. 第一段:时序逻辑,描述状态寄存器跳转
  2. 第二段:组合逻辑,描述下一状态产生条件
  3. 第三段:时序或组合逻辑,描述输出

状态机编码方式

  • 二进制编码:使用最少触发器,适合资源敏感设计
  • 独热码:每个状态一个触发器,译码简单,适合高速设计
  • 格雷码:相邻状态仅一位变化,适合低功耗设计

总结

状态机是FPGA设计中最基础也最重要的设计方法之一。掌握Moore和Mealy的区别,熟练运用三段式写法,能够帮助开发者设计出更加可靠高效的FPGA电路。


需要系统学习FPGA的朋友,这里有一份整理的FPGA汇总课程资料,包含BD教程、Vivado教程、IP核教程等:

链接: https://pan.baidu.com/s/1pIFS8GEYu_jH1np4ZLG2Kw?pwd=wbbw 提取码: wbbw

整理不易,尽快保存

相关推荐
珞光电子USRP SDR软件无线电平台7 小时前
国产嵌入式SDR平台LW-E320-G详解:射频、FPGA、ARM架构与应用选型
arm开发·fpga开发·架构
FPGA小迷弟8 小时前
【硬核通俗】FPGA实现SDR软件无线电完整技术解析(原理+架构+实战)
fpga开发·dsp开发·sdr·无线电
FPGA开源工坊11 小时前
ISP图像处理--Bayer Raw格式
图像处理·人工智能·verilog·fpga·isp
Eloudy1 天前
HSB FPGA 架构总体
fpga开发·架构
Terasic友晶科技1 天前
【教程】Agilex 5 SOC FPGA的HPS端如何响应FPGA端中断(三)——设备树Overlay
fpga开发·设备树·agilex 5·设备树overlay
ARM|X86+FPGA工业主板厂家1 天前
基于嵌入式 GPU 的智能服务机器人
linux·运维·arm开发·fpga开发·机器人
Freak嵌入式1 天前
Pico PIO 汇编语法深度详解:标识符、指令、伪指令全解析
汇编·stm32·单片机·嵌入式硬件·fpga开发·硬件架构
Riwuarua1 天前
从近似0基础开始FPGA开发 -- part.7 FPGA的网络通信设计
fpga开发
pingping_TEL1 天前
JESD204B_IP核使用教程
fpga开发
cmc10282 天前
292.三段式状态机第三段时序逻辑用state_c与_n的差异分析
fpga开发