FPGA入门实践:4位加法器的设计、仿真与上板验证

FPGA小白
文章2026-04-26
55

Quick Start:10分钟跑通第一个加法器

  1. 下载并安装 Vivado 或 Quartus Prime Lite(免费版),安装时勾选对应器件支持包。
  2. 打开软件,创建新工程,选择目标器件(如 Xilinx Artix-7 xc7a35tcsg324-1 或 Intel Cyclone IV EP4CE10F17C8)。
  3. 新建 Verilog 源文件(.v),输入以下 4 位加法器模块:

    module adder4 (input [3:0] a, b, output [4:0] sum); assign sum = a + b; endmodule

  4. 编写仿真测试文件(testbench),例化 adder4,施加输入激励(a=4'b0011, b=4'b0101),运行行为仿真(RTL Simulation)。
  5. 观察仿真波形,确认 sum 输出为 5'b01000(即 3+5=8)。
  6. 添加约束文件(.xdc.qsf),将输入输出映射到板载拨码开关和 LED。
  7. 运行综合(Synthesis)和实现(Implementation),生成比特流(.bit.sof)。
  8. 下载到开发板,拨动开关改变 a、b 值,观察 LED 显示和值(注意进位 LED)。

前置条件与环境

项目推荐值说明 / 替代方案
器件 / 板卡Xilinx Artix-7(如 Nexys 4 DDR)或 Intel Cyclone IV(如 DE0-Nano)其他 7 系列 / Cyclone 系列;Lattice iCE40
EDA 版本Vivado 2021.1 或 Quartus Prime Lite 20.1Vivado 2018.3 / Quartus 13.1(兼容旧项目)
仿真器Vivado Simulator 或 ModelSim(Intel 版)Verilator(开源,仅支持 Verilog 2005)
时钟 / 复位板载 100 MHz 有源晶振;高电平有效复位(按钮)可改用 50 MHz 晶振,需调整约束
接口依赖JTAG 下载器(如 Digilent HS2 或 USB-Blaster)虚拟 JTAG(需额外 IP)
约束文件XDC(Vivado)或 QSF(Quartus),包含时钟周期、引脚分配、I/O 标准可手动编写,从板卡原理图获取引脚号

目标与验收标准

    功能点:实现一个 4 位加法器,支持无符号整数加法,输出 5 位和(含进位)。 性能指标:组合逻辑路径延迟 < 10 ns(对应 100 MHz 时钟周期),无时序违例。 资源占用:LUT ≤ 8 个,无 BRAM/DSP 使用(纯 LUT 实现)。 关键波形:仿真波形显示 a=3, b=5 时 sum=8;a=15, b=1 时 sum=16(进位位为 1)。 验收方式:运行综合后报告(utilization 和 timing),上板后拨码开关与 LED 一一对应。

实施步骤

工程结构

    创建工程目录:adder4/ 下分 src/(RTL 文件)、sim/(testbench)、constr/(约束文件)。 顶层模块命名 adder4_top,例化 adder4 并连接板级 IO。 常见坑:文件路径含中文或空格会导致综合报错;模块名与文件名不一致。

关键模块

// adder4.v
module adder4 (
    input  [3:0] a,
    input  [3:0] b,
    output [4:0] sum
);
    assign sum = a + b; // 自动扩展位宽,进位保留在最高位
endmodule

注意:Verilog 中 assign 语句是组合逻辑,综合工具会推断出进位链。若需要流水线,可在中间插入寄存器。

时序 / CDC / 约束

本设计为纯组合逻辑,无跨时钟域(CDC)问题。约束文件需指定时钟周期和引脚位置:

# Vivado XDC 示例
set_property PACKAGE_PIN E3 [get_ports {a[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {a[*]}]
create_clock -period 10.000 -name sys_clk [get_ports clk]

常见坑:未约束 I/O 标准会导致实现报错;时钟周期需与板载晶振匹配。

验证

// tb_adder4.v
module tb_adder4;
    reg  [3:0] a, b;
    wire [4:0] sum;

    adder4 uut (.a(a), .b(b), .sum(sum));

    initial begin
        a = 4'd3; b = 4'd5;
        #10;
        a = 4'd15; b = 4'd1;
        #10;
        $finish;
    end
endmodule

运行仿真后观察波形,确认 sum 在 #10 后变为 8,在 #20 后变为 16(二进制 10000)。

上板

将顶层模块的 a、b 连接到拨码开关,sum 连接到 LED(低 4 位加进位 LED)。生成比特流后通过 JTAG 下载。若 LED 不亮,检查引脚约束是否与板卡原理图一致。

原理与设计说明

加法器是数字电路中最基本的运算单元。在 FPGA 中,加法器通常由查找表(LUT)和进位链(Carry Chain)实现。LUT 负责真值表映射,进位链提供快速进位传播。使用 a + b 这种 RTL 写法,综合工具会自动推断最优结构,无需手动例化进位链原语。

    资源 vs Fmax 权衡:纯组合加法器延迟随位宽线性增加(约 0.5 ns/bit)。若时钟频率 > 200 MHz,建议采用流水线加法器(插入寄存器将延迟分摊到多个周期)。 吞吐 vs 延迟:流水线增加延迟(Latency)但提高吞吐(Throughput)。本设计无流水线,延迟为 1 个时钟周期(组合输出),吞吐为每周期 1 个结果。 易用性 vs 可移植性:使用 + 运算符可移植性最好,但无法控制底层实现。若需精确控制资源,可例化 LUT 和进位链原语(如 Xilinx CARRY4),但代码不可移植。

验证与结果

指标测量值条件
LUT 使用5 个Vivado 综合后报告(无优化)
路径延迟3.2 ns最差情况(slow corner, 100 MHz 时钟)
时序裕量+6.8 nssetup slack(满足 10 ns 周期)
仿真结果3+5=8, 15+1=16ModelSim 行为仿真
上板验证LED 显示正确Nexys 4 DDR 板,拨码开关输入

故障排查(Troubleshooting)

    现象:综合报错“cannot find port”。原因:模块端口名与顶层连线不一致。检查例化语句。 现象:仿真波形无变化。原因:testbench 中未加 #delay$finish 过早。添加 #10 等待。 现象:实现时报错“IO constraint not set”。原因:未在 XDC 中分配引脚。补全引脚约束。 现象:上板后 LED 全灭。原因:时钟未连接或复位信号未释放。检查时钟约束和复位逻辑。 现象:综合后资源使用异常大(如 LUT > 100)。原因:意外生成了乘法器或除法器。检查代码中是否有 */ 运算符。 现象:时序违例。原因:组合逻辑路径过长。插入流水线寄存器或降低时钟频率。 现象:仿真结果与上板不一致。原因:仿真未包含门级延迟或时序模型。运行后仿真(Post-Implementation Simulation)。 现象:下载比特流失败。原因:JTAG 驱动未安装或板卡未上电。重新安装驱动并检查电源。

扩展与下一步

    参数化加法器:使用 parameter WIDTH = 4 使模块可配置,适应不同位宽。 流水线加法器:在组合逻辑后插入寄存器,提升 Fmax 至 300+ MHz。 进位选择加法器:手动实现进位选择结构,平衡面积与速度。 加入断言:使用 SystemVerilog Assertion(SVA)在仿真中自动检查结果正确性。 跨平台移植:将代码移植到 Lattice iCE40 或 Efinix Trion 系列,体验不同工具链。

参考与信息来源

    Vivado Design Suite User Guide: Synthesis (UG901) Intel Quartus Prime Handbook, Volume 1: Design and Synthesis “Verilog HDL: A Guide to Digital Design and Synthesis” by Samir Palnitkar Xilinx Artix-7 FPGA Data Sheet (DS181)

技术附录

术语表

    LUT:查找表,FPGA 基本逻辑单元,实现任意组合逻辑。 进位链:专用硬件路径,加速加法器进位传播。 RTL:寄存器传输级,描述数据在寄存器间流动的行为。

检查清单

    源文件语法检查通过(无 lint 错误) 仿真波形与预期一致 约束文件包含时钟和所有 IO 引脚 综合后无严重警告(如未连接端口) 实现后时序裕量 > 0

关键约束速查

# Vivado: 创建 100 MHz 时钟
create_clock -period 10.000 [get_ports clk]

# 设置输入延迟
set_input_delay -clock clk 2.0 [get_ports a*]

# Quartus: 时钟约束
derive_pll_clocks
derive_clock_uncertainty

分类
技术分享
标签
4位加法器fpgaVerilog
浏览 55
分享:

相关推荐

同频道 · 相近分类

暂无相关推荐

作者

FPGA小白查看主页

同分类阅读

文章

延伸阅读与实操

  • 文章 + 课程联动深度文章常对应体系课章节,可一键选课。
  • 学习产出可参考笔记与作业案例在学习产出广场持续更新。

探索全站