FPGA——分秒计数器
文章目录
- 一、实验任务
- 二、系统模块
- 三、工程源码
- 四、管脚信息
- 五、运行结果
- 参考资料
- 总结
一、实验任务
在DE2-115板子上用 Verilog编程实现一个分秒计数器,并具备按键暂停、按键消抖功能。
二、系统模块
- 分频模块
高频时钟(如50MHz)分频得到低频时钟(如1Hz),用于驱动计数器模块,使计时每秒更新一次。用户代码中的分频模块可能通过计数器的累加和翻转来实现分频。 - 消抖模块
处理机械按键的抖动问题,确保每次按键按下只产生一个稳定的脉冲信号。用户的消抖模块可能使用同步器和计数器来消除按键的抖动,确保复位和暂停信号的可靠性。 - 计数模块
负责实际的计时功能,如秒和分的计数,并在达到59秒或59分时进位。用户代码中的该模块可能在1Hz时钟的驱动下递增秒和分,并在复位信号下清零。 - 数码管显示模块
将二进制数转换为七段数码管的显示编码,驱动数码管显示当前的秒和分。用户的显示模块可能将秒和分的个位和十位分别解码为对应的七段码。 - 顶层模块
通常负责将各个子模块实例化并连接起来,处理全局信号如时钟、按键输入,以及输出显示。用户代码中的顶层模块可能负责协调所有子模块的工作,比如将分频后的时钟传递给计数器,处理按键消抖后的信号,并将计数结果传递给显示模块。
三、工程源码
1. 分频模块代码
clock_divider.v
module clock_divider #(parameter DIVIDER = 24_999_999
)(input clk,input reset,output reg clk_out
);reg [31:0] counter;always @(posedge clk or posedge reset) beginif (reset) begincounter <= 0;clk_out <= 0;end else begincounter <= (counter == DIVIDER) ? 0 : counter + 1;clk_out <= (counter == DIVIDER) ? ~clk_out : clk_out;end
endendmodule
2. 消抖模块代码
key_debounce.v
module key_debounce #(parameter DEBOUNCE_MS = 20,parameter CLK_FREQ = 50_000_000
)(input clk,input key_n,output reg key_pulse
);localparam CNT_MAX = (DEBOUNCE_MS * CLK_FREQ) / 1000;reg [1:0] sync_chain = 2'b11;
reg [19:0] count = 0;
reg stable_state = 1'b1;
reg prev_state = 1'b1;always @(posedge clk) begin// 同步器链sync_chain <= {sync_chain[0], key_n};// 消抖计数器if (sync_chain[1] != stable_state) begincount <= (count < CNT_MAX) ? count + 1 : 0;if (count == CNT_MAX) stable_state <= sync_chain[1];end else begincount <= 0;end// 边沿检测prev_state <= stable_state;key_pulse <= prev_state & ~stable_state;
endendmodule
3. 计数模块代码
time_counter.v
module time_counter(input clk, // 1Hz时钟input reset, // 扩展复位input enable, // 运行使能output reg [5:0] seconds=0,output reg [5:0] minutes=0
);// 60进制计数逻辑
always @(posedge clk or posedge reset) beginif (reset) beginseconds <= 6'd0;minutes <= 6'd0;end else if (enable) beginif (seconds == 6'd59) beginseconds <= 6'd0;minutes <= (minutes == 6'd59) ? 6'd0 : minutes + 1;end else beginseconds <= seconds + 1;endend
endendmodule
4. 数码管显示模块代码
seg7_decoder.v
module seg7_decoder(input [3:0] num,output reg [6:0] seg
);// 共阳极数码管编码
always @(*) begincase(num)4'd0: seg = 7'b1000000; // 04'd1: seg = 7'b1111001; // 14'd2: seg = 7'b0100100; // 24'd3: seg = 7'b0110000; // 34'd4: seg = 7'b0011001; // 44'd5: seg = 7'b0010010; // 54'd6: seg = 7'b0000010; // 64'd7: seg = 7'b1111000; // 74'd8: seg = 7'b0000000; // 84'd9: seg = 7'b0010000; // 9default: seg = 7'b1111111; // 灭endcase
endendmodule
5. 顶层模块代码
counter.v
module counter(input CLOCK_50,input KEY0,input KEY1,output [6:0] hex0,output [6:0] hex1,output [6:0] hex2,output [6:0] hex3
);// 时钟与信号定义
wire clk_1hz;
wire reset_pulse; // 消抖后的复位脉冲
wire pause_pulse; // 消抖后的暂停脉冲
reg running=1'b1; // 运行状态信号
wire [5:0] seconds, minutes; // 时间信号// 时钟分频模块
clock_divider #(.DIVIDER(24_999_999)) clk_div (.clk(CLOCK_50),.reset(reset_pulse),.clk_out(clk_1hz)
);// 按键消抖模块
key_debounce #(.DEBOUNCE_MS(20)) key_reset (.clk(CLOCK_50),.key_n(KEY0),.key_pulse(reset_pulse)
);key_debounce #(.DEBOUNCE_MS(20)) key_pause (.clk(CLOCK_50),.key_n(KEY1),.key_pulse(pause_pulse)
);// 复位信号展宽(保持顶层时序控制)
reg [19:0] reset_hold = 20'hFFFFF; // 20-bit for ~21ms reset
always @(posedge CLOCK_50) beginif (reset_pulse) reset_hold <= 20'hFFFFF;else if (reset_hold > 0) reset_hold <= reset_hold - 1;
end
wire reset_extended = (reset_hold > 0);always @(posedge CLOCK_50) begincase(1'b1)reset_pulse: running <= 1'b1; // 复位优先pause_pulse: running <= ~running; // 状态切换default: running <= running; // 保持状态endcase
end// 核心计数模块
time_counter timer_core (.clk(clk_1hz),.reset(reset_extended),.enable(running),.seconds(seconds),.minutes(minutes)
);// 显示模块
seg7_decoder seg0(.num(seconds%10), .seg(hex0));
seg7_decoder seg1(.num(seconds/10), .seg(hex1));
seg7_decoder seg2(.num(minutes%10), .seg(hex2));
seg7_decoder seg3(.num(minutes/10), .seg(hex3));endmodule
四、管脚信息
五、运行结果
将以上文件加载到项目中后,将counter.v设置为置顶文件
分秒计数器
参考资料
https://blog.csdn.net/weixin_43828944/article/details/122360794
https://blog.csdn.net/weixin_43828944/article/details/122699533
并辅以AI软件DeepSeek完成此项实验。
总结
本次实验实现了一个简单的分秒计数器,但由于首次做该实验也遇到了很多问题,例如只能计数,复位键和暂停键按下时无反应,但最后通过DeepSeek的辅助解决了该问题。
相关文章:
FPGA——分秒计数器
文章目录 一、实验任务二、系统模块三、工程源码四、管脚信息五、运行结果参考资料总结 一、实验任务 在DE2-115板子上用 Verilog编程实现一个分秒计数器,并具备按键暂停、按键消抖功能。 二、系统模块 分频模块 高频时钟(如50MHz)分频得到…...
【Java】JVM
一、JVM体系结构 1、虚拟机概述 虚拟机(Virtual Machine):一台虚拟的计算机,指一种特殊的软件,他可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于这个软件所创建的环境来操作软件。虚拟机…...
vue中使用geoscene无法出现弹窗
项目场景: 平日对地图加载使用不复杂的情况下,我通常采用leaflet去加载地图做一些简单的操作。但是最近需要用到arcgis发布的地图服务加载三维场景,于是又用回了geoscene(arcgis国产化)。这下暴露出很多的问题&#x…...
【Go】数组
数组Array 重点: 数组是值类型 注意点: 1. 数组:是同一种数据类型的固定长度的序列。2. 数组定义:var a [len]int,比如:var a [5]int,数组长度必须是常量,且是类型的组成部分。一旦定义&…...
【运维】Centos硬盘满导致开机时处于加载状态无法开机解决办法
Centos硬盘存储过满导致无法加载 一、准备1.现象2.根因分析3.制定救援方案问题1:无法进入系统确定分析结论 问题2:磁盘数据过多 4.后处理 一、准备 1.现象 Centos虚拟机界面卡顿,随后进行了重启操作,发现重新启动界面一直卡在加…...
JVM——模型分析、回收机制
方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实例,几乎所有的对象实例都在这里分配内存 虚拟机栈:虚拟机栈描述的是|ava方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局…...
kafka 4.x docker启动kafka4.0.0 docker-compose启动最新版kafka 如何使用docker容器启动最新版kafka
1. 镜像选择标签: https://hub.docker.com/r/bitnami/kafka/tags 2. 命令: docker pull bitnami/kafka:4.0.0 3. docker-compose.yml 启动kafka4.0.0: version: 3services:kafka:image: bitnami/kafka:4.0.0container_name: kafkaports:- &…...
BUUCTF-web刷题篇(6)
15.PHP 知识点: ①__wakeup()//将在反序列化之后立即调用(当反序列化时变量个数与实际不符是会绕过)我们可以通过一个cve来绕过:CVE-2016-7124。将Object中表示数量的字段改成比实际字段大的值即可绕过wakeup函数。条件:PHP5<…...
MySQL篇(一):慢查询定位及索引、B树相关知识详解
MySQL篇(一):慢查询定位及索引、B树相关知识详解 MySQL篇(一):慢查询定位及索引、B树相关知识详解一、MySQL中慢查询的定位(一)慢查询日志的开启(二)慢查询日…...
QT之QML(简单示例)
需求一:点击按钮弹出菜单,并且自定义菜单弹出位置。 mouse.x 和 mouse.y 获取的是相对于 MouseArea(在这个例子中是 Button)左上角的局部坐标。如果你想要在鼠标点击位置显示 Menu,你需要将这个局部坐标转换为相对于应…...
自动化释放linux服务器内存脚本
脚本说明 使用Linux的Cron定时任务结合Shell脚本来实现自动化的内存释放。 脚本用到sync系统命令 sync的作用:sync 是一个 Linux 系统命令,用于将文件系统缓存中的数据强制写入磁盘。 在你执行reboot、poweroff、shutdown命令时,系统会默认执…...
Linux中的权限管理
一、权限的概念 在 Linux 系统的架构里,权限是构建安全堡垒的基石,精准界定了不同用户对文件与目录的操作边界,对系统安全的维护以及数据完整性的保障起着决定性作用。 1.权限的三种基础类别: 权限对文件的影响对目录的影响 读(r…...
Java对象与JSON字符串的互转
最近,工作中会涉及到Java对象与JSON字符串相互转换,虽然说并不难,但打算还是梳理一番,主要内容有: JSON 字符串 转 普通对象 普通对象 转 JSON 字符串 JSON 字符串数组 转 List 集合对象 List 集合对象 转 JSON 字符串…...
[笔记.AI]向量化
(借助 DeepSeek-V3 辅助生成) 向量化的定义 向量化(Vectorization) 是将文本、图像、音频等非结构化数据转换为高维数值向量(即一组数字)的过程。这些向量能够捕捉数据的语义、特征或上下文信息&#x…...
NSSCTF(MISC)—[justCTF 2020]pdf
相应的做题地址:https://www.nssctf.cn/problem/920 binwalk分离 解压文件2AE59A.zip mutool 得到一张图片 B5F31内容 B5FFD内容 转换成图片 justCTF{BytesAreNotRealWakeUpSheeple}...
Angular的理解
Angular 是一个由 Google 维护的全功能前端框架,适合构建复杂的企业级应用。它采用 TypeScript 作为首选语言,提供了一套完整的解决方案,包括数据绑定、依赖注入、路由、表单处理等。 1. Angular 的核心概念 1.1 组件化架构 Angular 应用由…...
广告推荐算法:COSMO算法与A9算法的对比
COSMO算法与A9算法的概念解析 1. A9算法 定义与背景: A9算法是亚马逊早期为电商平台研发的核心搜索算法,主要用于优化商品搜索结果的排序和推荐,其核心逻辑围绕产品属性与关键词匹配展开。自2003年推出以来,A9通过分析商品标题…...
10. 七大排序(含四种版本快排及优化) ******
排序算法时间复杂度(平均)时间复杂度(最坏)时间复杂度(最好)空间复杂度稳定性主要使用场景直接插入排序O(n)O(n)O(n)O(1)稳定小规模数据或基本有序数据希尔排序O(n^1.3)O(n)O(n log n)O(1)不稳定中等规模数据,对稳定性无要求选择排序O(n)O(n)O(n)O(1)不稳定小规模数…...
以下是C/C++后台开发常见的高概率面试题
一、语言基础 多态的实现 通过虚函数表(vtable)实现动态绑定,运行时根据对象类型调用对应的函数。虚函数通过virtual关键字声明,子类可重写基类虚函数112。 指针与引用的区别 指针是变量,存储地址,支持多…...
CentOS-查询实时报错日志-查询前1天业务报错gz压缩日志
最新版本更新 https://code.jiangjiesheng.cn/article/364?from=csdn 推荐 《高并发 & 微服务 & 性能调优实战案例100讲 源码下载》 1. 查询实时报错日志 物理路径(带*的放在靠后,或者不用*) cd /home/logs/java-gz-log-dir && tail -2000f java-gz-l…...
破界·共生:生成式人工智能(GAI)认证重构普通人的AI进化图谱
在当今这个科技日新月异的时代,人工智能(AI)正以惊人的速度改变着我们的世界。从智能家居到自动驾驶,从医疗诊断到金融分析,AI的应用已经渗透到社会生活的方方面面。面对如此迅猛的发展态势,我们不禁要问:人工智能的未来将走向何方?普通人又该如何把握这一历史机遇,学…...
HTTP代理:网页加速的隐形引擎
目录 引言:网页加载速度为何至关重要? 一、HTTP代理的核心加速原理 二、四大加速黑科技详解 三、实战场景性能对比 四、代理加速的隐藏代价 五、未来发展趋势 结语:智能代理的选型指南 引言:网页加载速度为何至关重要&#…...
Unity 常见报错 定位和查找方法
1.控制台 直接看报错信息 2.打log 例子: for(int i 0;i < 8;i) {Debug.Log(i);//这是打的log,看看到底i是几的时候出问题gameObject.name strs[i];} 3.断点调试 (1)在你想打断点的行,左边空白处点击可以打断点ÿ…...
人工智能之数学基础:初等反射阵
本文重点 在线性代数中,初等反射阵(Householder矩阵)作为一类特殊的正交矩阵,在矩阵变换、特征值计算及几何变换等领域具有广泛应用。其简洁的构造方式和丰富的数学性质,使其成为数值分析和几何处理中的重要工具。 什么是初等反射阵(豪斯霍尔德变换) I为单位矩阵,wwT…...
《Linux运维总结:基于银河麒麟V10操作系统+ARM64架构CPU二进制部署单机ACL版consul v1.18.1》
总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、简介 1、什么是consul Consul是HashiCorp公司推出的开源工具,用于实现 分布式系统的服务发现与配置。 Consul是分布式的、高可用的、可横向扩展的。 架构图…...
web网站页面测试点---添加功能测试
添加 一、创建新的申请时,关闭网络查看数据是否存在,并提示网络错位相关提示语 二、在文本框内输入数据 1.在文本框内输入空格,查看文本内容前后是否存在空格 2.在文本框内输入最大长度,查看能否正确提交 3.在文本框内输入最大长…...
实操自动生成接口自动化测试用例
这期抽出来的问题是关于如何使用Eolinker自动生成接口自动化测试用例,也就是将API文档变更同步到测试用例,下面是流程的示例解析。 导入并关联API文档和自动化测试用例 首先是登陆Eolinker,可以直接在线使用。 进入流程测试用例详情页&am…...
【华为OD技术面试真题 - 技术面】- Java面试题(17)
华为OD面试真题精选 专栏:华为OD面试真题精选 目录: 2024华为OD面试手撕代码真题目录以及八股文真题目录 文章目录 华为OD面试真题精选虚拟机分区1. **虚拟磁盘分区**2. **虚拟机的内存分区**3. **CPU分配**4. **虚拟网络分区**5. **存储虚拟化和分区**6. **虚拟机分区管理**…...
mapState 函数的用法
mapState 是 Vuex 提供的一个辅助函数,其主要作用是将 Vuex 仓库中的状态映射到组件的计算属性中,这样在组件里就能像访问本地计算属性一样访问 Vuex 仓库中的状态。以下为你详细介绍 mapState 函数的不同用法。 1. 基本用法:对象形式 当使…...
【学Rust写CAD】17 通用2D仿射变换矩阵结构体(matrix/generic.rs)
源代码 // matrix.rs use std::ops::{Add, Mul};use std::ops::{Add, Mul};/// 通用2D仿射变换矩阵(元素仅需Copy) #[derive(Clone, Copy, Debug, PartialEq)] pub struct Matrix<X, Y, Xx, Xy, Yx, Yy> {pub x: X, pub y: Y,pub xx: Xx, pub xy:…...
STM32单片机入门学习——第3-4节: [2-1、2]软件安装和新建工程
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.01 STM32开发板学习——第一节: [1-1]课程简介 前言开发板说明引用解答和…...
Linux详解
01 计算机组成原理 1、什么是计算机? 计算机俗称电脑,就相当于一种人造人, 电脑二字蕴含着人类的对计算机的终极期望,希望一通电就能够像人脑一样去工作 2、为何要有计算机? 为了造出一种机器来取代人去工作&…...
IP数据报报文格式
一 概述 IP数据报由两部分组成:首部数据部分。首部的前一部分是固定长度,一共20字节大小,是所有IP数据报文必须具有的;固定部分后面是一些可选字段,其长度是可变的。 二 首部固定部分各字段意义 (1&…...
自然语言处理(25:(终章Attention 1.)Attention的结构)
系列文章目录 终章 1:Attention的结构 终章 2:带Attention的seq2seq的实现 终章 3:Attention的评价 终章 4:关于Attention的其他话题 终章 5:Attention的应用 目录 系列文章目录 前言 Attention的结构 一.seq…...
Minimind 训练一个自己专属语言模型
发现了一个宝藏项目, 宣传是完全从0开始,仅用3块钱成本 2小时!即可训练出仅为25.8M的超小语言模型MiniMind,最小版本体积是 GPT-3 的 17000,做到最普通的个人GPU也可快速训练 https://github.com/jingyaogong/minimi…...
Android里面内存优化
核心思路 在Android开发中,内存优化是保证应用性能稳定和用户体验的关键。我通常从以下几个方面进行内存优化: 1. 内存泄漏检测与修复 使用LeakCanary等工具检测内存泄漏 常见内存泄漏场景: 静态变量持有Activity/Fragment引用 非静态内部…...
Git操作指南
Git操作指南 1.安装并配置Git Git官网:https://git-scm.com/downloads 安装完成后,打开Git Bash,配置Git: git config --global user.email "emailexample.com" git config --global user.name "Your Name&quo…...
【蓝桥杯—单片机】通信总线专项 | 真题整理、解析与拓展 (更新ing...)
通信总线专项 前言SPI第十五届省赛题 UART/RS485/RS232UARTRS485RS232第十三届省赛题小结和拓展:传输方式的分类第十三届省赛 其他相关考点网络传输速率第十五届省赛题第十二届省赛题 前言 在本文中我会把 蓝桥杯单片机赛道 历年真题 中涉及到通信总线的题目整理出…...
深入探究C语言中的二进制世界:从原理到实践
文章目录 深入探究C语言中的二进制世界:从原理到实践一、进制的本质与C语言实现1. 进制系统全景2. C语言中的进制表示3. 格式化输出进阶 二、进制转换的工程实践1. 转换算法实现2. 实际应用中的转换技巧快速二进制 - 十六进制转换位运算优化转换 3. 进制转换详细示例…...
【android bluetooth 协议分析 13】【RFCOMM详解 2】【通俗易懂 rfcomm 基本流程】
RFCOMM 协议 基本流程 一、连接建立流程(附 BTsnoop 实例解析) 1. L2CAP 通道建立 BTsnoop 表现: L2CAP_Connection_Request (PSM0x0003) // 请求建立RFCOMM专用通道L2CAP_Connection_Response (Success) // 对方同意作用:相…...
万字知识篇(2):SpringBoot的常用注解(上)
SpringBoot的常用注解非常的多,一篇文章根本讲不完,将分为上下两章,通过本章你将会系统的学习到: 1. 注解在SpringBoot中的作用 2. SpringBoot 常用注解速查表 3. 核心启动类注解 4. Configuration 5. Bean 6. PropertySource 7. …...
Postman —— postman实现参数化
什么时候会用到参数化 比如:一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块:正确的用户名,密码 成功;错误的用户名,正确的密码 失败 postman实现参数化 在实际的接口测试中,部分参数每…...
Docker学习--容器生命周期管理相关命令--docker create 命令
docker create 命令作用: 会根据指定的镜像和参数创建一个容器实例,但容器只会在创建时进行初始化,并不会执行任何进程。 语法: docker create[参数] IMAGE(要执行的镜像) [COMMAND](在容器内部…...
算法基础_基础算法【高精度 + 前缀和 + 差分 + 双指针】
算法基础_基础算法【高精度 前缀和 差分 双指针】 ---------------高精度---------------791.高精度加法题目介绍方法一:代码片段解释片段一: 解题思路分析 792. 高精度减法题目介绍方法一:代码片段解释片段一: 解题思路分析 7…...
C语言深度解析:从零到系统级开发的完整指南
一、C语言的核心特性与优势 1. 高效性与直接硬件控制 C语言通过编译为机器码的特性,成为系统级开发的首选语言。例如,Linux内核通过C语言直接操作内存和硬件寄存器,实现高效进程调度。 关键点: malloc/free直接管理内存&#…...
Axure疑难杂症:完美解决中继器筛选问题(时间条件筛选、任性筛选)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:中继器筛选专题 主要内容:时间条件筛选、多条件组合筛选、多个单一条件混合筛选 应用场景:各类数据表的多条件筛选均可使用…...
汇编学习之《扩展指令指针寄存器》
什么是指令指针寄存器? EIP (Extended Instruction Pointer): 保存cpu 下一次将要执行的代码的地址。 通过OllyGbd可以看到CPU即将执行指令的地址和EIP 内部放入的地址一致,多次F8依然是这样。 这里要区分下,之前比如EAX,ECX我…...
oracle-blob导出,在ob导入失败
导出: [oraclelncs dmp]$ /home/oracle/sqluldr2 gistar/res#pwd192.168.205.58:1521/lndb query"select * from an_odn_picture where length(PIC_CONTENT)<25000" filean_odn_picture.csv Charsetutf8 textCSV 0 rows exported at 2025-…...
【Linux笔记】进程间通信——匿名管道||进程池
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】动态库与静态库的理解与加载 🔖流水不争,争的是滔滔不 一、Linux进程间通…...
Spring Boot 3.4.3 基于 Caffeine 实现本地缓存
在现代企业级应用中,缓存是提升系统性能和响应速度的关键技术。通过减少数据库查询或复杂计算的频率,缓存可以显著优化用户体验。Spring Boot 3.4.3 提供了强大的缓存抽象支持,而 Caffeine 作为一款高性能的本地缓存库,因其优异的…...