[FGPA基础学习]分秒计数器的制作
分秒计数器设计
本次实验内容为:DE2-115板子上用 Verilog编程实现一个 分秒计数器,并具备按键暂停、按键消抖功能
一、系统架构设计
-
顶层模块划分
顶层模块(top) ├── 按键消抖模块(key_debounce) ├── 边沿检测模块(edge_detect) ├── 时钟分频模块(clk_divider) ├── 分秒计数器(min_sec_counter) └── 七段译码器(seg7_decoder) -
模块交互逻辑
CLK(50MHz) → 分频 → 1Hz时钟 → 计时模块 KEY → 消抖模块 → 暂停控制 → 计时模块 计时输出 → 数码管显示模块 → 物理数码管
二、核心模块实现
顶层模块
module top(input CLOCK_50, // 50MHz时钟(PIN_Y2)input KEY0, // 复位input KEY1, // 暂停output [0:6] HEX7, HEX6,// 分十位、分个位output [0:6] HEX5, HEX4 // 秒十位、秒个位
);wire clk_1hz; // 1Hz时钟信号
wire key_stable; // 消抖后按键信号
wire pause_trigger; // 边沿检测信号
reg pause_state = 1'b0; // 暂停状态寄存器wire [3:0] min_tens, min_ones;
wire [3:0] sec_tens, sec_ones;// 按键消抖模块(20ms消抖)
debounce #(.DEBOUNCE_MS(20)) debounce_inst(.clk(CLOCK_50),.button_in(~KEY1),.button_out(key_stable)
);// 边沿检测模块
edge_detect edge_inst(.clk(CLOCK_50),.signal_in(key_stable),.edge_out(pause_trigger)
);// 时钟分频模块
clk_divider clk_div_inst(.clk(CLOCK_50),.reset(~KEY0),.pause(pause_state),.clk_out(clk_1hz)
);// 分秒计数器
min_sec_counter counter(.clk(clk_1hz),.reset(~KEY0),.min_tens(min_tens),.min_ones(min_ones),.sec_tens(sec_tens),.sec_ones(sec_ones)
);// 显示译码模块
seg7_decoder hex7(.bcd(min_tens), .seg(HEX7));
seg7_decoder hex6(.bcd(min_ones), .seg(HEX6));
seg7_decoder hex5(.bcd(sec_tens), .seg(HEX5));
seg7_decoder hex4(.bcd(sec_ones), .seg(HEX4));// 暂停状态机
always @(posedge CLOCK_50 or posedge ~KEY0) beginif (~KEY0) pause_state <= 1'b0;else if (pause_trigger) pause_state <= ~pause_state;
endendmodule
时钟分频模块
上次实验提到过:DE2-115开发板配备了一个固定的时钟源。该开发板内置了一个50MHz的晶振,因此对于50MHz的时钟频率,时钟周期为20ns。
module clk_divider(input clk,input reset,input pause,output reg clk_out
);parameter DIV_FACTOR = 26'd49_999_999; // 50MHz→1Hzreg [25:0] cnt;always @(posedge clk or posedge reset) beginif (reset) begincnt <= 0;clk_out <= 0;end else if (!pause) begincnt <= (cnt == DIV_FACTOR) ? 0 : cnt + 1;if (cnt == DIV_FACTOR) clk_out <= ~clk_out;endend
endmodule
按键模块
我选择KEY0做为复位按钮,KEY1作为控制分秒计数器的暂停按钮

DE2-115 提供了四个按钮开关,每个按钮开关都通过一个施 密特触发器进行了去抖动处理。四个施密特触发器的输出信 号,分别为KEY0、KEY1、KEY2、KEY3,直接连接到了Cyclone IV E FPGA。当按钮没有 被按下的时候,它的输出是高电平,按下去则给出一个低电平
module key_debounce #(parameter DEBOUNCE_MS = 20 // 可配置消抖时间
)(input clk,input button_in,output reg button_out
);localparam MAX_COUNT = 50_000_000 * DEBOUNCE_MS / 1000;reg [23:0] cnt;always @(posedge clk) beginif (button_in != button_out) begincnt <= (cnt == MAX_COUNT-1) ? 0 : cnt + 1;if (cnt == MAX_COUNT-1) button_out <= button_in;end else begincnt <= 0;endend
endmodule
边沿检测模块
module edge_detect(input clk,input signal_in,output reg edge_out
);reg signal_delay;always @(posedge clk) beginsignal_delay <= signal_in;edge_out <= signal_in & ~signal_delay; // 上升沿检测end
endmodule
计数器模块
module min_sec_counter(input clk,input reset,output reg [3:0] min_tens,output reg [3:0] min_ones,output reg [3:0] sec_tens,output reg [3:0] sec_ones
);// 秒计数器always @(posedge clk or posedge reset) beginif (reset) beginsec_ones <= 4'd0;sec_tens <= 4'd0;end else beginif (sec_ones == 4'd9) beginsec_ones <= 4'd0;sec_tens <= (sec_tens == 4'd5) ? 4'd0 : sec_tens + 1;end else beginsec_ones <= sec_ones + 1;endendend// 分钟计数器always @(posedge clk or posedge reset) beginif (reset) beginmin_ones <= 4'd0;min_tens <= 4'd0;end else if (sec_tens == 4'd5 && sec_ones == 4'd9) beginif (min_ones == 4'd9) beginmin_ones <= 4'd0;min_tens <= (min_tens == 4'd5) ? 4'd0 : min_tens + 1;end else beginmin_ones <= min_ones + 1;endendend
endmodule
数码管模块
之前提及到过,可以利用38译码器点亮7段数码管(其实只需要7段译码器即可),但是我们的输入情况有9种,所以七段译码器需要将4位BCD码转换为对应的段码;也说过数码管的点亮逻辑:FPGA输出低电压的时候,对应的字码段点亮,反之则熄灭
进行分秒展示,一共要用到4个数码管,为了更直观展示我选择:HEX7,HEX6作为分钟位,HEX5,HEX4做为秒位


| 数码管显示数字 | 需要亮起来的小段 | 对应的7位二进制数 |
|---|---|---|
| 0 | HEX[0]~[5] | 0000001 |
| 1 | HEX[1]~[2] | 1001111 |
| 2 | HEX[0],[1],[3],[4],[6] | 0010010 |
| 3 | HEX[0],[1],[2],[3],[6] | 0000110 |
| 4 | HEX[1].[2].[5],[6] | 1001100 |
| 5 | HEX[0],[2],[3],[5],[6] | 0100100 |
| 6 | HEX[0],[2],[3],[4],[5],[6] | 0100000 |
| 7 | HEX[1]~[3] | 0001111 |
| 8 | HEX[0]~[6] | 0000000 |
| 9 | HEX[0],[1],[2],[3],[5],[6] | 0001000 |
module seg7_decoder(input [3:0] bcd,output reg [6:0] seg
);always @(*) begincase(bcd)4'd0 : seg = 7'b0000_001; // 04'd1 : seg = 7'b1001_111; // 14'd2 : seg = 7'b0010_010; // 24'd3 : seg = 7'b0000_110; // 34'd4 : seg = 7'b1001_100; // 44'd5 : seg = 7'b0100_100; // 54'd6 : seg = 7'b0100_000; // 64'd7 : seg = 7'b0001_111; // 74'd8 : seg = 7'b0000_000; // 84'd9 : seg = 7'b0001_000; // 9default: seg = 7'b1111_111; // 灭endcaseend
endmodule
HEX4~7对应的引脚图如下:


引脚配置:


实现效果:
• 上电后数码管显示00:00并开始计时
• 按下KEY[1]后立即暂停,再次按下恢复
• 复位键KEY[0]可清零计数器
总结:按键边沿检测模块使用双寄存器级联技术捕获有效按键信号,配合FSM状态机实现暂停/恢复功能切换
相关文章:
[FGPA基础学习]分秒计数器的制作
分秒计数器设计 本次实验内容为:DE2-115板子上用 Verilog编程实现一个 分秒计数器,并具备按键暂停、按键消抖功能 一、系统架构设计 顶层模块划分 顶层模块(top) ├── 按键消抖模块(key_debounce) ├…...
【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望
【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望 #微服务实战 #Docker #Kubernetes #SpringSecurity #OAuth2 #分布式事务 #Seata #ServiceMesh #总结 #SpringCloud #SpringBoot 系列终章:经过前九篇 [【深度 Mape 系列】] 的系统学习…...
【商城实战(97)】ELK日志管理系统的全面应用
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想…...
高并发系统下的订单号生成服务设计与实现
目录 引言 订单号设计的关键考量因素 基础需求分析 唯一性保障 数据量预估 可读性设计 系统架构考量 分库分表兼容 可扩展性设计 技术选型与比较 性能优化 高可用性保障 实践案例:高并发系统订单号结构设计 结构详解 业务类型标识(2位) 唯一标识部分…...
每日算法-250329
记录今天学习的三道算法题:两道滑动窗口和一道栈的应用。 2904. 最短且字典序最小的美丽子字符串 题目描述 思路 滑动窗口 解题过程 题目要求找到包含 k 个 ‘1’ 的子字符串,并且需要满足两个条件: 最短长度:在所有包含 k 个 …...
向量数据库学习笔记(2) —— pgvector 用法 与 最佳实践
关于向量的基础概念,可以参考:向量数据库学习笔记(1) —— 基础概念-CSDN博客 一、 pgvector简介 pgvector 是一款开源的、基于pg的、向量相似性搜索 插件,将您的向量数据与其他数据统一存储在pg中。支持功能包括&…...
蓝桥杯 之 二分
文章目录 习题肖恩的n次根分巧克力2.卡牌 二分是十分重要的一个算法,常常用于求解一定范围内,找到满足条件的边界值的情况主要分为浮点数二分和整数二分二分问题,最主要是写出这个check函数,这个check函数最主要就是使用模拟的方法…...
从零开始研发GPS接收机连载——18、北斗B1的捕获和跟踪
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 从零开始研发GPS接收机连载——18、北斗B1的捕获和跟踪 B1信号的捕获B1信号的跟踪 前面已经验证了射频能够接收到B1的信号,通过FPGA采集了IQ信号之后能够通过matl…...
sqlalchemy:将mysql切换到OpenGauss
说明 之前python的项目使用的mysql,近期要切换到国产数据库OpenGauss。 之前的方案是fastapisqlalchemy,测试下来发现不用改代码,只要改下配置即可。 切换方案 安装openGauss-connector-python-psycopg2 其代码工程在:https:…...
memtest86检测内存
上次在R730安装万兆网卡的时候,使用过memtest64进行测试。这个操作肯定是有用的,我就用这个方法查出有问题的内存条,及时找商家进行了更换。 但是该方案有个问题,只能锁定部分内存,如下图,只测试到了23G左…...
OpenCV图像拼接(10)用于实现图像拼接过程中的时间流逝(timelapse)效果的一个类cv::detail::Timelapser
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::Timelapser 是 OpenCV 库中用于实现图像拼接过程中的时间流逝(timelapse)效果的一个类。它通常用于将一系列…...
验证linux多进程时间片切换的程序
一、软件需求 在同时运行一个或多个一味消耗 CPU 时间执行处理的进程时,采集以下统计信息。 ・在某一时间点运行在逻辑 CPU 上的进程是哪一个 ・每个进程的运行进度 通过分析这些信息,来确认本章开头对调度器的描述是否正确。实验程序的…...
【Basys3】外设-灯和数码管
灯 约束文件 set_property PACKAGE_PIN W5 [get_ports CLK] set_property PACKAGE_PIN U18 [get_ports rst] set_property PACKAGE_PIN U16 [get_ports {led[0]}] set_property PACKAGE_PIN E19 [get_ports {led[1]}] set_property PACKAGE_PIN U19 [get_ports {led[2]}] set…...
axios文件下载使用后端传递的名称
java后端通过HttpServletResponse 返回文件流 在Content-Disposition中插入文件名 一定要设置Access-Control-Expose-Headers,代表跨域该Content-Disposition返回Header可读,如果没有,前端是取不到Content-Disposition的,可以在统…...
从零开始搭建Anaconda环境
Anaconda是一个流行的Python数据科学平台,包含conda包管理器、Python解释器和大量预装的数据科学工具包。以下是详细的安装和配置步骤: 1. 下载Anaconda 访问Anaconda官方网站 根据你的操作系统(Windows/macOS/Linux)选择相应版本 推荐下载Python 3.x版…...
TDengine 中的命名与边界
简介 本章主要介绍命名的合法字符集和限制规则,这对于正确使用 TDengine,减小报错很重要,这些规则在 SQL 语句中都生效,在使用过程中要注意,避免不必要的错误。 名称命名规则 合法字符:英文字符、数字和…...
软件架构设计中的软件过程模型初识
软件架构设计中的软件过程模型是指导软件开发过程的框架,它们定义了软件开发的不同阶段、活动、任务和角色。结合具体的使用场景,可以更好地理解这些模型如何在实际项目中应用。以下将详细介绍几种常见的软件过程模型,并结合典型场景进行讲解…...
基于ssm的课程辅助教学平台(全套)
互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对《离散结构》课程教学信息管理混乱,出错率高,信息安…...
[创业之路-344]:战略的本质是选择、聚焦, 是成本/效率/低毛利优先,还是差易化/效益/高毛利优先?无论是成本优先,还是差易化战略,产品聚焦是前提。
前言: 一、战略的本质是选择、聚焦 关于战略的本质,触及了商业竞争的核心矛盾:选择成本优先(效率/低毛利)还是差异化(效益/高毛利),本质上是对企业战略方向的终极拷问。 1、战略选…...
洛谷题单1-P5705 【深基2.例7】数字反转-python-流程图重构
题目描述 输入一个不小于 100 100 100 且小于 1000 1000 1000,同时包括小数点后一位的一个浮点数,例如 123.4 123.4 123.4 ,要求把这个数字翻转过来,变成 4.321 4.321 4.321 并输出。 输入格式 一行一个浮点数 输出格式 …...
Typora 小乌龟 git 上传到gitee仓库教程
首先进行资源分享 通过网盘分享的文件:TortoiseGit-LanguagePack-2.17.0.0-64bit-zh_CN.msi等4个文件 链接: https://pan.baidu.com/s/1NC8CKLifCEH_YixDU3HG_Q?pwdqacu 提取码: qacu --来自百度网盘超级会员v3的分享 首先将软件进行解压 看自己电脑的版本进行…...
【新人系列】Golang 入门(八):defer 详解 - 上
✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12898955.html 📣 专栏定位:为 0 基础刚入门 Golang 的小伙伴提供详细的讲解,也欢迎大佬们…...
知识图谱之知识抽取:从数据海洋中 “捞金”
目录 知识抽取:开启知识宝库的钥匙 知识抽取的对象:实体、关系与属性 知识抽取的方法:各显神通的 “淘金术” 基于规则的方法 机器学习方法 深度学习方法 知识抽取面临的挑战:荆棘丛中的探索 数据的多样性和复杂性 语义理…...
RAG - 五大文档切分策略深度解析
文章目录 切分策略1. 固定大小分割(Fixed-Size Chunking)2. 滑动窗口分割(Sliding Window Chunking)3. 自然语言单元分割(Sentence/Paragraph Segmentation)4. 语义感知分割(Semantic-Aware Seg…...
keil中文注释出现乱码怎么解决
keil中文注释出现乱码怎么解决 在keil–edit–configuration中encoding改为chinese-GB2312...
论文阅读笔记——ReconDreamer
ReconDreamer 论文 在 DriveDreamer4D 的基础上,通过渐进式数据更新,解决大范围机动(多车道连续变道、紧急避障)的问题。同时 DriveDreamer4D生成轨迹后直接渲染,而 ReconDreamer 会实时通过 DriveRestorer 检测渲染结…...
鸿蒙harmonyOS:笔记 正则表达式
从给出的文本中,按照既定的相关规则,匹配出符合的数据,其中的规则就是正则表达式,使用正则表达式,可以使得我们用简洁的代码就能实现一定复杂的逻辑,比如判断一个邮箱账号是否符合正常的邮箱账号࿰…...
计算机网络——传输层(TCP)
传输层 在计算机网络中,传输层是将数据向上向下传输的一个重要的层面,其中传输层中有两个协议,TCP,UDP 这两个协议。 TCP 话不多说,我们直接来看协议报头。 源/目的端口号:表示数据从哪个进程来࿰…...
英伟达与通用汽车深化合作,澳特证券am broker助力科技投资
在近期的GTC大会上,英伟达CEO黄仁勋宣布英伟达将与通用汽车深化合作,共同推进AI技术在自动驾驶和智能工厂的应用。此次合作标志着自动驾驶汽车时代的加速到来,同时也展示了英伟达在AI技术领域的最新进展。 合作内容包括:…...
Visual Studio 2022静态库与动态库创建及使用完全指南
在C开发中,库(Library)是代码复用的重要方式。本教程将详细介绍如何在Visual Studio 2022中创建和使用静态库(.lib)和动态库(.dll),每种库类型都会有完整的创建步骤和实际示例。 第…...
