myFPGA.com.cnFPGA 技术与产业观察
← 返回栏目

FPGA RTL 组合逻辑与时序逻辑入门

myfpga.com.cn 编辑部 · 2026-10-05

RTL 描述的是硬件行为。读代码时,先区分两类逻辑:组合逻辑根据当前输入计算结果;时序逻辑在时钟事件发生时保存状态。掌握这一区别,有助于理解综合结果和仿真波形。

组合逻辑:输入变化后重新计算

组合逻辑没有记忆功能。对每一种可能的输入情况,都要为输出指定值;如果某些分支没有赋值,综合工具可能推断出锁存器,让信号保留先前的值。

下面的 SystemVerilog 示例为结果提供默认值,因此所有路径都有定义:

logic [7:0] data_a, data_b, result;
logic enable;

always_comb begin
  result = '0;
  if (enable)
    result = data_a + data_b;
end

在本例中,enable 为低时,result 是零。若设计意图是选择多个输入,应为每个分支及 default 分支指定明确结果,而不是依赖变量“自然保持”。

时序逻辑:在时钟事件中保存状态

触发器在指定时钟边沿更新。非阻塞赋值 <= 常用于这类寄存器描述;当同一时钟沿更新多个寄存器时,各寄存器依据边沿前的值计算下一状态。

logic clk, reset, enable;
logic [7:0] data_d, data_q;

always_ff @(posedge clk) begin
  if (reset)
    data_q <= '0;
  else if (enable)
    data_q <= data_d;
end

这里的 enable 为低时,寄存器保持原值,这是触发器的时序行为,并不等于组合逻辑中漏赋值而推断出的锁存器。复位是同步高有效示例;实际项目的复位极性和同步方式应与器件、板级复位电路及系统时序一致。

用代码结构表达设计意图

SystemVerilog 的 always_comb 和 always_ff 能清楚表达组合与时序过程。传统 Verilog 代码常用 always @(*) 和边沿敏感的 always @(posedge clk)。应根据目标综合工具和项目语言设置选择写法,并检查综合报告是否推断了预期的寄存器或锁存器。

一些实用检查:

RTL 仿真用于验证行为,最终电路仍需经过综合、时序分析和目标硬件验证。接下来可阅读 FPGA 有限状态机设计入门 和 FPGA 跨时钟域基础,并参考 FPGA 开发流程入门。

信息来源