Quick Start
- 步骤一:访问竞赛官网(如全国大学生FPGA竞赛、研电赛等),下载2026年赛题列表与评分细则。
- 步骤二:选择1-2个与自身技术栈匹配的赛题方向(如数字信号处理、图像加速、通信基带)。
- 步骤三:在Xilinx/AMD Vitis或Intel Quartus Prime中创建空白工程,目标器件选为竞赛指定型号(如XC7K325T或5CSXFC6D6F31)。
- 步骤四:编写顶层模块框架,包含时钟/复位、输入输出接口(如HDMI、UART、以太网)。
- 步骤五:实现核心算法模块(如FFT、卷积、FIR滤波器),用仿真验证功能正确性。
- 步骤六:综合、实现、生成比特流,下载到FPGA开发板,观察LED或串口输出验证基本通路。
- 步骤七:对照评分标准逐项测试,记录资源占用(LUT/BRAM/DSP)与最大频率(Fmax)。
- 步骤八:撰写设计报告,包含架构图、时序分析、资源表与创新点说明。
前置条件与环境
| 项目/推荐值 | 说明 | 替代方案 |
|---|---|---|
| 器件/板卡 | Xilinx Kintex-7 (XC7K325T) 或 Intel Cyclone V SoC (5CSXFC6D6F31) | Artix-7 / Zynq-7000 / Agilex 7 |
| EDA版本 | Vivado 2024.2 / Quartus Prime Pro 23.4 | ISE 14.7(仅支持老器件) |
| 仿真器 | Vivado Simulator / ModelSim SE-64 2024.1 | Questa / VCS |
| 时钟/复位 | 板载50MHz晶振,全局异步复位(低有效) | PLL倍频至200MHz |
| 接口依赖 | HDMI输出(TMDS编码)、UART(115200波特率)、千兆以太网(RGMII) | USB 3.0 / PCIe Gen2 |
| 约束文件 | XDC(Vivado)或SDC(Quartus),包含时钟周期、输入输出延迟、false path | 自动约束(不推荐) |
| 操作系统 | Windows 10/11 64-bit 或 Ubuntu 22.04 LTS | CentOS 7(已停止维护) |
目标与验收标准
- 功能点:核心算法模块(如FFT、卷积、图像滤波)输出与Matlab参考模型误差<1%
- 性能指标:数据吞吐率≥100 MB/s(对应800 Mbps链路),处理延迟<1 ms
- 资源占用:LUT使用率≤60%,BRAM≤80%,DSP≤70%(以XC7K325T为参考)
- Fmax:全局时钟频率≥150 MHz(示例值,以实际时序报告为准)
- 验收方式:上板运行后,通过串口打印“PASS”或HDMI显示测试图案,示波器测量关键信号满足时序
实施步骤
工程结构
- 创建顶层目录:
fpga_contest_project/,内含src/(RTL)、sim/(testbench)、constr/(约束)、ip/(IP核)、doc/(报告) - 命名规范:模块名小写加下划线(如
fft_engine.v),信号名小写,寄存器加_r后缀,连线加_w后缀 - 版本控制:使用Git管理,每个功能分支(feature/fft, feature/hdmi)独立提交
关键模块:FFT加速器(示例)
module fft_engine #(
parameter N = 64, // FFT点数
parameter DATA_WIDTH = 16 // 数据位宽
)(
input wire clk,
input wire rst_n,
input wire start,
input wire signed [DATA_WIDTH-1:0] din_re,
input wire signed [DATA_WIDTH-1:0] din_im,
output reg done,
output reg signed [DATA_WIDTH-1:0] dout_re,
output reg signed [DATA_WIDTH-1:0] dout_im
);
// 内部状态机与蝶形运算
reg [2:0] state;
reg [5:0] addr;
// ... 省略内部逻辑
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state <= 0;
done <= 0;
end else begin
case (state)
0: if (start) state <= 1;
1: begin
// 蝶形运算
state <= 2;
end
2: begin
done <= 1;
state <= 0;
end
default: state <= 0;
endcase
end
end
endmodule逐行说明
- 第1行:定义模块名
fft_engine,使用Verilog-2001语法,#(parameter ...)实现参数化设计,方便后续调整FFT点数与位宽。 - 第2行:
N = 64为默认FFT点数,竞赛中常用64/128/256点;DATA_WIDTH = 16为定点数位宽,平衡精度与资源。 - 第3行:端口声明,
input wire为默认类型,output reg表示在always块内赋值。 - 第4-5行:
din_re和din_im为输入实部与虚部,使用signed类型支持有符号数运算。 - 第6-7行:
done为完成标志,dout_re/dout_im为输出结果。 - 第10行:状态机定义,
state用3位寄存器,支持最多8个状态;addr为地址计数器。 - 第13-16行:异步复位,低有效(
!rst_n),复位时状态机回到IDLE。 - 第17-28行:状态机跳转,状态0等待start信号,状态1执行蝶形运算(此处省略具体乘法器),状态2输出done并回到IDLE。
- 注意:实际蝶形运算需例化复数乘法器与旋转因子ROM,本示例仅展示框架。
时序/CDC/约束
- 时钟约束:
create_clock -period 6.667 -name sys_clk [get_ports clk](对应150MHz) - 输入延迟:
set_input_delay -clock sys_clk -max 2.0 [get_ports din_*] - 输出延迟:
set_output_delay -clock sys_clk -max 1.5 [get_ports dout_*] - 跨时钟域(CDC):若使用多时钟(如PLL输出),对跨时钟域信号做两级同步或异步FIFO,添加
set_false_path -from [get_clocks clk_a] -to [get_clocks clk_b] - 常见坑:忘记约束复位信号(
set_false_path -to [get_ports rst_n])导致时序违例。
验证
- 编写testbench,使用
$readmemh加载测试向量(如正弦波采样值),例化FFT模块。 - 仿真时长:至少包含10次FFT启动,检查done信号与输出数据。
- 对比Matlab:将仿真输出写入文本文件,用Matlab
fft()计算参考值,误差<1%视为通过。 - 常见坑:未初始化内部寄存器导致仿真出现X态,需在复位逻辑中赋初值。
上板
- 生成比特流后,使用硬件管理器下载,观察LED闪烁频率是否符合预期(如1Hz)。
- 通过UART发送指令(如0xAA)触发FFT计算,接收计算结果并校验。
- 常见坑:未正确配置I/O标准(如LVCMOS33 vs LVDS)导致信号无法驱动。
原理与设计说明
竞赛选题的核心矛盾在于:创新性(加分项)与可实现性(基本盘)的平衡。许多团队追求复杂算法(如深度学习加速器),却因资源超限或时序不收敛而无法上板。建议遵循“80/20法则”:80%精力保证基础功能正确,20%精力用于创新点(如流水线优化、低功耗设计)。
为什么选择FFT作为示例?因为FFT是数字信号处理的基础,广泛应用于通信(OFDM)、图像(频域滤波)和雷达(脉冲压缩)。其设计思路可迁移至其他模块:参数化(适应不同点数)、流水线(提高吞吐率)、定点量化(控制误差)。
关键trade-off:



