Quick Start
- [object Object]
预期结果:串口输出每帧检测到的物体类别(如“person”、“car”)及语音关键词(如“start”、“stop”)。
前置条件与环境
| 项目 | 推荐值说明 | 替代方案 |
|---|---|---|
| 器件/板卡 | 安路 SF1S60G(国产)或高云 GW2A-LV18PG256 | Xilinx Artix-7(需额外适配国产 IP 核) |
| EDA 版本 | Vivado 2025.2 / Anlogic TD 5.0.3 / Gowin IDE 1.9.9 | Vivado 2023.1+(部分 IP 需更新) |
| 仿真器 | Vivado Simulator 或 ModelSim SE-64 2024.1 | QuestaSim 2024.3 |
| 时钟/复位 | 系统时钟 50 MHz(板载晶振),异步复位低有效 | PLL 倍频至 100 MHz(需约束) |
| 接口依赖 | OV5640 摄像头(并行 DVP 接口)+ I2S 麦克风阵列(PDM 接口) | USB 摄像头(需 USB PHY IP) |
| 约束文件 | XDC(Vivado)或 ADC(安路)或 CST(高云),含时钟周期、IO 时序 | 手动编写,参考官方模板 |
目标与验收标准
- 功能点:同时处理摄像头帧(640×480@30 fps)与麦克风音频(16 kHz/16 bit),输出融合后的感知结果(如“前方有人,语音指令:前进”)。
- 性能指标:端到端延迟 ≤ 50 ms(从传感器采集到结果输出),Fmax ≥ 100 MHz,资源占用 ≤ 80% LUT/BRAM。
- 验收方式:仿真波形显示数据流无毛刺;上板后串口每秒输出 ≥ 20 条感知消息;资源报告满足赛题限制。
实施步骤
阶段一:工程结构与顶层设计
- 创建工程:在 Vivado 中新建 RTL 工程,器件选择安路 SF1S60G(需安装安路器件库)。
- 顶层模块划分:
top_multimodal.v包含摄像头采集、音频采集、CNN 加速器、决策融合、UART 输出五个子模块。 - 接口定义:使用 AXI4-Stream 连接各模块,确保数据流标准化。
- 常见坑:忘记添加复位同步器导致亚稳态;未约束时钟域跨域路径。
// top_multimodal.v 顶层模块核心代码
module top_multimodal (
input wire clk_50m, // 50MHz系统时钟
input wire rst_n, // 异步复位,低有效
// 摄像头接口
input wire [7:0] cam_data, // 8位并行数据
input wire cam_vsync, // 帧同步
input wire cam_href, // 行同步
input wire cam_pclk, // 像素时钟
// 麦克风接口
input wire mic_pdm, // PDM数据
input wire mic_clk, // 麦克风时钟(1.5MHz)
// 输出
output wire [7:0] uart_tx // UART输出
);
// 内部连线
wire [23:0] pixel_rgb;
wire frame_valid;
wire [15:0] audio_sample;
wire audio_valid;
wire [7:0] result_id;
// 模块实例化
camera_capture u_cam (
.clk(cam_pclk),
.rst_n(rst_n),
.data_in(cam_data),
.vsync(cam_vsync),
.href(cam_href),
.pixel_out(pixel_rgb),
.frame_valid(frame_valid)
);
audio_capture u_aud (
.clk_50m(clk_50m),
.rst_n(rst_n),
.pdm(mic_pdm),
.mic_clk(mic_clk),
.sample_out(audio_sample),
.valid(audio_valid)
);
cnn_accelerator u_cnn (
.clk(clk_50m),
.rst_n(rst_n),
.pixel_in(pixel_rgb),
.frame_valid(frame_valid),
.result_id(result_id)
);
decision_fusion u_fusion (
.clk(clk_50m),
.rst_n(rst_n),
.vision_id(result_id),
.audio_sample(audio_sample),
.audio_valid(audio_valid),
.uart_data(uart_tx)
);
endmodule逐行说明
- 第 1 行:模块声明,输入输出端口定义,
clk_50m和rst_n是全局时钟与复位。 - 第 2–6 行:摄像头接口信号,
cam_data为 8 位并行数据,cam_vsync指示帧开始,cam_href指示行有效,cam_pclk是像素时钟(通常为 25 MHz)。 - 第 7–9 行:麦克风接口,
mic_pdm是脉冲密度调制数据,mic_clk由 FPGA 提供(1.5 MHz)。 - 第 11 行:内部连线声明,
pixel_rgb为 24 位 RGB 像素,frame_valid指示帧有效,audio_sample为 16 位音频样本,result_id为 CNN 输出类别 ID。 - 第 13–22 行:摄像头采集模块实例化,使用
cam_pclk作为时钟域,输出像素与帧有效信号。 - 第 24–31 行:音频采集模块实例化,使用 50 MHz 时钟域,输出 PDM 解码后的 16 位样本。
- 第 33–38 行:CNN 加速器实例化,处理像素数据,输出识别结果 ID。
- 第 40–47 行:决策融合模块实例化,结合视觉与音频结果,通过 UART 输出。
阶段二:关键模块——CNN 加速器
- 设计思路:采用流水线结构,每层卷积后接 ReLU 与池化,输出特征图尺寸逐步减小。
- 参数化:使用
parameter定义输入通道、卷积核大小、步长,便于适配不同赛题。 - 常见坑:BRAM 资源不足时未使用分布式 RAM;卷积计算未做定点量化导致精度损失。
// cnn_accelerator.v 卷积层核心代码
module conv_layer #(
parameter IN_CH = 3, // 输入通道数
parameter OUT_CH = 16, // 输出通道数
parameter KERNEL = 3, // 卷积核大小
parameter WIDTH = 8 // 数据位宽
) (
input wire clk,
input wire rst_n,
input wire valid_in,
input wire [WIDTH-1:0] data_in [IN_CH-1:0],
output reg [WIDTH-1:0] data_out [OUT_CH-1:0],
output reg valid_out
);
// 权重存储器(BRAM实现)
reg [WIDTH-1:0] weight [OUT_CH-1:0][IN_CH-1:0][KERNEL-1:0][KERNEL-1:0];
// 乘累加流水线
reg [WIDTH*2-1:0] mac_acc [OUT_CH-1:0];
reg [3:0] pipe_cnt;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
for (int o=0; o<OUT_CH; o++) mac_acc[o] <= 0;
pipe_cnt <= 0;
valid_out <= 0;
end else begin
// 流水线控制逻辑(此处省略详细实现)
end
end
endmodule逐行说明
- 第 1 行:模块声明,使用参数化定义输入通道数
IN_CH、输出通道数OUT_CH、卷积核大小KERNEL和数据位宽WIDTH。 - 第 2–6 行:参数定义,默认输入通道为 3(RGB),输出通道为 16,卷积核大小为 3×3,数据位宽为 8 位。
- 第 7–14 行:端口声明,包括时钟
clk、复位rst_n、输入有效标志valid_in、输入数据数组data_in、输出数据数组data_out和输出有效标志valid_out。 - 第 16 行:权重存储器声明,使用 BRAM 实现,维度为 [输出通道][输入通道][卷积核行][卷积核列]。
- 第 18–19 行:乘累加累加器数组
mac_acc和流水线计数器pipe_cnt声明。 - 第 21 行:时序逻辑块,敏感列表为时钟上升沿或复位下降沿。
- 第 22–25 行:复位逻辑,清零所有累加器和流水线计数器,并置输出有效为低。
- 第 26–28 行:正常操作分支,流水线控制逻辑(此处省略详细实现,实际需包含乘累加与输出调度)。
阶段三:验证与排障
- 仿真验证:编写 testbench,注入摄像头测试帧(如 640×480 的 BMP 图像)和麦克风 PDM 测试序列,检查 CNN 输出类别 ID 与预期是否一致。
- 上板调试:使用 ChipScope(Vivado)或 SignalTap(国产工具)抓取关键信号,如
frame_valid、audio_valid、result_id,确认时序无毛刺。 - 常见排障:若串口无输出,检查 UART 波特率配置(默认 115200)与顶层连线;若检测结果错误,检查 CNN 权重初始化是否正确(需从训练模型导出)。
扩展与优化
- 性能优化:对 CNN 层进行流水线深度调整,增加寄存器级数以提升 Fmax;使用 DSP48 原语替代 LUT 实现乘法,降低资源占用。
- 功能扩展:添加多模态融合策略(如加权平均或注意力机制),提升复杂场景下的识别鲁棒性。
- 平台迁移:将设计移植至高云 GW2A 系列时,注意替换原语(如 PLL、BRAM)为高云 IP 核,并调整约束文件格式(CST)。
参考与附录
- 大赛官方模板与文档:请参考大赛官网“资源下载”栏目。
- 安路 TD 工具用户指南:Anlogic TD User Guide v5.0。
- 高云 IDE 用户手册:Gowin Software User Guide v1.9.9。
- CNN 定点量化参考:FPGA-Based CNN Acceleration with Fixed-Point Arithmetic (IEEE Access, 2024)。



