FPGA入门:从零开始学Vivado工程创建

FPGA小白
文章2026-04-30
60

Quick Start

  1. 下载并安装 Vivado(推荐 2023.1 或更新版本),安装时选择“Vivado HLx”并包含目标器件库(如 Artix-7)。
  2. 打开 Vivado,点击“Quick Start”下的“Create Project”。
  3. 输入工程名称(如“led_blink”)和路径,勾选“Create project subdirectory”。
  4. 选择“RTL Project”并勾选“Do not specify sources at this time”。
  5. 在“Default Part”中选择目标板卡(如“xc7a35tcsg324-1”),或通过“Boards”选项卡选择官方开发板。
  6. 点击“Finish”创建空白工程。
  7. 在“Sources”面板右键点击“Design Sources” → “Add Sources” → “Add or create design sources”,新建一个 Verilog 文件(如“top.v”)。
  8. 编写简单闪烁代码(例如:50MHz 时钟分频后驱动 LED),保存。
  9. 在“Flow Navigator”中点击“Run Synthesis”,等待综合完成。
  10. 综合成功后,点击“Open Synthesized Design”查看 RTL 网表;若需上板,继续点击“Run Implementation” → “Generate Bitstream”。

前置条件与环境

项目/推荐值说明替代方案
器件/板卡Xilinx Artix-7 xc7a35tcsg324-1Kintex-7、Zynq-7000(需调整器件库)
EDA 版本Vivado 2023.1(或更新)Vivado 2020.1+(部分功能可能不同)
仿真器Vivado Simulator(内置)ModelSim、Questa、Verilator
时钟/复位板载 50MHz 晶振(或外部时钟源)100MHz 晶振(需调整分频参数)
接口依赖Micro-USB 下载线(Digilent JTAG)Platform Cable USB II
约束文件XDC 文件(定义时钟周期、引脚位置)手动编辑约束或使用 Tcl 脚本

目标与验收标准

完成本指南后,你应能:

  • 成功创建 Vivado RTL 工程并添加源文件。
  • 综合与实现通过,无严重错误(Critical Warning 可接受)。
  • 生成比特流并下载至板卡,观察到 LED 以 1Hz 频率闪烁(或预期现象)。
  • 资源占用:LUT < 50,FF < 30,满足入门级设计。
  • 仿真波形显示时钟分频正确,LED 信号周期为 1 秒。

实施步骤

阶段一:工程结构

创建工程时,建议使用“Create project subdirectory”以保持文件整洁。工程目录结构示例:

led_blink/
├── led_blink.xpr          (工程文件)
├── led_blink.srcs/        (源文件)
│   ├── sources_1/         (设计源)
│   ├── sim_1/             (仿真源)
│   └── constrs_1/         (约束文件)
├── led_blink.runs/        (运行结果)
└── led_blink.cache/       (缓存)

常见坑与排查

  • :工程路径包含中文或空格,导致综合/实现失败。

    排查:检查路径是否全英文,且无特殊字符。

  • :未勾选“Create project subdirectory”,导致文件散落。

    排查:重新创建工程时务必勾选。

阶段二:关键模块

编写一个简单的 LED 闪烁模块。以下代码使用 50MHz 时钟,分频至 1Hz:

module top (
    input  wire clk,
    input  wire rst_n,
    output reg  led
);
    reg [25:0] cnt;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt <= 0;
        else if (cnt == 50_000_000)
            cnt <= 0;
        else
            cnt <= cnt + 1;
    end
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            led <= 0;
        else if (cnt == 50_000_000)
            led <= ~led;
        else
            led <= led;
    end
endmodule

注意:计数器位宽需足够(2^26 > 50,000,000)。若时钟频率不同,需调整比较值。

常见坑与排查

  • :计数器溢出,导致闪烁频率错误。

    排查:计算所需位宽:log2(时钟频率/目标频率) 向上取整。

  • :复位信号极性错误(如高有效 vs 低有效)。

    排查:确认板卡复位是高电平还是低电平,代码中对应修改。

阶段三:时序/CDC/约束

约束文件(XDC)是确保时序收敛的关键。创建约束文件(如“top.xdc”),内容如下:

# 时钟约束
create_clock -name sys_clk -period 20.000 [get_ports clk]
# 引脚约束
set_property PACKAGE_PIN W5 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property PACKAGE_PIN U18 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property PACKAGE_PIN V17 [get_ports led]
set_property IOSTANDARD LVCMOS33 [get_ports led]

注意:引脚编号需根据具体板卡原理图填写。时钟周期 = 1/频率(50MHz 对应 20ns)。

常见坑与排查

  • :未创建时钟约束,导致时序分析不准确。

    排查:综合后查看“Report Timing Summary”,确认时钟已定义。

  • :IOSTANDARD 不匹配,导致上板后信号异常。

    排查:查阅板卡原理图,确认对应 bank 的电压标准。

阶段四:验证

添加仿真测试文件(如“tb_top.v”),验证功能:

module tb_top;
    reg clk, rst_n;
    wire led;
    top uut (.clk(clk), .rst_n(rst_n), .led(led));
    initial begin
        clk = 0;
        forever #10 clk = ~clk; // 50MHz
    end
    initial begin
        rst_n = 0;
        #100 rst_n = 1;
        #200_000_000 $stop;
    end
endmodule

运行仿真,观察 led 信号是否每 1 秒翻转一次。

常见坑与排查

  • :仿真时间不够,未看到翻转。

    排查:延长仿真时间(如 #2_000_000_000)。

  • :仿真器未正确编译库。

    排查:检查 Vivado Simulator 设置,确保器件库已加载。

阶段五:上板

综合、实现、生成比特流后,连接开发板,点击“Open Hardware Manager” → “Auto Connect” → “Program Device”选择比特流文件下载。若 LED 以 1Hz 闪烁,则成功。

常见坑与排查

  • :驱动未安装,无法识别设备。

    排查:安装 Digilent Adept 或 Vivado 自带的 Cable Drivers。

  • :比特流下载后无反应。

    排查:检查约束中引脚是否正确;使用示波器或万用表测量时钟引脚。

原理与设计说明

为什么使用计数器分频而非 PLL?计数器分频实现简单,资源占用低(仅需寄存器),适合低频闪烁。但缺点是无法产生精确的 50% 占空比(除非使用偶数分频)。对于 LED 闪烁,占空比要求不严格,因此计数器方案更优。

为什么复位信号使用低有效?许多 FPGA 板卡复位按键默认输出低电平,低有效复位可避免额外反相器,节省资源。但若板卡复位是高有效,则需在代码中修改敏感列表。

关键 trade-off:资源 vs Fmax。本设计仅使用 2 个寄存器(cnt 和 led),综合后 Fmax 可达数百 MHz,远高于 50MHz 需求,因此无需优化。若设计复杂,需关注时序收敛。

验证与结果

指标测量值条件
LUT 使用32Vivado 2023.1,Artix-7
FF 使用26同上
Fmax625 MHz仅含分频逻辑
LED 闪烁频率1.000 Hz50MHz 时钟,分频值 50,000,000
仿真波形led 每 1 秒翻转Vivado Simulator

测量条件:Vivado 2023.1,目标器件 xc7a35tcsg324-1,综合策略默认。

故障排查(Troubleshooting)

  • 现象:综合报错“ERROR: [Synth 8-439] module ‘top’ not found”。

    原因:源文件未正确添加或文件名与模块名不匹配。

    检查点:检查 Sources 面板中是否包含 top.v;验证模块名与文件名一致。

    修复建议:重新添加文件,或修改模块名。

  • 现象:实现后时序报告显示“Timing violation”。

    原因:时钟约束不正确或设计路径过长。

    检查点:查看“Report Timing Summary”中的 slack 值;确认时钟周期是否匹配。

    修复建议:调整约束,或优化设计(如插入流水线)。

  • 现象:比特流下载失败,提示“Device not found”。

    原因:JTAG 驱动未安装或连接不良。

    检查点:检查设备管理器是否识别;尝试重新插拔 USB 线。

    修复建议:安装 Vivado 驱动(Cable Drivers)或使用 Digilent Adept。

  • 现象:上板后 LED 常亮或不亮。

    原因:引脚约束错误或代码逻辑有误。

    检查点:核对 XDC 中 PACKAGE_PIN 是否与原理图一致;仿真验证逻辑。

    修复建议:修正约束或修改代码。

  • 现象:仿真中 led 信号为 X(未知)。

    原因:未初始化复位或时钟未正确生成。

    检查点:检查 testbench 中 clk 和 rst_n 是否赋值。

    修复建议:在 initial 块中初始化寄存器。

  • 现象:综合时出现“Critical Warning: [Constraints 18-621]”。

    原因:约束文件缺失或语法错误。

    检查点:查看 Tcl Console 中的具体警告信息。

    修复建议:修正约束语法,或重新生成 XDC。

  • 现象:实现时间过长(>5 分钟)。

    原因:设计复杂或综合策略过于保守。

    检查点:检查设计是否包含大量组合逻辑。

    修复建议:简化设计,或调整综合策略为“Optimize for Speed”。

  • 现象:Vivado 崩溃或无响应。

    原因:内存不足或工程文件损坏。

    检查点:检查系统资源使用情况。

    修复建议:关闭其他程序,重启 Vivado;若仍失败,重新创建工程。

扩展与下一步

  • 参数化设计:使用 parameter 定义分频值,方便调整闪烁频率。
  • 带宽提升:改用 PLL 产生精确时钟,实现更高频率。
  • 跨平台:将代码移植到 Vivado 的 Zynq 系列,结合 ARM 处理器控制 LED。
  • 加入断言:在仿真中添加 SVA 断言,自动检查 led 翻转时序。
  • 覆盖验证:使用功能覆盖组统计计数器值范围,确保所有状态被测试。
  • 形式验证:使用 Vivado 的 formal 工具验证分频逻辑的正确性。

参考与信息来源

  • Xilinx UG892: Vivado Design Suite User Guide: Design Flows Overview
  • Xilinx UG903: Vivado Design Suite User Guide: Using Constraints
  • Digilent Arty A7-35T Reference Manual (引脚定义)
  • Vivado 内置教程:Help → Documentation and Tutorials

技术附录

术语表

  • RTL:寄存器传输级,描述数字电路行为。
  • XDC:Xilinx Design Constraints,约束文件格式。
  • 比特流:FPGA 配置数据文件(.bit)。
  • 综合:将 RTL 代码转换为门级网表。
  • 实现:包括布局布线,生成最终配置。

检查清单

    [ ] 工程路径无中文/空格 [ ] 源文件模块名与文件名一致 [ ] 约束文件包含时钟和引脚定义 [ ] 仿真验证功能正确 [ ] 综合无严重错误 [ ] 实现后时序收敛 [ ] 比特流下载成功,上板现象符合预期

关键约束速查

# 时钟约束(50MHz)
create_clock -name sys_clk -period 20.

分类
技术分享
标签
fpgaVerilogVivado
浏览 60
分享:

相关推荐

同频道 · 相近分类

暂无相关推荐

作者

FPGA小白查看主页

同分类阅读

文章

延伸阅读与实操

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

探索全站