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

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

FPGA小白FPGA小白
技术分享
20小时前
0
0
5

在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小白

FPGA小白

初级工程师
成电国芯®的讲师哦,专业FPGA已有10年。
18618.27W7.03W34.38W
分享:
成电国芯FPGA赛事课即将上线
FPGA通信双雄:手把手教你玩转I2C与SPI的Verilog实现
FPGA通信双雄:手把手教你玩转I2C与SPI的Verilog实现上一篇
SystemVerilog for FPGA:面向对象编程在验证中的高效应用下一篇
SystemVerilog for FPGA:面向对象编程在验证中的高效应用
相关文章
总数:184
2026,EUV光刻机如何改写芯片设计规则?

2026,EUV光刻机如何改写芯片设计规则?

摩尔定律的脚步从未停歇,芯片制造工艺正朝着更精细、更强大的方向狂奔。在这…
技术分享
3天前
0
0
56
0
01ZYNQ_ECO开发板硬件规格说明书

01ZYNQ_ECO开发板硬件规格说明书

01ZYNQ_ECO开发板硬件规格说明书…
技术分享, 资源分享
8个月前
0
0
273
0
Vitis2020.1(Vivado2020.1)安装教程

Vitis2020.1(Vivado2020.1)安装教程

本教程使用vitis2020.1版本的开发套件。Vitis统一软件平台可…
技术分享
4年前
9
0
6.74K
2
评论表单游客 您好,欢迎参与讨论。
请输入昵称
请输入邮箱
请输入网址
0 / 100
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
暂无评论,第一个评论下?