当前位置: 首页 > 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…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...