Quick Start
- 准备硬件平台:选用 Xilinx Artix-7 系列开发板(如 Nexys Video 或 Basys 3),确保板载 HDMI 输入/输出接口、DDR3 内存以及至少 50K 逻辑单元。
- 安装开发工具:安装 Vivado 2020.1 及以上版本,并配置 Vivado HLS 或 Vitis HLS,用于生成 CNN IP 核。
- 准备模型权重:下载预训练 CNN 模型(如 LeNet-5 或小型 CIFAR-10 模型),将权重转换为 16 位定点数格式(Q4.12),并保存为 .coe 文件。
- 创建 Vivado 工程:新建工程,添加 MicroBlaze 软核作为控制核心,通过 AXI 总线连接自定义 CNN 加速器 IP。
- 编写顶层模块:使用 Verilog 编写顶层模块,实例化 CNN 加速器、帧缓冲控制器(Frame Buffer)和 HDMI 输出控制器。
- 运行综合:执行综合(Synthesis),检查资源利用率(LUT、FF、DSP、BRAM)是否不超过 80%。
- 实现与时序收敛:完成实现(Implementation),确保建立时间和保持时间均无违例。
- 下载与测试:生成比特流并下载到开发板。通过串口终端(115200 波特率)发送 28×28 灰度图像(BMP 格式),观察 HDMI 输出显示的预测类别(0-9 数字)。
- 验证结果:输入手写数字图片“7”,HDMI 屏幕应显示“Predicted: 7”,且置信度高于 90%。
前置条件与环境
下表列出了项目所需的关键硬件、软件及配置要求,并提供替代方案供参考。
| 项目 | 推荐值 | 说明 | 替代方案 |
|---|---|---|---|
| 器件/板卡 | Xilinx Artix-7 XC7A200T(Nexys Video) | 提供充足逻辑资源和 HDMI 接口 | Zynq-7020(PYNQ-Z2),需调整 PS-PL 接口 |
| EDA 版本 | Vivado 2020.1 + Vitis HLS 2020.1 | 确保 IP 核兼容性 | Vivado 2019.2 或 2021.1,需验证 IP 版本 |
| 仿真器 | Vivado Simulator(xsim)或 ModelSim | 用于功能仿真与时序仿真 | QuestaSim,需配置库路径 |
| 时钟/复位 | 系统时钟 100MHz(板载晶振),异步复位低有效 | 稳定时序基础 | 50MHz 或 200MHz,需调整 PLL 配置 |
| 接口依赖 | HDMI 输出(TMDS 编码),UART(115200 波特率) | 图像显示与数据通信 | VGA 输出 + 串口转 USB |
| 约束文件 | XDC 约束:时钟周期 10ns,输入输出延迟 2ns | 保证时序收敛 | 自动约束(Vivado 默认),需手动检查 |
| 内存 | 板载 DDR3 256MB(MT41K128M16) | 存储图像帧与中间结果 | SRAM(容量受限,仅适合小模型) |
| CNN 模型 | LeNet-5(5 层:卷积×2,池化×2,全连接×3) | 经典轻量模型,适合 FPGA 实现 | CIFAR-10 小型 CNN(3 层卷积),需调整参数 |
目标与验收标准
- 功能点:系统能通过 UART 接收 28×28 灰度图像,完成前向推理,输出类别(0-9)并在 HDMI 上显示。
- 性能指标:单帧推理时间 ≤10ms(即帧率 ≥100fps,不含传输延迟)。
- 资源占用:LUT 使用率 ≤80%,FF ≤80%,DSP ≤80%,BRAM ≤80%。
- 精度要求:在 MNIST 测试集上,Top-1 准确率 ≥98%(定点量化后)。
- 验收方法:依次输入 10 张手写数字图片(0-9 各一张),HDMI 显示结果与预期一致,且置信度均 >85%。
实施步骤
步骤 1:硬件平台搭建
确保开发板供电正常,HDMI 输出连接显示器,UART 接口通过 USB 转串口线连接 PC。检查板载晶振频率是否为 100MHz,若不同则需在后续 PLL 配置中调整。
步骤 2:开发环境配置
安装 Vivado 2020.1 及 Vitis HLS 2020.1,并添加设备支持包(如 Artix-7)。验证仿真器(Vivado Simulator)能正常编译 RTL 代码。
步骤 3:CNN 模型定点化与 IP 生成
使用 Python 脚本将预训练 LeNet-5 权重转换为 Q4.12 定点格式(16 位有符号整数,4 位整数位,12 位小数位)。在 Vitis HLS 中编写 CNN 加速器 C++ 代码,使用定点数据类型(ap_fixed)进行运算,综合生成 RTL IP 核。注意:卷积层和全连接层需分别实现流水线优化,以提升吞吐量。
步骤 4:Vivado 工程集成
在 Vivado 中创建 Block Design,添加 MicroBlaze 软核、CNN 加速器 IP(来自步骤 3)、DDR3 控制器(MIG IP)、HDMI 输出控制器(如 Digilent 提供的 IP)以及 AXI 互联模块。连接各模块的 AXI 接口,分配地址映射(如 CNN 加速器基地址 0x44A00000)。
步骤 5:顶层 Verilog 模块编写
编写顶层模块,实例化 Block Design(作为子系统),并添加必要的 I/O 缓冲(如 HDMI 差分输出、UART 引脚)。确保时钟和复位信号正确连接。
步骤 6:综合与资源检查
运行综合,打开综合报告,检查 LUT、FF、DSP、BRAM 使用率。若超过 80%,需优化 CNN 加速器设计(如减少并行度或共享乘法器)。
步骤 7:实现与时序收敛
运行实现,查看时序报告。确保建立时间(setup)和保持时间(hold)无违例。若存在违例,可调整 PLL 输出时钟频率或增加流水线级数。
步骤 8:比特流生成与下载
生成比特流(.bit)并下载到开发板。同时导出硬件描述文件(.xsa),用于 Vitis 软件工程。
步骤 9:软件编写与测试
在 Vitis 中创建软件工程,编写 MicroBlaze 裸机程序:通过 UART 接收图像数据,写入 DDR3 指定地址,启动 CNN 加速器,读取推理结果,并通过 HDMI 显示类别和置信度。编译并下载运行。
验证结果
使用 MNIST 测试集随机选取 100 张图片,通过串口逐一发送,记录 HDMI 显示结果。统计准确率应 ≥98%,单帧推理时间 ≤10ms。若准确率偏低,检查定点量化精度或模型权重转换是否正确。
排障指南
- HDMI 无输出:检查 TMDS 编码 IP 配置,确认时钟频率(像素时钟应为 148.5MHz 或 74.25MHz,取决于分辨率)。
- UART 通信失败:核对波特率设置(115200),检查串口线连接,使用串口调试工具发送 0x55 0xAA 验证回环。
- 推理结果错误:在仿真中比对定点模型与浮点模型输出,确认量化误差在可接受范围(<1%)。
- 时序不收敛:尝试降低 CNN 加速器工作频率(从 100MHz 降至 80MHz),或增加关键路径流水线。
扩展方向
- 支持更大分辨率图像(如 32×32 CIFAR-10),需增加 BRAM 或 DDR 带宽。
- 实现多模型切换(如 LeNet-5 与 AlexNet 小型化版本),通过 MicroBlaze 动态加载权重。
- 集成摄像头输入(如 OV7670),实现实时视频流分类。
参考资源
- Xilinx UG902: Vivado Design Suite User Guide: High-Level Synthesis
- LeCun et al., “Gradient-Based Learning Applied to Document Recognition”, 1998
- Digilent Nexys Video Reference Manual
附录
定点量化脚本示例(Python):
import numpy as np
def float_to_q4_12(weights):
max_val = np.max(np.abs(weights))
scale = 2**11 / max_val # 12位小数,留1位符号
quantized = np.round(weights * scale).astype(np.int16)
return quantized, scaleXDC 约束文件片段:
create_clock -period 10.000 -name sys_clk [get_ports sys_clk_p]
set_input_delay -clock sys_clk 2.0 [get_ports uart_rx]
set_output_delay -clock sys_clk 2.0 [get_ports hdmi_tx_p*]


