Quick Start
- 确认竞赛平台:例如 Xilinx PYNQ 或 Altera DE 系列,并安装对应 EDA 工具(Vivado 2022.2 或 Quartus Prime 22.1)。
- 创建空白工程:选择目标器件,如 XC7Z020-1CLG484C。
- 编写顶层模块(Top.v):例化竞赛要求的标准接口,如 UART、HDMI、DDR3。
- 添加时钟约束与复位同步器:使用
create_clock -period 10.000 [get_ports clk]约束,并实现两级触发器同步复位。 - 运行综合(Synthesis):检查无严重警告,如 Latch inferred。
- 运行实现(Implementation):查看时序报告,确保 Setup/Hold slack > 0。
- 生成比特流并下载:通过串口终端(115200 baud)验证 “Hello World” 输出。
- 验收:LED 以 1Hz 闪烁,串口每 1 秒打印一次 “Design OK”。
前置条件与环境
为确保流程可复现,建议按以下配置准备开发环境:
| 项目 | 推荐值 | 说明 | 替代方案 |
|---|---|---|---|
| 器件/板卡 | Xilinx Zynq-7020 (PYNQ-Z2) | 竞赛常见平台 | Altera Cyclone V SoC (DE10-Nano) |
| EDA 版本 | Vivado 2022.2 (WebPACK 免费) | 支持 Zynq-7000 系列 | Quartus Prime Lite 22.1 |
| 仿真器 | Vivado Simulator (XSim) | 内置于 Vivado | ModelSim SE-64 2020.4 |
| 时钟/复位 | 50MHz 晶振,低电平有效复位 | 标准配置 | 100MHz 晶振 + 时钟分频 |
| 接口依赖 | UART (USB-UART 桥),HDMI 输出 | 验证与显示 | VGA (DAC) + 串口 |
| 约束文件 | XDC 格式,含时钟、I/O 标准(LVCMOS33) | Vivado 原生格式 | SDC 格式 (Quartus) |
| 操作系统 | Windows 10 64-bit / Ubuntu 20.04 | 稳定兼容 | Windows 11 / CentOS 7 |
| RAM/SSD | 16GB RAM, 256GB SSD | 满足综合与实现需求 | 8GB RAM + 机械硬盘(慢) |
目标与验收标准
完成竞赛硬件设计后,应满足以下验收条件:
- 功能点:核心算法模块(如图像边缘检测、FFT)输出正确,与仿真结果一致。
- 性能指标:系统时钟频率 ≥ 100MHz,流水线吞吐率 ≥ 1 sample/cycle。
- 资源占用:LUT ≤ 80%,BRAM ≤ 70%,DSP ≤ 60%(留余量给后期迭代)。
- 时序收敛:Setup slack ≥ 0.5ns,Hold slack ≥ 0.2ns。
- 验收方式:上板后通过 HDMI 输出测试图案,串口打印性能统计数据。
实施步骤
阶段一:工程结构与顶层设计
按模块化原则组织代码,推荐目录结构如下:
src/
├── top.v // 顶层,例化所有外设与核心模块
├── clk_wiz.v // 时钟生成(MMCM/PLL)
├── uart_tx.v // 串口发送
├── core.v // 核心算法(如 Sobel 边缘检测)
├── hdmi_out.v // HDMI 输出驱动
└── ddr_ctrl.v // DDR3 控制器(MIG IP 核)顶层模块必须包含复位同步器,避免异步复位导致亚稳态。示例代码如下:
// 复位同步器(两级触发器)
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
rst_sync1 <= 1'b0;
rst_sync2 <= 1'b0;
end else begin
rst_sync1 <= 1'b1;
rst_sync2 <= rst_sync1;
end
end
assign rst_sync = rst_sync2;此设计确保复位信号与时钟同步,消除亚稳态风险。所有子模块应使用同步复位信号 rst_sync 而非原始 rst_n。
阶段二:核心算法模块设计
以 Sobel 边缘检测为例,核心模块需实现以下功能:
- 输入:8 位灰度像素流,像素时钟与系统时钟同步。
- 处理:3×3 窗口卷积,计算水平和垂直梯度。
- 输出:8 位边缘强度值,流水线延迟 3 个时钟周期。
设计时注意:
- 使用移位寄存器实现行缓冲,避免 BRAM 浪费。
- 卷积运算采用并行乘法器,提升吞吐率。
- 输出结果需经阈值处理(如 > 128 视为边缘),减少噪声。
阶段三:接口与约束集成
完成核心模块后,将其例化到顶层,并添加以下接口约束:
- 时钟约束:
create_clock -period 10.000 -name sys_clk [get_ports clk] - I/O 标准:
set_property IOSTANDARD LVCMOS33 [get_ports {clk rst_n}] - 时序例外:对异步信号(如按键输入)设置
set_false_path。
在 Vivado 中,将约束写入 .xdc 文件,并确保其位于工程约束文件列表中。
阶段四:综合与实现
运行综合后,重点检查以下警告:
- Latch inferred:通常由组合逻辑中缺少 else 分支导致,需补充完整。
- Clock crossing:多时钟域信号未使用同步器,需添加 FIFO 或双触发器。
- Unconnected ports:未连接的模块端口可能导致功能缺失,应检查例化。
实现完成后,查看时序报告:
- Setup slack 应 > 0.5ns,Hold slack 应 > 0.2ns。
- 若时序不收敛,可尝试:降低时钟频率、优化关键路径(如减少组合逻辑级数)、启用综合策略(如 Vivado 的 Performance_Explore)。
阶段五:上板验证
生成比特流后,下载至板卡并执行以下验证:
- 通过串口发送测试指令(如 “start”),观察核心算法输出。
- 使用逻辑分析仪(如 Vivado ILA)捕获内部信号,确认流水线时序正确。
- 对比仿真波形与上板结果,确保一致。
若输出异常,优先检查复位同步器、时钟分频模块及接口电平匹配。
验证结果
完成上述步骤后,应得到以下验证结果:
- 串口输出 “Design OK” 及性能统计(如帧率、延迟)。
- HDMI 显示测试图案(如棋盘格或边缘检测结果)。
- 资源报告显示 LUT ≤ 75%,BRAM ≤ 65%,DSP ≤ 55%,满足余量要求。
- 时序报告显示 Setup slack ≥ 0.5ns,Hold slack ≥ 0.2ns。
排障指南
常见问题及解决方案:
- 综合报错 “Latch inferred”:检查组合逻辑中所有条件分支是否完整,补充 else 或 default 赋值。
- 时序不收敛:降低时钟频率至 80MHz 测试,若收敛则逐步提升;或优化关键路径,如将长组合逻辑拆分为流水线。
- 上板后无输出:检查电源指示灯、JTAG 连接、比特流下载是否正确;用 ILA 捕获时钟信号是否存在。
- 串口数据乱码:确认波特率匹配(115200)、数据位/停止位设置一致;检查 UART 模块时钟分频系数。
扩展建议
在基础设计完成后,可尝试以下扩展:
- 添加 DDR3 缓存,实现高分辨率图像(如 1080p)的实时处理。
- 集成软核处理器(如 MicroBlaze),通过 AXI 总线控制算法参数。
- 实现多算法切换(如 Sobel 与 Canny),通过按键或串口选择。
- 优化功耗:使用时钟门控、降低未使用模块的翻转率。
参考资源
- Xilinx Vivado 用户指南 (UG910)
- PYNQ-Z2 原理图与约束文件(官方 GitHub)
- 《FPGA 设计实战:从入门到竞赛》相关章节
附录:关键代码片段
复位同步器完整实现:
module reset_sync (
input wire clk,
input wire rst_n,
output wire rst_sync
);
reg rst_sync1, rst_sync2;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
rst_sync1 <= 1'b0;
rst_sync2 <= 1'b0;
end else begin
rst_sync1 <= 1'b1;
rst_sync2 <= rst_sync1;
end
end
assign rst_sync = rst_sync2;
endmodule时钟约束示例(.xdc 文件):
create_clock -period 10.000 -name sys_clk [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports {clk rst_n}]
set_property PACKAGE_PIN H16 [get_ports clk]
set_property PACKAGE_PIN G15 [get_ports rst_n]


