FPGA 连续实战 · 02 板卡配置与约束编写

把物理引脚、电气标准、主时钟和异步按钮边界变成可审查的工程输入。

先修知识掌握同步 RTL、非阻塞赋值与 FIFO;按六章顺序完成前置交付。

适用环境Basys 3 / xc7a35tcpg236-1 / 100 MHz;Vivado Tcl 参考 2024.1;Python 3、Icarus Verilog。

验证状态RTL 正常与故障仿真已验证;Vivado 综合、实现、下载和 ILA 采集须在目标环境验证。

本文目录从实物到时序模型逐项理解完整 XDC冻结约束与构建配置典型故障:约束找不到同步器

从实物到时序模型

本教程固定选择 Basys 3 的 Artix-7 器件和一百兆赫板载振荡器,避免抽象配置让初学者随意猜测引脚。下载前仍需核对实物板卡版本、丝印与原理图;其他板卡必须同步修改器件、引脚、电压和时钟周期。代码中的周期并不会改变实际晶振频率,错误地放宽约束只能让报告看似通过。

按钮与 LED 的异步例外有明确端点,内部逻辑仍受主时钟约束。板卡原理图器件 / Bank 电压XDC引脚 / 10 ns同步器仅首级异步入口时序分析内部路径完整覆盖约束描述真实硬件,而不是替代真实硬件
按钮与 LED 的异步例外有明确端点,内部逻辑仍受主时钟约束。(原创示意,非器件引脚图;窄屏可横向滑动)

逐项理解完整 XDC

主时钟绑定顶层 clk,按钮绑定 btnC,两盏 LED 对应完成和失败状态。按钮异步输入只切到第一级同步寄存器的 D 端,第二级同步器和后续逻辑仍分析时序。LED 是人眼观察输出,没有外部同步接收器,因此设置输出例外;将来接入同步总线时必须重新建立真实的输入输出延时,不能照搬这一处理。

工程检查与预期结果
端口引脚 / 电气 / 用途
clkW5 / LVCMOS33 / 100 MHz
btnCU18 / LVCMOS33 / 高电平复位请求
led[0]U16 / LVCMOS33 / done
led[1]E19 / LVCMOS33 / fail

仅适用于已核对的 Basys 3;不得用于未知板卡。

tcl
# Reference: Digilent Basys-3-Master.xdc (rev B reference).
# ONLY use after matching the actual board schematic and bank voltage.
set_property PACKAGE_PIN W5 [get_ports clk]
set_property PACKAGE_PIN U18 [get_ports btnC]
set_property PACKAGE_PIN U16 [get_ports {led[0]}]
set_property PACKAGE_PIN E19 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {clk btnC led[*]}]
create_clock -name sys_clk -period 10.000 [get_ports clk]

# Asynchronous human button: exempt ONLY the first synchronizer D endpoint.
set first_stage [get_pins -hier -filter {NAME =~ *u_reset/btn_meta_reg/D}]
if {[llength $first_stage] != 1} {error "FPGA_XDC: first synchronizer endpoint is missing or ambiguous"}
set_false_path -from [get_ports btnC] -to $first_stage
# Human-viewed status LEDs are not sampled by an external synchronous receiver.
set_false_path -to [get_ports {led[0] led[1]}]
# No broad exception between synchronizer stages or on internal FIFO paths.

冻结约束与构建配置

prepare 会复制 RTL、XDC 和 Tcl 到独立构建目录,并计算输入摘要及八位十六进制 BUILD_ID。后续阶段使用冻结副本,修改副本会被拒绝;调整源文件后请创建新名称。这里的编号用于追踪工程版本,不代表功能合格,也不能代替完整文件哈希,发布清单仍保存 SHA-256。

  1. 核对硬件

    预期与判定:实物为目标 Basys 3,器件与供电标准一致。

  2. 审查时钟

    预期与判定:主时钟 10 ns,所有内部逻辑由同一时钟驱动。

  3. 冻结输入

    预期与判定:生成 baseline 目录,保存 manifest.json。

  4. 检查例外

    预期与判定:首级同步器匹配恰好一个端点,LED 例外仅限两个输出。

在解压后的 fpga-course 目录执行;Vivado 步骤需本机安装并配置 PATH。

bash
python3 flow.py prepare baseline --ila
# FPGA_PREPARED name=baseline BUILD_ID=<实际摘要> ila=True fault=False
cat build/baseline/manifest.json
cat build/baseline/config.tcl
# set build_id <实际八位十六进制值>
# set enable_ila 1
# set inject_error 0

典型故障:约束找不到同步器

综合网表名称可能随综合选项或 RTL 层级改变,空集合约束会悄悄遗漏真正的异步边界。本工程显式检查首级寄存器端点数量,不符合预期即中止。遇到此错误应打开综合网表核对实际层级,再精确修正查询;不要把通配范围扩大到所有寄存器,更不能把整个按钮相关逻辑全部切成假路径。

完成检查

  • 器件、四个引脚与电气标准经过实物核对。
  • BUILD_ID 与冻结输入清单已保存。
  • 按钮首级和 LED 例外都有明确理由。

延伸阅读与来源

本文为黄河电子原创教学说明。产品命令与支持范围请以实际安装版本的官方文档为准。

继续阅读

FPGA

从 RTL 到板上运行的完整流程

建立约束、实现、下载与观测的最小工程闭环。

10 分钟
FPGA

第一个工程的引脚与时钟约束

区分电气连接与时间要求,避免“能生成位流就算正确”。

11 分钟
FPGA

如何读懂时序报告

从起点、终点、时钟和裕量找出失败路径的原因。

10 分钟