FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-技术文章/快讯-技术分享-正文

FPGA状态机设计:玩转高效安全的单热码(One-Hot)

FPGA小白FPGA小白
技术分享
1个月前
0
0
102

在FPGA的世界里,有限状态机(FSM)就像是系统控制的“大脑”。一个设计得好的状态机,不仅思路清晰,更能让你的系统跑得又稳又快。而在众多给状态“编号”的方式中,单热码(One-Hot)凭借它在FPGA架构上的“天赋”,成为了最常用、也最高效的选择之一。

今天,我们就来一起聊聊单热码到底好在哪,并分享一套用Verilog实现的安全、高效的设计模板,帮你避开那些常见的“坑”。

一、为什么是单热码?它在FPGA里开了什么挂?

简单说,状态编码就是给每个抽象状态分配一个独特的二进制“身份证号”。常见的有二进制码、格雷码,还有我们的主角——单热码。

  • 二进制码:最省触发器(只用log₂N个),但“翻译”状态的组合逻辑复杂,容易产生毛刺。状态切换时可能多位同时变化,在高速场景下是个时序隐患。
  • 格雷码:相邻状态只变一位,减少了毛刺和瞬间功耗,常用在异步FIFO的指针上。不过,它的译码逻辑还是比单热码要复杂一些。
  • 单热码:用N个触发器表示N个状态,每个状态只有一位是‘1’,其他全是‘0’。比如,4个状态可以这样编:
    S0: 0001, S1: 0010, S2: 0100, S3: 1000。

那么,单热码在FPGA里到底有什么魔力呢?

  • 组合逻辑超简单:想知道现在是不是Sx状态?直接检查对应的那一位是不是‘1’就行了!这大大简化了逻辑,减少了LUT的级数和输入,对提高系统最高运行频率(Fmax)非常有利。
  • 天生适合FPGA体质:FPGA内部触发器资源很丰富。单热码虽然多用了几个触发器,但换来了更宝贵的布线和逻辑资源的节省。在状态数不多(比如小于16-32个)时,总体资源利用率往往更优。
  • 更安全,更健壮:万一跑飞了,出现非法状态(比如多位同时为‘1’或全‘0’),检测和恢复起来也特别容易,增强了系统的鲁棒性。

二、手把手教你写单热码状态机(Verilog模板)

一个健壮的状态机,我们通常推荐“三段式”写法(也有两段式),把时序部分(状态寄存)、组合部分(决定下一个状态)和输出逻辑分开。这样代码清晰,综合和约束也更方便。

下面就是一个为你准备好的单热码三段式模板,可以直接用起来:

module fsm_onehot #(
    parameter STATE_WIDTH = 4
) (
    input wire clk,
    input wire rst_n,
    input wire condition_a,
    input wire condition_b,
    output reg out1,
    output reg out2
);

// 1. 状态定义与声明(单热码)
localparam S_IDLE  = 4'b0001;
localparam S_START = 4'b0010;
localparam S_WORK  = 4'b0100;
localparam S_DONE  = 4'b1000;

reg [STATE_WIDTH-1:0] current_state, next_state;

// 2. 状态寄存器(时序逻辑,负责“记住”状态)
always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        current_state <= S_IDLE; // 复位到初始状态
    else
        current_state <= next_state; // 在时钟上升沿更新状态
end

// 3. 下一状态组合逻辑(决定“下一步去哪”)
always @(*) begin
    // 这里先给next_state一个默认值,防止锁存器
    next_state = current_state;
    case (current_state)
        S_IDLE: begin
            if (condition_a) next_state = S_START;
        end
        S_START: begin
            // ... 根据你的条件跳转
            next_state = S_WORK;
        end
        S_WORK: begin
            if (condition_b) next_state = S_DONE;
        end
        S_DONE: begin
            next_state = S_IDLE;
        end
        // 可以在这里添加对非法状态的恢复处理
        default: next_state = S_IDLE;
    endcase
end

// 4. 输出逻辑(可以是组合的,也可以是时序的)
// 这里以组合输出为例
always @(*) begin
    // 默认输出
    out1 = 1'b0;
    out2 = 1'b0;
    case (current_state)
        S_WORK: begin
            out1 = 1'b1;
        end
        S_DONE: begin
            out2 = 1'b1;
        end
        // ... 其他状态的输出赋值
    endcase
end

endmodule

希望这个模板和讲解,能帮你更好地理解和运用单热码,设计出既高效又可靠的FPGA状态机。动手试试吧!

标签:
本文原创,作者:FPGA小白,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/28826.html
分享:
FPGA通信双雄:手把手教你玩转I2C与SPI的Verilog实现
FPGA通信双雄:手把手教你玩转I2C与SPI的Verilog实现上一篇
SystemVerilog for FPGA:面向对象编程在验证中的高效应用下一篇
SystemVerilog for FPGA:面向对象编程在验证中的高效应用
相关文章
总数:1.21K

FPGA图像处理:基于Verilog的Sobel边缘检测实现

QuickStart环境准备:安装Vivado2020.1+(或QuartusPrime18.1+),确认支持目标FPGA器件(如Xil…
二牛学FPGA二牛学FPGA
技术分享
24天前
0
0
40
0

Verilog中generate语句的灵活运用与综合结果设计指南

QuickStart准备一个支持Verilog-2001的EDA工具(如Vivado、Quartus、VCS)。创建一个新工程,添加…
二牛学FPGA二牛学FPGA
技术分享
28天前
0
0
38
0

RISC-V FPGA软核在开源EDA工具链中的全流程实现指南(2026 Q2)

QuickStart安装开源EDA工具链(Yosys+nextpnr+ProjectTrellis/apicula)与RISC-…
二牛学FPGA二牛学FPGA
技术分享
14天前
0
0
33
0

FPGA数字下变频(DDC)与数字上变频(DUC)实现指南

数字下变频(DDC)与数字上变频(DUC)是现代软件无线电(SDR)与通信系统的基石。它们分别承担着将高频信号搬移至基带进行低速率处理,以及将基…
二牛学FPGA二牛学FPGA
技术分享
1个月前
0
0
60
0

异步FIFO设计指南:基于双口RAM的Verilog实现与调试技巧

QuickStart准备环境:Vivado2024.2/QuartusPrimePro24.3,仿真器用VivadoSimul…
二牛学FPGA二牛学FPGA
技术分享
14天前
0
0
45
0
xilinx FPGA开发平台下载

xilinx FPGA开发平台下载

本文提供的是xilinxFPGA开发平台的工具下载方案,vivado、vitis软件下载。可以通过xilinx官方平台下载、或是通过百度网盘下…
二牛学FPGA二牛学FPGA
技术分享, 资源分享
4个月前
0
0
382
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容