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

整理不易,尽快保存

相关推荐
zlinear数据采集卡16 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
zlinear数据采集卡20 小时前
ZLinear产品线全景对比:D223 vs DABL7606 vs DABL-G511选型指南
arm开发·嵌入式硬件·算法·fpga开发·开源
何事误红尘1 天前
ZYNQ学习FPGA笔记(一):vivado安装、XC7Z045
fpga开发
zlinear数据采集卡2 天前
D223的SRAM硬件记录仪:外部触发与瞬态波形捕获方案
arm开发·嵌入式硬件·fpga开发·开源
szxinmai主板定制专家2 天前
基于 RK3588 + Xilinx Kintex-7 FPGA 异构工业主控板设计方案
arm开发·人工智能·嵌入式硬件·fpga开发·zynq
Rambo.xia2 天前
RFSoC高速采集卡设计项目:一块板卡串联综合优化5大核心技术
单片机·嵌入式硬件·fpga开发
XMAIPC_Robot2 天前
RK3588+STM32:高性能机器人运动控制解决方案,兼顾实时性与AI算力
人工智能·stm32·嵌入式硬件·算法·fpga开发·机器人·arm+fpga
zlinear数据采集卡2 天前
D223的DDS信号发生器:10000点查找表与4通道16位DAC波形输出
arm开发·嵌入式硬件·fpga开发·开源
物质波波波3 天前
WS-RPE:面向边缘物理AI实时特征值计算的硬件工作窃取调度器与冗余PE激活架构
人工智能·fpga开发·架构·系统架构·硬件架构