[FPGA]Verilog实现可自定义的倒计时器(24秒为例)
想说的话...
本次实现的是一个24秒倒计时器,功能顾名思义,进行一个24秒的倒计时操作,本文先给出一个简单样例,并结合仿真验证功能,再对样例进行拓展,成为一个可以被调用的模块.
本文未涉及显示模块.
样例_边沿检测计数器
代码讲解
首先给出样例代码.
module CntDwn
(input CK//Clock
,output[4:0]CD//CountDown
);
parameter[4:0]cd=5'd24;//Define a parameter which can be modified when called
reg[4:0]dif=0;//Difference
always@(posedge CK)
if(dif==cd)
dif<=0;
else
dif<=dif+1;
assign CD=cd-dif;
endmodule
这段代码非常简单,原理即利用了一个边沿检测计数器直接实现计时功能,逻辑为每检测到一个升沿,差(dif)自增1,若差满,即和倒计时数相等,则差清零.
在这段代码里将倒计时数初始化为24,这个倒计时数在被其他模块调用的时候可以被修改,可移植性好.
仿真演示
`timescale 1 ns/ 1 ns
module CntDwn_vlg_tst();
reg CK;
wire[4:0]CD;
CntDwn i1 (.CD(CD),.CK(CK));
initial begin
CK=0;
end
always begin
#1 CK<=~CK;
end
endmodule
以上是样例代码的一个仿真文件(.vt),通过ModelSim仿真后波形如下图
如果在仿真文件调用时修改传递参数,将Line 5改为
CntDwn #(.cd(10)) i1 (.CD(CD),.CK(CK));
则波形如下图
可见,本样例代码成功实现了倒计时功能,接下来进行样例代码的拓展.
拓展_自定义倒计时数和倒计时间隔
代码讲解
module CntDwn
(input CK//Clock
,output[4:0]CD//CountDown
);
parameter[4:0]cd=5'd24;//Define a parameter which can be modified when called
parameter[25:0]div=26'd50;//Frequency Division
reg[25:0]cnt=0;//Timer.Control the period
reg[4:0]dif=0;//Difference
always@(posedge CK)
if(cnt==div)begin
cnt<=0;
dif<=dif+1;
end
else if(dif==cd)
dif<=0;
else
cnt<=cnt+1;
assign CD=cd-dif;
endmodule
这是拓展后的代码,加入了分频,可以自定义倒计时的间隔,在调用时修改传递参数来达到自定义间隔和倒计时数的功能.
代码中已经为分频参数初始化为50,方便下面仿真调试.
仿真演示
仿真文件如下
`timescale 1 ns/ 1 ns
module CntDwn_vlg_tst();
reg CK;
wire[4:0]CD;
CntDwn i1 (.CD(CD),.CK(CK));
initial begin
CK=0;
end
always begin
#1 CK<=~CK;
end
endmodule
波形如下
由于分频参数为50,相当于比样例满了50倍,所以等尺寸缩放后时钟信号已经密密麻麻的(甚至密集到只能显示为一条粗粗的线),倒计时仍然功能正常,说明间隔功能无误.
总结
本文概述了如何通过Verilog实现倒计时器,并且加入了波形仿真的知识,方便验证和调试,还考虑到了参数调用的思想,增强代码的可读性,可维护性和可移植性.
值得说明的是,本文代码仍有缺漏,例如在调用时如果需要倒计时数大于32(5位宽),顶层代码中的参数位宽就要手动修改,不是很方便,一个解决方案就是将倒计时数的位宽也定义为一个WIDTH参数,使之也能够被传递不同的参数.分频参数已经定义为26位宽,基本能满足大多数情况的需求,一般不需要进行修改位宽的操作.
如果要实现秒倒计时器,在仿真层面可以将分频参数和自己的激励时钟信号周期相匹配,达到间隔为1秒的效果;如果要在开发板上实现,则需要考虑板载晶振的参数,计算分频参数,在调用时传递参数或直接修改参数来达到1秒间隔.
实例_24秒倒计时器
module CntDwn_24s
(input CK//Clock
,output[4:0]CD//CountDown
);
parameter[4:0]cd=5'd24;//Define a parameter which can be modified when called
parameter[25:0]div=26'd12000000;//Frequency Division,12M
reg[25:0]cnt=0;//Timer.Control the period
reg[4:0]dif=0;//Difference
always@(posedge CK)
if(cnt==div)begin
cnt<=0;
dif<=dif+1;
end
else if(dif==cd)
dif<=0;
else
cnt<=cnt+1;
assign CD=cd-dif;
endmodule
此段代码在板载晶振为12M的情况下正常运行.
[FPGA]Verilog实现可自定义的倒计时器(24秒为例)的更多相关文章
- [FPGA]Verilog 60s秒表计时器(最大可计时间长达9min)
[FPGA]Verilog 60s秒表计时器 1.引述 这次的实验来自于本人本科课程数电结课时的自选题目.由于这次上传是后知后觉,学校已将小脚丫板子回收,所以在这篇文章中没法贴出代码结果的效果图了,但 ...
- [FPGA] Verilog 燃气灶控制器的设计与实现
燃气灶控制器的设计与实现 一.引述 本次实验所用可编程器件型号为MAXII EPM1270T144C5(其引脚表见本人另一博文:可编程实验板EPM1270T144C5使用说明),通过可编程实验板实现一 ...
- FPGA Verilog HDL 系列实例--------步进电机驱动控制
[连载] FPGA Verilog HDL 系列实例 Verilog HDL 之 步进电机驱动控制 步进电机的用途还是非常广泛的,目前打印机,绘图仪,机器人等等设备都以步进电机为动力核心.那么,下面我 ...
- 多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier
1.倒计时器CountDownLatch CountDownLatch是一个多线程控制工具类.通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行 构造函数: public Count ...
- Android倒计时器——CountDownTimer
Android倒计时器--CountDownTimer 说明 第一个参数是倒计时的时间 第二个参数是多长时间执行一次回调 /** * @param millisInFuture The number ...
- 多线程控制工具类--倒计时器CountDownLatch的使用(模仿火箭发射)
package com.thread.test.Lock; import java.util.Random; import java.util.concurrent.CountDownLatch; i ...
- 3.1.5 倒计时器:CountDownLatch
package 第三章.倒计时器CountDownLatch; import java.util.concurrent.CountDownLatch; /** * Created by zzq on ...
- 【JavaScript】分秒倒计时器
一.基本目标 在JavaScript设计一个分秒倒计时器,一旦时间完毕使button变成不可点击状态 详细效果例如以下图.为了说明问题.调成每50毫秒也就是每0.05跳一次表, 真正使用的时候,把wi ...
- Java基础教程:多线程基础(5)——倒计时器(CountDownLatch)
Java基础教程:多线程基础(5)——倒计时器(CountDownLatch) 引入倒计时器 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种 ...
随机推荐
- Jedis运用scan删除正则匹配的key
jedis运用scan删除正则匹配的key 我们都知道用keys *进行查询key的时候会进行堵塞,导致redis整体不可用,而使用scan命令则不会. RedisServiceImpl中sca ...
- 在已有 Windows10 系统的基础上,安装 Ubuntu17.10 系统(新版 BIOS)
1.第一步,下载Ubuntu系统镜像 2.第二步,制作启动U盘,使用UltralSO,步骤:打开文件——选择iso文件——启动——写入硬盘映像——选择U盘——写入 3.第三步,分区,在Windows徽 ...
- Asp.net Core全局异常监控和记录日志
前言 系统异常监控可以说是重中之重,系统不可能一直运行良好,开发和运维也不可能24小时盯着系统,系统抛异常后我们应当在第一时间收到异常信息.在Asp.net Core里我使用拦截器 ...
- python小例子(一)
参考链接:https://zhuanlan.zhihu.com/p/83998758?utm_source=qq&utm_medium=social&utm_oi=7282008528 ...
- UE4蓝图与C++交互——射击游戏中多武器系统的实现
回顾 学习UE4已有近2周的时间,跟着数天学院"UE4游戏开发"课程的学习,已经完成了UE4蓝图方面比较基础性的学习.通过UE4蓝图的开发,我实现了类似CS的单人版射击游戏,效 ...
- Net Core中 使用Middleware 实现反向代理
有这样的一个需求,我们要拦截某些特定的请求,并将它们重新定向到另一台服务器中,然而客户端并不知情. 在NetCore中我们可以用中间件来实现, 首先创建项目: 我这里只有2.1 Version 的 添 ...
- Spring Boot (日志篇):Log4j2整合ELK,搭建实时日志平台
一.安装JDK1.8以上版本 1.从Oracle官网上下载Linux x64版本的 下载地址: http://www.oracle.com/technetwork/java/javase/downlo ...
- [2018-07-4] django笔记
新建app python ..\venv\scripts\django-admin.py startapp cy python manage.py makemigrations python mana ...
- Python SQLAlchemy入门教程
本文将以Mysql举例,介绍sqlalchemy的基本用法.其中,Python版本为2.7,sqlalchemy版本为1.1.6. 一. 介绍 SQLAlchemy是Python中最有名的ORM工具. ...
- CSPS模拟 58
爆炸 没算内存见祖宗 为什么偏偏这次卡内存我没算 T1 HashMap各种水 T2 智障背包!但是卡内存! T3 Dashspeed 考试用点分治+线段树水到了80 实际上是个没见过的套路题 在之前的 ...