Quick Start
- 步骤一:安装 Vivado 或 Quartus(推荐 Vivado 2020.1+),并创建一个空白工程,选择目标器件(如 XC7A35T)。
- 步骤二:在工程中新建一个 Verilog 源文件(top.v),编写一个简单的组合逻辑电路,例如 4 位加法器。
- 步骤三:编写 Testbench 文件(tb.v),使用
$display或$monitor打印输入输出,验证加法器功能。 - 步骤四:在 Vivado 中运行“Simulation” → “Run Behavioral Simulation”,观察波形或控制台输出,确认组合逻辑正确。
- 步骤五:修改 top.v,添加一个 D 触发器(
always @(posedge clk)),将加法器输出寄存,形成时序逻辑。 - 步骤六:在 Testbench 中添加时钟生成(
always #5 clk = ~clk;)和复位逻辑,重新仿真,观察时序波形。 - 步骤七:综合(Synthesis)并查看 RTL 视图,确认组合逻辑和时序元件(触发器)的实例化。
- 步骤八:实现(Implementation)后,查看时序报告,确认无建立时间违例(WNS ≥ 0)。
- 步骤九:若目标板可用,生成比特流并下载,用逻辑分析仪或 LED 验证功能。
前置条件与环境
| 项目 | 推荐值 | 说明 | 替代方案 |
|---|---|---|---|
| 器件/板卡 | Xilinx Artix-7 XC7A35T(如 Nexys4 DDR) | 入门级 FPGA,资源充足 | Intel Cyclone IV / V;任何支持 Verilog 的 FPGA |
| EDA 版本 | Vivado 2020.1 或更新 | 提供完整仿真与综合流程 | Quartus Prime 18.0+;ModelSim/Questa |
| 仿真器 | Vivado Simulator(xsim) | 集成在 Vivado 中,无需额外安装 | ModelSim/Questa;Verilator(仅仿真) |
| 时钟/复位 | 100 MHz 板载时钟;低电平有效复位 | 常见开发板配置 | 50 MHz 或其他;高电平复位亦可 |
| 接口依赖 | 无外部接口要求,仅仿真 | 纯软件验证,无需硬件 | 若上板需连接 LED 或按键 |
| 约束文件 | 需要 XDC 文件定义时钟周期(create_clock) | 上板时必需,仿真阶段可省略 | Quartus 使用 SDC 文件 |
| 操作系统 | Windows 10/11 或 Ubuntu 18.04+ | 主流开发环境 | CentOS 7;macOS 通过虚拟机 |
目标与验收标准
- 功能点:实现一个 4 位加法器(组合逻辑),并将其输出寄存到 D 触发器(时序逻辑)。
- 性能指标:仿真中加法器输出在时钟上升沿后稳定,无毛刺;时序报告中 WNS ≥ 0。
- 资源占用:使用 4 个 LUT 和 4 个触发器(FF),具体取决于综合工具。
- 验收波形:在仿真波形中,看到加法器输出(组合)在输入变化后立即改变,而寄存输出(reg)在下一个时钟上升沿更新。
实施步骤
工程结构
project/
├── rtl/
│ └── top.v # 顶层模块,包含组合与时序逻辑
├── sim/
│ └── tb.v # Testbench
├── constraints/
│ └── top.xdc # 时序约束(仅上板需要)
└── scripts/
└── run.tcl # 可选,自动化脚本注意:仿真阶段无需约束文件,但上板时必须提供正确的时钟约束。
关键模块
// top.v
module top (
input wire clk,
input wire rst_n,
input wire [3:0] a,
input wire [3:0] b,
output wire [3:0] sum_comb, // 组合逻辑输出
output reg [3:0] sum_reg // 时序逻辑输出
);
// 组合逻辑:连续赋值
assign sum_comb = a + b;
// 时序逻辑:D 触发器
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
sum_reg <= 4'b0;
else
sum_reg <= sum_comb;
end
endmodule原因与机制分析:组合逻辑(assign)直接反映输入变化,无存储能力;时序逻辑(always @(posedge clk))在时钟沿采样输入并保持,实现数据同步与流水线。此设计展示了从纯组合到寄存输出的关键过渡,是时序电路设计的基础。
落地路径:在 Testbench 中生成 100 MHz 时钟(周期 10 ns),提供复位信号,并施加多组输入激励(如 a=4'b0011, b=4'b0101),观察波形确认 sum_comb 即时变化而 sum_reg 在下一个时钟沿更新。验证通过后,进行综合与实现,检查资源报告与时序报告。
风险边界:若时钟频率过高(如 >200 MHz),组合逻辑路径延迟可能导致建立时间违例(WNS < 0),需插入流水线寄存器。复位信号需满足最小脉宽要求,否则触发器可能进入亚稳态。仿真中未考虑门延迟,上板后需通过时序分析确认。
验证结果
仿真波形应显示:在输入 a、b 变化后,sum_comb 立即更新(组合逻辑),而 sum_reg 在下一个时钟上升沿才跟随变化。时序报告中 WNS ≥ 0 表示无建立时间违例。资源占用约为 4 个 LUT 和 4 个 FF,与设计预期一致。
排障指南
- 仿真无波形:检查 Testbench 中是否添加了
initial $dumpvars;或 Vivado 中是否启用了波形记录。 - 时序违例:降低时钟频率或优化组合逻辑路径(如减少级联门数)。
- 综合报错:确认模块端口声明与实例化一致,避免未连接信号。
- 上板后无输出:检查约束文件中时钟周期定义是否正确,复位极性是否匹配。
扩展方向
- 将 4 位加法器扩展为 8 位或 16 位,观察资源与延迟变化。
- 添加流水线寄存器(多级 D 触发器),提高时钟频率。
- 集成到更大系统(如状态机或数据通路),实现复杂功能。
- 使用 IP 核(如 Xilinx 的加法器 IP)对比手动实现与自动优化的差异。
参考资源
- Vivado Design Suite User Guide: Synthesis (UG901)
- IEEE Std 1364-2001: Verilog Hardware Description Language
- Xilinx Artix-7 FPGA Data Sheet (DS181)
附录
Testbench 示例(tb.v):
module tb;
reg clk, rst_n;
reg [3:0] a, b;
wire [3:0] sum_comb, sum_reg;
top uut (.*);
always #5 clk = ~clk; // 100 MHz
initial begin
clk = 0; rst_n = 0;
#10 rst_n = 1;
a = 4'b0011; b = 4'b0101;
#10 a = 4'b1010; b = 4'b0110;
#10 $finish;
end
endmodule


