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

整理不易,尽快保存

相关推荐
涛tao讲道11 小时前
星载FPGA选型与抗辐射设计手册
fpga开发·抗单粒子翻转·涛tao悟道·涛的天道观·seu
艾芯微科技11 小时前
钰泰 ETA6973PQ3Y|QFN3×3 2A 同步降压 Buck,I2C 可配置多档输出,动态调压 PMIC
网络·单片机·嵌入式硬件·fpga开发·集成测试·51单片机
NamoAmitabha12811 小时前
lwIP 问答---deepseek
fpga开发
吉他英雄一里11 小时前
时钟IP核(MMCM PLL)
fpga开发
星夜离尘5611 小时前
FPGA实现CRC-8/SMBUS:从参数和位序核对到1041次自检
fpga开发·verilog·fpga·crc
星夜离尘5616 小时前
FPGA正交编码器非法跳变检测:把16种状态转移和采样边界测清楚
verilog·fpga·编码器
匠行科技20 小时前
6U‑VPX 高密度异构处理板硬件方案实践
fpga开发·硬件工程
努力搬砖的小H21 小时前
FPGA应用技巧之AXI4-FULL-uiFDMA IP仿真验证
经验分享·fpga开发·axi
hexiaoyan8271 天前
高速图像采集卡处理板卡设计原理图:10-基于TMS320C6678+XC7K325T的6U CPCI Full Camera Link图像处理平台
fpga开发·高速图像采集·图像采集卡·c6678板卡
szxinmai主板定制专家1 天前
储能EMS + 协调控制器实战:RK3568/3576/3588+FPGA+AI 故障录波与诊断
人工智能·深度学习·机器学习·fpga开发·rk3588·rk3576·协调控制器