Quick Start
- 确定选题方向:根据自身能力与时间,从数字钟(基础)、DDS信号发生器(进阶)、CNN加速器(高阶)中选择一个。
- 安装开发环境:下载Vivado(推荐2019.1或更高版本)并安装对应器件库(如XC7A35T)。
- 购买或申请开发板:推荐Nexys 4 DDR或Basys 3(Xilinx Artix-7系列),或国产EG4S20。
- 创建Vivado工程:选择对应器件,添加Verilog/VHDL源文件,设置约束文件(XDC)。
- 编写顶层模块:例化所有子模块,连接时钟、复位、输入输出端口。
- 编写测试激励(Testbench):使用$display或仿真波形验证功能正确性。
- 运行行为仿真:在Vivado Simulator或ModelSim中运行仿真,检查波形是否与预期一致。
- 综合与实现:运行Synthesis和Implementation,检查资源利用率与时序是否满足(Setup Slack > 0)。
- 生成比特流并下载:生成.bit文件,通过JTAG下载到开发板。
- 上板验证:观察LED、数码管、VGA输出或串口打印,确认功能正常。
前置条件与环境
在开始项目之前,请确保已准备以下工具与资源。下表列出了推荐配置与可选替代方案。
| 项目 | 推荐值 | 说明 | 替代方案 |
|---|---|---|---|
| 器件/板卡 | Xilinx Artix-7 XC7A35T(Nexys 4 DDR) | 主流学习平台,资源充足 | Altera Cyclone IV / 国产EG4S20 |
| EDA版本 | Vivado 2019.1 或更高 | 支持Artix-7系列 | Quartus Prime 18.1 / Gowin IDE |
| 仿真器 | Vivado Simulator(内置) | 集成在Vivado中,无需额外安装 | ModelSim / QuestaSim / Verilator |
| 时钟/复位 | 100MHz板载时钟,高电平有效复位 | 典型配置,易于同步设计 | 50MHz晶振,低电平复位(需调整约束) |
| 接口依赖 | UART(USB转串口)、VGA、PMOD | 基础外设,适合验证 | HDMI(需IP核)、以太网(需MAC核) |
| 约束文件 | XDC文件(引脚分配与时钟周期约束) | Vivado标准格式 | SDC文件(Altera) |
目标与验收标准
毕业设计完成的标准如下,请根据选题类型对照验收。
- 功能点:数字钟需实现时、分、秒显示,可手动校时;DDS需输出正弦波/方波,频率可调;CNN加速器需完成MNIST手写数字识别,准确率≥90%。
- 性能指标:数字钟无时序要求;DDS最高输出频率≥10MHz(100MHz系统时钟);CNN加速器帧率≥60fps(图像尺寸28×28)。
- 资源与Fmax:数字钟资源占用<100个LUT,Fmax无要求;DDS资源占用<500个LUT,Fmax≥100MHz;CNN加速器资源占用<5000个LUT,Fmax≥50MHz。
实施步骤
以下步骤以数字钟为例,DDS与CNN加速器可参照类似流程,仅在模块设计部分有所不同。
- 模块划分:将数字钟拆分为时钟分频器、计数器(时/分/秒)、按键消抖模块、数码管驱动模块。每个模块独立编写Verilog代码。
- 编写分频器:将100MHz系统时钟分频至1Hz,用于秒计数。使用计数器实现,注意复位逻辑。
- 实现计数器:秒计数器模60,分计数器模60,时计数器模24。每个计数器带使能信号和进位输出。
- 按键校时:添加两个按键,分别用于调整小时和分钟。按键输入需经过消抖处理(延时约20ms)。
- 数码管显示:将时、分、秒值转换为七段码,通过动态扫描方式驱动4位或6位数码管。
- 顶层连接:在顶层模块中例化所有子模块,连接时钟、复位、按键、数码管端口。
- 编写Testbench:模拟时钟和按键输入,检查计数器是否正常进位,数码管输出是否正确。
- 仿真验证:运行行为仿真,观察波形中秒计数器是否每1秒加1,分计数器是否每60秒加1。
- 综合与实现:运行Synthesis,检查资源利用率;运行Implementation,确保时序收敛(Setup Slack > 0)。
- 下载与上板:生成比特流,通过JTAG下载到开发板,观察数码管显示是否正常,按键校时是否有效。
验证结果
验证结果应记录以下内容:
- 仿真波形:截图保存关键波形,如秒计数器从59跳变到0时,分计数器加1。
- 上板照片/视频:记录数码管显示的时间,以及按键校时前后的变化。
- 资源报告:从Vivado中导出资源利用率表,确认LUT、FF、IO等使用量。
- 时序报告:检查Setup Slack和Hold Slack,确保均为正值。
排障指南
- 数码管不显示或显示乱码:检查扫描时钟频率是否合适(通常1kHz~10kHz),以及七段码映射表是否正确。
- 按键无反应:确认消抖模块的延时参数是否合理,以及按键电平是否与复位逻辑匹配。
- 仿真结果与预期不符:检查Testbench中时钟周期是否设置正确,以及模块间连接是否遗漏。
- 时序不收敛:优化关键路径,减少组合逻辑级数;或降低时钟频率(如从100MHz改为50MHz)。
扩展方向
完成基础数字钟后,可尝试以下扩展:
- 增加闹钟功能:添加比较器,当时间匹配时驱动蜂鸣器。
- 使用VGA显示:将时间信息叠加到VGA画面中,提升视觉效果。
- 连接RTC模块:通过I2C接口与外部RTC芯片通信,实现掉电保持时间。
- 升级为DDS信号发生器:替换计数器模块为相位累加器,配合查找表输出波形。
参考资源
- Xilinx Vivado官方文档:UG900(Vivado Logic Simulation)
- 《FPGA数字电子系统设计与实践》——王建农
- Nexys 4 DDR原理图与约束文件(Digilent官网)
- Verilog HDL语法参考:IEEE Std 1364-2005
附录
附录A:数字钟顶层模块示例代码(Verilog)
module digital_clock (
input clk, // 100MHz
input rst_n, // 低电平复位
input btn_hour, // 校时按键
input btn_min, // 校分按键
output [6:0] seg, // 七段码
output [3:0] an // 位选
);
wire clk_1hz;
wire [5:0] sec, min;
wire [4:0] hour;
// 实例化子模块
clk_div #(.DIV(100_000_000)) u_div (.clk(clk), .rst_n(rst_n), .clk_out(clk_1hz));
counter_mod60 u_sec (.clk(clk_1hz), .rst_n(rst_n), .en(1'b1), .q(sec), .co(sec_co));
// ... 其他模块
endmodule附录B:常见错误代码与修正
- 错误:always块中同时使用阻塞赋值和非阻塞赋值 → 修正:统一使用非阻塞赋值(<=)
- 错误:组合逻辑中遗漏敏感信号列表 → 修正:使用always @(*)
- 错误:未定义输入输出端口方向 → 修正:在模块声明中明确input/output



