
FPGA基础实例---数字跑表
实例主要内容 实例目标 原理简介 代码分析
发布日期:2021-05-07 17:48:00
浏览次数:25
分类:精选文章
本文共 2584 字,大约阅读时间需要 8 分钟。
数字跑表设计与实现
目录
1. 实例主要内容
通过Verilog语言编写一个具有“百分秒、秒、分”计时功能的数字跑表,可以实现一个小时以内精确到百分之一秒的计时。数字跑表的显示可以通过编写数码管显示程序来实现,本实例只给出了数字跑表的实现过程。同时可以增加小时的计时功能,实现完整的跑表功能。
2. 实例目标
本实例主要实现计数即进位的设计,通过几个always模块的设计实现一个特定用途的模块-数字跑表。
3. 原理简介
本数字跑表首先从最低位的百分秒计数器开始,按照系统时钟进行计数。计数至100后向秒计数器进位,秒计数器以百分秒计数器的进位位为时钟进行计数。计数至60后向分计数器进位,分计数器以秒计数器的进位位为时钟进行计数,读者可以自行增加小时计数器。
如果使用同一使用系统时钟作为计数时钟,则计数器将是一个6000进制的计数器,而分计数器将是一个3600000进制的计数器。这样将极大的浪费FPGA的逻辑资源。而使用进位位作为计数时钟,只需要一个100进制的计数器和两个60进制的计数器。
在实际的设计中,为了让计数器更加简单,计数器使用高低位两个计数器实现。100进制计数器分别是高位10进制计数器,低位10进制计数器;60进制计数分别是高位6进制计数器,低位10进制计数器。这样整个数字跑表使用6个计数器实现。
同时由于10进制计数器重复使用了5次,可以使用独立的模块实现10进制计数器,这样就可以通过模块复用来节省整个模块使用的资源。数字跑表提供清零为CLR和暂停为PAUSE,百分秒的时钟信号可以通过系统时钟分频提供。分频至1/100s,即可实现真实的时间计数。
4. 代码分析
首先给出代码中端口信号的定义,可根据这些端口与自己的工程设计连接。
- CLK:时钟信号
- CLR:异步复位信号
- PAUSE:暂停信号
- MSH、MSL:百分秒的高位和低位
- SH、SL:秒信号的高位和低位
- MH、ML:分钟信号的高位和低位
代码为:
module paobiao(CLK,CLR,PAUSE,MSH,MSL,SH,SL,MH,ML);input CLK,CLR;input PAUSE;output [3:0] MSH,MSL,SH,SL,MH,ML;reg [3:0] MSH,MSL,SH,SL,MH,ML;reg cn1,cn2;//cn1为百分秒向秒的进位,cn2位秒向分的进位//百分秒计数模块always @(posedge CLK or negedge CLR)begin if(!CLR) begin MSH <= 4'd0; MSL <= 4'd0; cn1 <= 0; end else if(!PAUSE) //PAUSE为0时正常计数,为1时暂停计数 begin if(MSL == 9) begin MSL <= 0; if(MSH == 9) begin MSH <= 0; //低、高位计数至10时,高位归零 cn1 <= 1; end else begin MSH <= MSH + 1; //低位计数至10,高位计数 end end else begin MSL <= MSL + 1; //低位计数未至10时,低位计数 cn1 <= 0; end endend//秒计数模块always @(posedge cn1 or negedge CLR)begin if(!CLR) begin SH <= 0; SL <= 0; cn2 <= 0; end else if(SL == 9) begin SL <= 0; if(SH == 5) begin SH <= 0; //低位计数至10,高位计数至6时,高位归零 cn2 <= 1; end else begin SH <= SH + 1; //低位计数至10,高位计数未至6时,高位计数 end end else begin SL <= SL + 1; //低位计数未至10时,低位计数 cn2 <= 0; endend//分钟计数模块always @(posedge cn2 or negedge CLR)begin if(!CLR) begin MH <= 0; ML <= 0; end else if(ML == 9) begin ML <= 0; //低位计数至10时,低为归零 if(MH == 5) begin MH <= 0; //低位计数至10,高位计数至6时,高位归零 end else begin MH <= MH + 1; //低位计数至10,高位计数未至6时,高位计数 end end else begin ML <= ML + 1; //低位计数未至10时,低位计数 endendendmodule
通过上面的这3个模块,即可实现数字跑表的功能。
补充说明
可以尝试添加小时计数单元。
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年03月20日 19时40分39秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
计算输入的一句英文语句中单词数
2019-03-05
lvs+keepalive构建高可用集群
2019-03-05
Mysql高可用架构(主从同步)
2019-03-05
mysql主从延迟高的原因
2019-03-05
ATS缓存数据结构
2019-03-05
glob模块
2019-03-05
6 个 Linux 运维典型问题
2019-03-05
oracle无法启动asm实例记录
2019-03-05
取消vim打开文件全是黄色方法
2019-03-05
一个系统部署多个tomcat实例
2019-03-05
HP服务器设置iLO
2019-03-05
从头实现一个WPF条形图
2019-03-05
.NET CORE(C#) WPF 方便的实现用户控件切换(祝大家新年快乐)
2019-03-05
使用QT实现一个简单的登陆对话框(纯代码实现C++)
2019-03-05
QT :warning LNK4042: 对象被多次指定;已忽略多余的指定
2019-03-05
GLFW 源码 下载-编译-使用/GLAD配置
2019-03-05
针对单个网站的渗透思路
2019-03-05
Typescript 学习笔记六:接口
2019-03-05
【ASP.NET】ASP.NET中权限验证使用OnAuthorization实现
2019-03-05