news 2026/5/29 20:08:49

用Verilog在DE2-115上实现一个带暂停/清零的百分秒表(Quartus 13.1完整工程)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Verilog在DE2-115上实现一个带暂停/清零的百分秒表(Quartus 13.1完整工程)

基于DE2-115开发板的百分秒表FPGA实战开发指南

第一次接触FPGA开发时,最令人兴奋的莫过于让硬件真正"动起来"。本文将带您从零开始,在DE2-115开发板上实现一个功能完整的百分秒表,包含暂停和清零功能。不同于教科书式的理论讲解,这里将重点分享实际工程中那些容易踩坑的细节——从Quartus 13.1工程配置到数码管驱动原理,每个步骤都经过真实硬件验证。

1. 工程准备与环境搭建

1.1 Quartus 13.1工程创建要点

在开始编写Verilog代码前,正确的工程配置能避免后续许多麻烦。新建工程时需特别注意:

  • 器件选择:DE2-115开发板搭载的是Cyclone IV EP4CE115F29C7
  • 文件命名规范:建议采用stopwatch_top.v作为顶层文件名,避免中文和特殊字符
  • 仿真工具设置:默认使用ModelSim-Altera,需确保路径不含空格

提示:Quartus 13.1对Windows 10的兼容性需要特别注意,建议以管理员身份运行软件

1.2 开发板硬件资源确认

DE2-115开发板上的关键资源分配如下表所示:

资源类型具体配置本实验用途
时钟源50MHz晶振系统主时钟
数码管共阳极4位时间显示
按键KEY[0]-KEY[3]清零/暂停控制
LEDLEDG[0]-LEDG[7]状态指示

2. 核心模块设计与实现

2.1 精准分频电路设计

DE2-115提供的50MHz时钟需要分频为100Hz驱动百分秒表。传统分频方式存在累积误差,改进方案如下:

module clock_divider ( input wire clk_50m, input wire reset_n, output reg clk_100hz ); reg [31:0] counter; localparam DIVIDER = 500000; // 50MHz/100Hz always @(posedge clk_50m or negedge reset_n) begin if (!reset_n) begin counter <= 0; clk_100hz <= 0; end else if (counter == DIVIDER/2 - 1) begin clk_100hz <= ~clk_100hz; counter <= 0; end else counter <= counter + 1; end endmodule

关键改进点

  • 采用50%占空比分频,确保计时精度
  • 32位计数器设计避免溢出风险
  • 异步复位确保可靠初始化

2.2 可暂停的计数逻辑实现

暂停功能通过控制计数器的使能信号实现,比中断时钟更可靠:

module decimal_counter ( input wire clk, input wire reset_n, input wire pause, output reg [3:0] units, output reg [3:0] tens, output wire carry ); always @(posedge clk or negedge reset_n) begin if (!reset_n) begin units <= 0; tens <= 0; end else if (!pause) begin if (units == 9) begin units <= 0; if (tens == 9) tens <= 0; else tens <= tens + 1; end else units <= units + 1; end end assign carry = (units == 9) && (tens == 9); endmodule

3. 数码管驱动与显示优化

3.1 共阳极数码管驱动原理

DE2-115采用共阳极数码管,与常见开发板有所不同。显示数字"0"的段码对应关系:

段位abcdefg
电平0000001
引脚6543210

对应的Verilog译码器实现:

module seg7_decoder ( input wire [3:0] bcd, output reg [6:0] seg ); always @(*) begin case (bcd) 4'd0: seg = 7'b1000000; 4'd1: seg = 7'b1111001; // ...其他数字编码 default: seg = 7'b1111111; endcase end endmodule

3.2 显示刷新与消隐技术

为避免数码管闪烁,推荐采用扫描刷新方式:

  1. 设计1kHz的刷新时钟
  2. 依次激活每位数码管
  3. 同步输出对应段码
  4. 每位显示保持1ms
module display_scan ( input wire clk, input wire [6:0] seg0, seg1, seg2, seg3, output reg [3:0] anode, output reg [6:0] cathode ); reg [1:0] sel; always @(posedge clk) begin sel <= sel + 1; case (sel) 2'b00: begin anode <= 4'b1110; cathode <= seg0; end // 其他位选择逻辑 endcase end endmodule

4. 系统集成与调试技巧

4.1 顶层模块接口设计

完整系统接口定义示例:

module stopwatch_top ( input wire CLOCK_50, input wire [1:0] KEY, output wire [6:0] HEX0, HEX1, HEX2, HEX3, output wire [7:0] LEDG ); // 内部信号声明 wire clk_100hz; wire [3:0] min_units, min_tens; wire [3:0] sec_units, sec_tens; // 模块实例化 clock_divider u_divider ( .clk_50m(CLOCK_50), .reset_n(KEY[0]), .clk_100hz(clk_100hz) ); // 其他模块连接... endmodule

4.2 常见问题排查指南

实际开发中可能遇到的问题及解决方案:

  1. 数码管显示乱码

    • 检查共阳极/共阴极配置
    • 验证段码顺序是否与硬件匹配
    • 测量各引脚电平是否正常
  2. 计时不准

    • 确认分频系数计算正确
    • 检查时钟约束是否添加
    • 使用SignalTap观察实际时钟波形
  3. 按键抖动问题

    • 添加硬件消抖电路
    • 或在Verilog中实现软件消抖
    • 典型消抖延时20ms为宜

5. 功能扩展与进阶优化

5.1 多模式计时功能实现

通过状态机扩展秒表功能:

typedef enum { MODE_STOP, MODE_RUN, MODE_LAP } stopwatch_mode; module mode_controller ( input wire clk, input wire reset_n, input wire mode_btn, output stopwatch_mode mode ); // 状态转换逻辑... endmodule

5.2 数据存储与回放

利用DE2-115的SDRAM存储计时记录:

  1. 设计存储控制状态机
  2. 分配缓冲区地址空间
  3. 实现读写时序控制
  4. 添加数据校验机制
module record_ctrl ( input wire clk, input wire save_trig, input wire [15:0] time_data, output reg [21:0] sdram_addr, inout wire [15:0] sdram_data ); // SDRAM控制器实现... endmodule

在完成基础功能后,尝试添加这些扩展功能能让项目更具挑战性。实际开发中,建议先通过仿真验证各模块功能,再逐步进行硬件测试。遇到问题时,分段调试往往比整体排查更有效率——可以先单独测试分频器输出,再验证计数器逻辑,最后整合显示部分。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 20:08:38

手把手教你用STM32F103和DAC0832做个信号发生器(附Proteus仿真和Keil代码)

STM32F103与DAC0832打造多功能信号发生器实战指南在电子工程和嵌入式系统开发领域&#xff0c;信号发生器是不可或缺的基础工具。无论是电路测试、教学演示还是产品研发&#xff0c;一个稳定可靠且可自定义的信号源都能极大提升工作效率。本文将带您从零开始&#xff0c;基于ST…

作者头像 李华
网站建设 2026/5/29 20:04:25

从GCC-5到G++-11:手把手教你用CMake管理多版本编译器(附切换脚本)

从GCC-5到G-11&#xff1a;手把手教你用CMake管理多版本编译器&#xff08;附切换脚本&#xff09;在Linux开发环境中&#xff0c;同时维护依赖不同编译器版本的项目是常态。你可能一边要处理遗留系统的GCC-5编译需求&#xff0c;一边又要用G-11开发C20新特性项目。这种场景下&…

作者头像 李华
网站建设 2026/5/29 20:03:14

Apple Silicon Mac双macOS系统安装与配置全攻略

1. 项目概述&#xff1a;为什么要在Apple Silicon Mac上折腾双macOS&#xff1f;如果你手头有一台M1、M2或M3芯片的Mac&#xff0c;大概率是冲着它强悍的性能和超长的续航去的。但用久了&#xff0c;尤其是当你需要处理一些老项目&#xff0c;或者某些专业软件只兼容特定版本的…

作者头像 李华
网站建设 2026/5/29 20:02:36

终极Excel批量搜索神器:3分钟完成100个文件的跨文件查询

终极Excel批量搜索神器&#xff1a;3分钟完成100个文件的跨文件查询 【免费下载链接】QueryExcel 多Excel文件内容查询工具。 项目地址: https://gitcode.com/gh_mirrors/qu/QueryExcel 还在为海量Excel文件中的信息查找而烦恼吗&#xff1f;QueryExcel是一款开源的多Ex…

作者头像 李华
网站建设 2026/5/29 20:01:34

别再用旧U盘了!实测用固态移动硬盘做Win To Go,速度飞起还告别蓝屏

固态移动硬盘 vs 传统U盘&#xff1a;Win To Go性能革命实测指南当你的工作流被U盘Win To Go的卡顿和蓝屏反复打断时&#xff0c;是时候重新审视硬件选择了。我曾在三个不同容量的USB 3.0 U盘上反复折腾WTG系统&#xff0c;直到一次关键演示中的突然蓝屏让我彻底放弃了这种妥协…

作者头像 李华