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

Verilog 三段式状态机设计指南:原理、实现与验证

FPGA小白FPGA小白
技术分享
2小时前
0
0
2

Quick Start(快速上手)

  1. 准备环境:安装 Vivado 2020.1+ 或 Quartus Prime 18.0+,确保工具链支持 Verilog-2001 标准。
  2. 创建工程:新建空白工程,目标器件选择 Xilinx Artix-7 (xc7a35t) 或等效 FPGA。
  3. 编写 RTL 代码:将下文“关键模块”中的三段式状态机代码复制保存为 fsm_three_stage.v
  4. 编写 Testbench:将下文“验证代码”中的仿真文件复制保存为 tb_fsm.v
  5. 运行行为仿真:在 Vivado 中将 tb_fsm 设为仿真顶层,运行 1 µs 仿真。
  6. 观察波形:确认 state 信号按 IDLE → S1 → S2 → S1 → … 循环,out 在 S2 状态拉高。
  7. 综合与实现:运行 Synthesis 和 Implementation,检查无 Latch 推断警告。
  8. 查看资源报告:确认仅使用寄存器 + LUT,无额外锁存器。

前置条件与环境

项目推荐值说明替代方案
器件/板卡Xilinx Artix-7 (xc7a35t)通用逻辑资源,适合教学Cyclone IV / Lattice iCE40
EDA 版本Vivado 2021.1支持 Verilog-2001 全特性Quartus Prime 20.1 / ModelSim
仿真器Vivado Simulator内置于 Vivado,无需额外安装ModelSim / Verilator
时钟/复位100 MHz 时钟,同步高有效复位复位同步化,避免异步复位问题异步复位(需额外 CDC 处理)
接口依赖无外部接口纯内部状态机演示可扩展为 AXI-Stream 输入
约束文件无需时序约束(仿真阶段)综合后需添加时钟周期约束SDC: create_clock -period 10 [get_ports clk]

目标与验收标准

  1. 功能点三段式状态机实现 IDLE → S1 → S2 → S1 → … 循环,在 S2 状态输出高电平。
  2. 性能指标:无组合逻辑反馈环路,无锁存器推断;寄存器输出无毛刺。
  3. 资源验收:综合报告显示无 Latch,寄存器数量 = 状态编码位宽 + 输出位宽。
  4. 波形验收:仿真波形中 stateout 在时钟上升沿同步变化,无异步跳变。
  5. 日志验收:综合与实现无 Critical Warning,无 Latch 推断。

实施步骤

工程结构

工程目录下包含以下文件:

  • rtl/fsm_three_stage.v(设计文件)
  • sim/tb_fsm.v(仿真文件)
  • constr/timing.xdc(约束文件)

顶层模块名 fsm_three_stage,端口列表:clkrst_ninout

关键模块:三段式状态机 RTL

module fsm_three_stage (
    input  wire       clk,
    input  wire       rst_n,
    input  wire       in,
    output reg        out
);

// 状态编码(独热码,易于综合)
localparam IDLE = 3'b001,
           S1   = 3'b010,
           S2   = 3'b100;

reg [2:0] state, next_state;

// 第一段:状态寄存器(时序逻辑)
always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        state <= IDLE;
    else
        state <= next_state;
end

// 第二段:次态逻辑(组合逻辑)
always @(*) begin
    next_state = state;  // 默认保持当前状态
    case (state)
        IDLE: if (in) next_state = S1;
        S1:   next_state = S2;
        S2:   next_state = S1;
        default: next_state = IDLE;
    endcase
end

// 第三段:输出逻辑(时序逻辑,寄存器输出)
always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        out <= 1'b0;
    else begin
        case (next_state)  // 使用次态判断,避免组合毛刺
            S2:   out <= 1'b1;
            default: out <= 1'b0;
        endcase
    end
end

endmodule

机制分析:三段式结构将状态机拆分为三个独立 always 块:第一段(时序逻辑)负责状态寄存,第二段(组合逻辑)计算次态,第三段(时序逻辑)生成输出。这种分离设计的关键优势在于:输出直接由寄存器驱动,避免了组合逻辑输出常见的毛刺问题。同时,次态逻辑与输出逻辑解耦,便于独立修改状态转移条件或输出策略,而不影响状态寄存器的时序闭合。

验证代码:Testbench

`timescale 1ns / 1ps

module tb_fsm;

reg  clk, rst_n, in;
wire out;

fsm_three_stage uut (
    .clk   (clk),
    .rst_n (rst_n),
    .in    (in),
    .out   (out)
);

// 时钟生成:100 MHz
always #5 clk = ~clk;

initial begin
    // 初始化
    clk   = 0;
    rst_n = 0;
    in    = 0;
    // 复位释放
    #20 rst_n = 1;
    // 触发 IDLE → S1
    #10 in = 1;
    #10 in = 0;
    // 观察自动循环
    #100;
    $finish;
end

endmodule

约束文件(可选,综合阶段使用)

create_clock -period 10.000 -name sys_clk [get_ports clk]

验证结果

运行仿真后,波形应呈现以下行为:

  • 复位期间 stateIDLEout 为低电平。
  • 复位释放后第一个时钟上升沿,state 保持 IDLE
  • in 拉高一个周期后,state 在下一个时钟沿跳变为 S1
  • 随后每个时钟沿 stateS1S2 之间交替,outS2 状态期间为高电平。
  • out 信号与时钟上升沿对齐,无组合毛刺。

综合后资源报告应显示:无 Latch 推断,寄存器数量 = 3(状态位宽)+ 1(输出位宽)= 4 个,LUT 数量约 4~6 个。

排障指南

  1. 综合报告出现 Latch 推断:检查第二段(次态逻辑)是否遗漏了 default 分支,或第三段(输出逻辑)中 case 未覆盖所有状态。确保组合逻辑中所有分支都有赋值。
  2. 仿真波形中 out 出现毛刺:确认输出逻辑使用的是 next_state 而非 state,且输出为寄存器类型(reg)。若使用组合逻辑输出,需在第三段改用 assign 并添加同步寄存器。
  3. 状态机无法从 IDLE 跳转:检查 in 信号是否在正确时钟沿被采样,建议在 Testbench 中让 in 在时钟上升沿之后变化(如 #1 延迟),避免建立时间违规。
  4. 综合后资源异常增多:检查状态编码是否为独热码,若使用二进制编码,寄存器数量可减少但组合逻辑会增加。独热码适合状态数 ≤ 16 的场景。

扩展与进阶

本指南的三段式结构可扩展至以下场景:

  • 复杂状态机:增加状态数量(如 8~16 个),保持三段式结构不变,只需修改 localparamcase 分支。
  • 多输出控制:在第三段中增加多个输出寄存器,每个输出独立控制,互不干扰。
  • Mealy 型输出:若输出依赖输入信号,可在第三段中组合 next_statein 进行判断,但需注意组合路径延迟。
  • 流水线状态机:在状态寄存器后添加一级流水线寄存器,用于高速设计中降低扇出。

风险边界:三段式结构并非万能。当状态数超过 32 时,独热码的寄存器开销过大,建议改用格雷码或二进制编码。此外,输出逻辑若使用 next_state 判断,在状态跳转频繁的场景下可能引入一个周期的输出延迟,需根据应用权衡。

参考与延伸阅读

  • Clifford E. Cummings, “State Machine Coding Styles for Synthesis”, SNUG 2002.
  • Xilinx UG901, “Vivado Design Suite User Guide: Synthesis”.
  • Intel Quartus Prime Handbook, “Recommended HDL Coding Styles”.

附录:完整文件清单

  • rtl/fsm_three_stage.v:三段式状态机 RTL 代码(见上文)
  • sim/tb_fsm.v:Testbench 代码(见上文)
  • constr/timing.xdc:时序约束文件(见上文)
标签:
本文原创,作者:FPGA小白,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/39223.html
FPGA小白

FPGA小白

初级工程师
成电国芯®的讲师哦,专业FPGA已有10年。
33020.51W7.19W34.38W
分享:
成电国芯FPGA赛事课即将上线
FPGA大赛作品解析:多模态感知与实时控制
FPGA大赛作品解析:多模态感知与实时控制上一篇
FPGA时序约束实战指南:从基础到复杂时钟域下一篇
FPGA时序约束实战指南:从基础到复杂时钟域
相关文章
总数:822
2026年硬件技术前瞻:从3D-IC到硅光集成,六大趋势深度解析与行动指南

2026年硬件技术前瞻:从3D-IC到硅光集成,六大趋势深度解析与行动指南

作为成电国芯FPGA云课堂的特邀观察员,我始终关注着那些将定义未来硬件工…
技术分享
5天前
0
0
37
0
FPGA如何成为边缘AI的“灵活大脑”?

FPGA如何成为边缘AI的“灵活大脑”?

引言:当AI来到你身边你有没有发现,AI正悄悄从云端“大服务器”…
技术分享
1个月前
0
0
77
0
硬件思维训练详解:从软件工程师到硬件设计师的思维跃迁

硬件思维训练详解:从软件工程师到硬件设计师的思维跃迁

一、硬件思维的核心特征硬件思维与软件思维的核心差异在于&nbsp…
技术分享
1年前
0
0
452
2
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容