当前位置: 首页 > news >正文

FPGA项目实现:秒表设计

文章目录

  • 项目要求
  • 项目设计

项目要求

设计一个时钟秒表,共六个数码管,前两位显示分钟,中间两位显示时间秒,后两位显示毫秒的高两位,可以通过按键来开始、暂停以及重新开始秒表的计数。

项目设计

为完成此项目共设计四个模块,按键消抖模块、时钟计时器模块、数码管显示模块以及顶层文件模块,详细代码设计如下:

按键消抖模块:

/** @Description: 按键销抖模块(延迟方法销抖)* @Author: Fu Yu* @Date: 2023-08-01 14:31:19* @LastEditTime: 2023-08-01 16:29:44* @LastEditors: Fu Yu*/module key_filter (input       wire        clk         ,input       wire        rst_n       ,input       wire        key_in      ,//按键输入,低有效output      wire        key_down       //按键输出,高有效
);parameter MAX_20MS = 20'd999_999;//20msreg key_r;//同步
reg key_r1;//打拍
reg key_r2;
wire nedge;//下降沿reg key_down_r;//保存key_down信号reg [19:0]  cnt_20ms;
reg flag;//计数开始标志信号
wire add_cnt_20ms;
wire end_cnt_20ms;//****************************************************************
//--同步打拍,检测下降沿
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginkey_r <= 1'b1;key_r1 <= 1'b1;key_r2 <= 1'b1;endelse beginkey_r <= key_in;key_r1 <= key_r;key_r2 <= key_r1;end
end//下降沿检测
assign nedge = ~key_r1 & key_r2;//****************************************************************
//--flag信号定义
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginflag <= 1'b0;endelse if(nedge) beginflag <= 1'b1;endelse if(end_cnt_20ms) beginflag <= 1'b0;endelse beginflag <= flag;end
end//****************************************************************
//--计数
//****************************************************************
always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_20ms <= 20'd0;end else if(add_cnt_20ms)begin if(end_cnt_20ms)begin cnt_20ms <= 20'd0;endelse begin cnt_20ms <= cnt_20ms + 1'b1;end end
end assign add_cnt_20ms = flag;
assign end_cnt_20ms = add_cnt_20ms && cnt_20ms == MAX_20MS;//****************************************************************
//--key_down
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginkey_down_r <= 1'b0;endelse if(end_cnt_20ms) beginkey_down_r <= ~key_r2;endelse beginkey_down_r <= 1'b0;end
endassign key_down = key_down_r;endmodule //key_filter

时钟计时器模块:

/** @Description: 通过输入的按键控制计数开始与暂停,实现秒表设计(毫秒、秒、分计时)* @Author: Fu Yu* @Date: 2023-08-01 14:46:43* @LastEditTime: 2023-08-01 15:53:12* @LastEditors: Fu Yu*/module counter_time (input       wire        clk         ,input       wire        rst_n       ,input       wire        key_in      ,//销抖后的脉冲信号,高有效output      wire [23:0] din_out         //输出当前计数的值
);parameter MAX_1MS = 16'd49_999;//1ms
parameter MAX_1S = 10'd999;//1ms*1000 = 1s
parameter MAX_1MIN = 6'd59;//1s*60 = 1min
parameter MAX_1H = 6'd59;//1min*60 = 1hreg flag;//开始、暂停结束信号reg [15:0] cnt_1ms;
wire add_cnt_1ms;
wire end_cnt_1ms;reg [9:0] cnt_1s;
wire add_cnt_1s;
wire end_cnt_1s;reg [5:0] cnt_1min;
wire add_cnt_1min;
wire end_cnt_1min;reg [5:0] cnt_1h;
wire add_cnt_1h;
wire end_cnt_1h;reg [7:0] data_min;//保存此时有多少分钟
reg [7:0] data_s;//保存此时有多少秒
reg [7:0] data_ms;//保存此时有多少毫秒,只取高两位//****************************************************************
//--flag
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginflag <= 1'b0;endelse if (key_in) beginflag <= ~flag;endelse beginflag <= flag;end
end//****************************************************************
//--1ms计数器
//****************************************************************
always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_1ms <= 16'd0;end else if(add_cnt_1ms)begin if(end_cnt_1ms)begin cnt_1ms <= 16'd0;endelse begin cnt_1ms <= cnt_1ms + 1'b1;end end
end assign add_cnt_1ms = flag;
assign end_cnt_1ms = add_cnt_1ms && cnt_1ms == MAX_1MS;//****************************************************************
//--1s计数器
//****************************************************************always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_1s <= 10'd0;end else if(add_cnt_1s)begin if(end_cnt_1s)begin cnt_1s <= 10'd0;endelse begin cnt_1s <= cnt_1s + 1'b1;end end
end assign add_cnt_1s = end_cnt_1ms;
assign end_cnt_1s = add_cnt_1s && cnt_1s == MAX_1S ;
//&& end_cnt_1ms//****************************************************************
//--1min计数器
//****************************************************************always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_1min <= 6'd0;end else if(add_cnt_1min)begin if(end_cnt_1min)begin cnt_1min <= 6'd0;endelse begin cnt_1min <= cnt_1min + 1'b1;end end
end assign add_cnt_1min = end_cnt_1s;
assign end_cnt_1min = add_cnt_1min && cnt_1min == MAX_1MIN ;
//&& end_cnt_1s
//****************************************************************
//--1h计数器
//****************************************************************
always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_1h <= 6'd0;end else if(add_cnt_1h)begin if(end_cnt_1h)begin cnt_1h <= 6'd0;endelse begin cnt_1h <= cnt_1h + 1'b1;end end
end assign add_cnt_1h = end_cnt_1min;
assign end_cnt_1h = add_cnt_1h && cnt_1h == MAX_1H;
// && end_cnt_1min
//****************************************************************
//--din_out
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(!rst_n) begindata_min <= 8'd0;data_s <= 8'd0;data_ms <= 8'd0;endelse begindata_min <= cnt_1h;data_s <= cnt_1min;data_ms <= cnt_1s/10;end
endassign din_out = {data_min,data_s,data_ms};endmodule //counter_time

数码管显示模块:

/** @Description: 数码管显示时钟,前两位显示分钟,中间两位显示秒,最后两位显示毫秒* @Author: Fu Yu* @Date: 2023-08-01 15:19:52* @LastEditTime: 2023-08-01 16:22:40* @LastEditors: Fu Yu*/module seg_sel (input       wire        clk         ,input       wire        rst_n       ,input       wire [23:0] din         ,output      wire [5:0]  sel         ,//位选信号output      wire [7:0]  dig             //段选信号
);parameter MAX_1MS = 16'd49_999;//1msparameter   ZERO  = 7'b100_0000,ONE   = 7'b111_1001,TWO   = 7'b010_0100,THREE = 7'b011_0000,FOUR  = 7'b001_1001,FIVE  = 7'b001_0010,SIX   = 7'b000_0010,SEVEN = 7'b111_1000,EIGHT = 7'b000_0000,NINE  = 7'b001_0000;reg [5:0]   point_n;//小数点位置
reg point_n_r;reg [15:0] cnt_1ms;
wire add_cnt_1ms;
wire end_cnt_1ms;reg [5:0]   sel_r;
reg [7:0]   dig_r;
reg [3:0]   disp_data   ;//每一位数码管显示的数值//****************************************************************
//--1ms计数器
//****************************************************************
always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_1ms <= 16'd0;end else if(add_cnt_1ms)begin if(end_cnt_1ms)begin cnt_1ms <= 16'd0;endelse begin cnt_1ms <= cnt_1ms + 1'b1;end end
end assign add_cnt_1ms = 1'b1;
assign end_cnt_1ms = add_cnt_1ms && cnt_1ms == MAX_1MS;//****************************************************************
//--小数点
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginpoint_n <= 6'b111111;endelse beginpoint_n <= 6'b110101;end
end//****************************************************************
//--sel信号
//****************************************************************
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginsel_r <= 6'b111110;endelse if(end_cnt_1ms) beginsel_r <= {sel_r[4:0],sel_r[5]};//循环左移end
endassign sel = sel_r;//****************************************************************
//--disp_data
//****************************************************************always @(posedge clk or negedge rst_n)begin if(!rst_n)begindisp_data <= 'd0;point_n_r <= 1'b1;end else begin case (sel_r)6'b111_110 : begin disp_data <= din[23:16]/10  ; point_n_r <= point_n[0]; end//第一位数码管显示的数值6'b111_101 : begin disp_data <= din[23:16]%10  ; point_n_r <= point_n[1]; end6'b111_011 : begin disp_data <= din[15:8]/10 ; point_n_r <= point_n[2]; end6'b110_111 : begin disp_data <= din[15:8]%10 ; point_n_r <= point_n[3]; end6'b101_111 : begin disp_data <= din[7:0]/10 ; point_n_r <= point_n[4]; end6'b011_111 : begin disp_data <= din[7:0]%10 ; point_n_r <= point_n[5]; enddefault: disp_data <= 'd0;endcaseend end//****************************************************************
//--dig
//****************************************************************
always @(*)begin case (disp_data)0 :  dig_r <= {point_n_r,ZERO  };1 :  dig_r <= {point_n_r,ONE   };2 :  dig_r <= {point_n_r,TWO   };3 :  dig_r <= {point_n_r,THREE };4 :  dig_r <= {point_n_r,FOUR  };5 :  dig_r <= {point_n_r,FIVE  };6 :  dig_r <= {point_n_r,SIX   };7 :  dig_r <= {point_n_r,SEVEN };8 :  dig_r <= {point_n_r,EIGHT };9 :  dig_r <= {point_n_r,NINE  };default: dig_r <= 8'hff;endcaseendassign dig = dig_r;endmodule //seg_sel

顶层文件模块:

module top (input       wire        clk         ,input       wire        rst_n       ,input       wire        key_in      ,output      wire [5:0]  sel         ,output      wire [7:0]  dig             
);wire key;
wire [23:0] data;key_filter u_key_filter(.       clk        (clk) ,.       rst_n       (rst_n),.       key_in      (key_in),.       key_down     (key)
);counter_time u_counter_time(. clk        (clk) ,. rst_n      (rst_n) ,. key_in     (key) ,. din_out      (data)
);seg_sel u_seg_sel(. clk      (clk)   ,. rst_n     (rst_n)  ,. din       (data)  ,. sel        (sel) ,. dig        (dig)  
);endmodule //top

效果展示:

秒表

相关文章:

FPGA项目实现:秒表设计

文章目录 项目要求项目设计 项目要求 设计一个时钟秒表&#xff0c;共六个数码管&#xff0c;前两位显示分钟&#xff0c;中间两位显示时间秒&#xff0c;后两位显示毫秒的高两位&#xff0c;可以通过按键来开始、暂停以及重新开始秒表的计数。 项目设计 为完成此项目共设计…...

Postgresql源码(109)并行框架实例与分析

1 PostgreSQL并行参数 系统参数 系统总worker限制&#xff1a;max_worker_processes 默认8 系统总并发限制&#xff1a;max_parallel_workers 默认8 单Query限制&#xff1a;max_parallel_workers_per_gather 默认2 表参数限制&#xff1a;parallel_workers alter table tbl …...

ES派生类的prototype方法中,不能访问super的解决方案

1 下面的B.prototype.compile方法中&#xff0c;无法访问super class A {compile() {console.log(A)} }class B extends A {compile() {super.compile()console.log(B)} }B.prototype.compile function() {super.compile() // 报错&#xff0c;不可以在此处使用superconsole.…...

使用adb通过电脑给安卓设备安装apk文件

最近碰到要在开发板上安装软件的问题&#xff0c;由于是开发板上的安卓系统没有解析apk文件的工具&#xff0c;所以无法通过直接打开apk文件来安装软件。因此查询各种资料后发现可以使用adb工具&#xff0c;这样一来可以在电脑上给安卓设备安装软件。 ADB 就是连接 Android 手…...

113、单例Bean是单例模式吗?

单例Bean是单例模式吗? 通常来说,单例模式是指在一个JVM中,一个类只能构造出来一个对象,有很多方法来实现单例模式,比如懒汉模式,但是我们通常讲的单例模式有一个前提条件就是规定在一个JVM中,那如果要在两个JVM中保证单例呢?那可能就要用分布式锁这些技术,这里的重点…...

RabbitMQ 集群部署

RabbiMQ 是用 Erlang 开发的,集群非常方便,因为 Erlang 天生就是一门分布式语言,但其本身并不支持负载均衡。 RabbitMQ 的集群节点包括内存节点、磁盘节点。RabbitMQ 支持消息的持久化,也就是数据写在磁盘上,最合适的方案就是既有内存节点,又有磁盘节点。 RabbitMQ 模式大…...

2023年【零声教育】13代C/C++Linux服务器开发高级架构师课程体系分析

对于零声教育的C/CLinux服务器高级架构师的课程到2022目前已经迭代到13代了&#xff0c;像之前小编也总结过&#xff0c;但是课程每期都有做一定的更新&#xff0c;也是为了更好的完善课程跟上目前互联网大厂的岗位技术需求&#xff0c;之前课程里面也包含了一些小的分支&#…...

iOS开发-实现热门话题标签tag显示控件

iOS开发-实现热门话题标签tag显示控件 话题标签tag显示非常常见&#xff0c;如选择你的兴趣&#xff0c;选择关注的群&#xff0c;超话&#xff0c;话题等等。 一、效果图 二、实现代码 由于显示的是在列表中&#xff0c;这里整体控件是放在UITableViewCell中的。 2.1 标签…...

linux系统磁盘性能监视工具iostat

目录 一、iostat介绍 二、命令格式 三、命令参数 四、参考命令&#xff1a;iostat -c -x -k -d 1 &#xff08;一&#xff09;输出CPU 属性值 &#xff08;二&#xff09;CPU参数分析 &#xff08;三&#xff09;磁盘每一列的含义 &#xff08;四&#xff09;磁盘参数分…...

BT#蓝牙 - Link Policy Settings

对于Classic Bluetooth的Connection&#xff0c;有一个Link_Policy_Settings&#xff0c;是HCI configuration parameters中的一个。 Link_Policy_Settings 参数决定了本地链路管理器(Link Manager)在收到来自远程链路管理器的请求时的行为&#xff0c;还用来决定改变角色(rol…...

c++ | 动态链接库 | 小结

//环境 linux c //生成动态链接库 //然后调用动态链接库中的函数//出现的问题以及解决//注意在win和在linux中调用动态链接库的函数是不一样的//在要生成链接库的cpp文件中比如以后要调用本文件中的某个函数&#xff0c;需要extern "c" 把你定的函数“再封装”避免重…...

如何使用Flask-SQLAlchemy来管理数据库连接和操作数据?

首先&#xff0c;我们需要安装Flask-SQLAlchemy。你可以使用pip来安装它&#xff0c;就像这样&#xff1a; pip install Flask-SQLAlchemy好了&#xff0c;现在我们已经有了一个可以操作数据库的工具&#xff0c;接下来让我们来看看如何使用它吧&#xff01; 首先&#xff0c…...

麒麟-飞腾Kylin-V4桌面arm64系统静态编译QT

1.系统具体版本&#xff1a; 2. 因为此版本的源很老了&#xff0c;需要修改版本的源&#xff0c;才能正常更新各种软件&#xff0c;否则&#xff0c;你连麒麟商店都打不开。 sudo vi /etc/apt/sources.list 选择你系统对应版本的源地址&#xff1a; #4.0.2桌面版本: deb ht…...

CentOS 项目发出一篇奇怪的博文

导读最近&#xff0c;在红帽限制其 RHEL 源代码的访问之后&#xff0c;整个社区围绕这件事发生了很多事情。 CentOS 项目发出一篇奇怪的博文 周五&#xff0c;CentOS 项目董事会发出了一篇模糊不清的简短博文&#xff0c;文中称&#xff0c;“发展社区并让人们更容易做出贡献…...

【Mybatis-Plus】or拼接

Mybatis-Plus的or拼接是个坑&#xff1a; 这是需要的结果&#xff1a; queryWrapper.and(c->c.or(a->a.eq("qcs3.status", "SIGNING").eq("qcs.status", "SIGNING")).or(b->b.eq("qcs.status","INVALIDING&q…...

SpringBoot项目部署在Windows与Centos上

文章目录 Windows部署一、github上下载文件winsw二、文件目录三、编辑xml文件四、安装服务五、启动服务六、把jar包放到项目外面七、添加限制内存 Linux部署一、准备二、服务三、操作 Windows部署 windows部署服务借鉴于此篇博文 一、github上下载文件winsw 点击链接下载下图…...

网站服务器出错的原因分析和解决方法

​  网站在日常运行的过程中&#xff0c;难免会遇见一些问题&#xff0c;这次我们就来分析关于网站服务器出错、服务器异常的原因以及如何解决网站服务器错误的方法。 如何知道是网站服务器的问题呢? 只要网站不能正常访问运行&#xff0c;那么一定会反馈相关的错误代码和原…...

电影推荐系统】系统初步搭建及离线个性化推荐

上篇博文我们已经写完统计推荐部分&#xff0c;现在我们将使用VueElement-uiSpringBoot来快速搭建系统&#xff0c;展示出电影&#xff0c;并介绍个性化推荐部分。 1 系统页面设计 初步是想设计一个类似豆瓣电影推荐系统 用户登陆后&#xff0c;可以查看高分电影可以查看推荐…...

Redis 集群 (cluster)

是什么 官网&#xff1a;Redis cluster specification | Redis 由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作…...

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(19)-Fiddler精选插件扩展安装,将你的Fiddler武装到牙齿

1.简介 Fiddler本身的功能其实也已经很强大了&#xff0c;但是Fiddler官方还有很多其他扩展插件功能&#xff0c;可以更好地辅助Fiddler去帮助用户去开发、测试和管理项目上的任务。Fiddler已有的功能已经够我们日常工作中使用了&#xff0c;为了更好的扩展Fiddler&#xff0c…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...