FPGA 连续实战 · 02 板卡配置与约束编写
把物理引脚、电气标准、主时钟和异步按钮边界变成可审查的工程输入。
先修知识掌握同步 RTL、非阻塞赋值与 FIFO;按六章顺序完成前置交付。
适用环境Basys 3 / xc7a35tcpg236-1 / 100 MHz;Vivado Tcl 参考 2024.1;Python 3、Icarus Verilog。
验证状态RTL 正常与故障仿真已验证;Vivado 综合、实现、下载和 ILA 采集须在目标环境验证。
从实物到时序模型
本教程固定选择 Basys 3 的 Artix-7 器件和一百兆赫板载振荡器,避免抽象配置让初学者随意猜测引脚。下载前仍需核对实物板卡版本、丝印与原理图;其他板卡必须同步修改器件、引脚、电压和时钟周期。代码中的周期并不会改变实际晶振频率,错误地放宽约束只能让报告看似通过。
逐项理解完整 XDC
主时钟绑定顶层 clk,按钮绑定 btnC,两盏 LED 对应完成和失败状态。按钮异步输入只切到第一级同步寄存器的 D 端,第二级同步器和后续逻辑仍分析时序。LED 是人眼观察输出,没有外部同步接收器,因此设置输出例外;将来接入同步总线时必须重新建立真实的输入输出延时,不能照搬这一处理。
| 端口 | 引脚 / 电气 / 用途 |
|---|---|
| clk | W5 / LVCMOS33 / 100 MHz |
| btnC | U18 / LVCMOS33 / 高电平复位请求 |
| led[0] | U16 / LVCMOS33 / done |
| led[1] | E19 / LVCMOS33 / fail |
仅适用于已核对的 Basys 3;不得用于未知板卡。
# 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。
- 核对硬件
预期与判定:实物为目标 Basys 3,器件与供电标准一致。
- 审查时钟
预期与判定:主时钟 10 ns,所有内部逻辑由同一时钟驱动。
- 冻结输入
预期与判定:生成 baseline 目录,保存 manifest.json。
- 检查例外
预期与判定:首级同步器匹配恰好一个端点,LED 例外仅限两个输出。
在解压后的 fpga-course 目录执行;Vivado 步骤需本机安装并配置 PATH。
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 例外都有明确理由。
延伸阅读与来源
本文为黄河电子原创教学说明。产品命令与支持范围请以实际安装版本的官方文档为准。
- Digilent Basys 3 Master XDC
板卡引脚参考;使用前核对实物版本。
- AMD UG906 · Check Timing
区分内部未约束路径与异步外部端口。
- AMD UG908 · Programming and Debugging
Hardware Manager、ILA 与采集窗口。
继续阅读
FPGA从 RTL 到板上运行的完整流程
建立约束、实现、下载与观测的最小工程闭环。
第一个工程的引脚与时钟约束
区分电气连接与时间要求,避免“能生成位流就算正确”。
如何读懂时序报告
从起点、终点、时钟和裕量找出失败路径的原因。
黄河电子