[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) 引入倒计时器 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种 ...
随机推荐
- 百万年薪python之路 -- 面向对象初始
面向对象初始 1.1 面向过程编程vs函数式编程 函数编程较之面向过程编程最明显的两个特点: 1,减少代码的重用性. 2,增强代码的可读性. 1.2 函数式编程vs面向对象编程 面向对象编程:是一类相 ...
- Java描述设计模式(16):代理模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 在电商高速发展的今天,快递的数量十分庞大,甚至出现了快递代理行业,简单的说就是快递的主人没有时间收快递,会指定一个 ...
- day1-02 python程序语法分析
一.概述 程序的格式框架 命名与保留字 数据类型 语句与函数 Python程序的输入输出 二.程序的格式框架 # TempConvert.py # 输入温度 TempStr = input(" ...
- 是可忍孰不可忍!!nodepad++作者台独分子,恶毒言论!!!
本来用了两年这个软件吧,不带任何情感的,单纯辅助工具.直到今天,在GitHub上,发现了这个作者以及一些同党都是一群尼玛生在中国骂中国的狗币. https://github.com/notepad-p ...
- (乱入)FingerGesture
偶然的机会遇到FingerGesture插件,此插件也有很多方便的功能,比如控制主相机查看模型以及缩放等功能,如Component-FingerGestures-Toolbox-Camera-Orbi ...
- CSAPP:代码优化【矩阵运算】
编程除了使程序在所有可能的情况下都正确工作,还需要考虑程序的运行效率,上一节主要介绍了关于读写的优化,本节将对运算的优化进行分析.读写优化 编写高效程序需要做到以下两点: 选择一组合适的算法和数据结构 ...
- CentOS 7 的root口令破解两种方法
破解CentOS7的root口令 方法一: 第一步: 启动时任意键暂停启动 按-e-键进入编辑模式 第二步: 1.将光标移动至蓝框处linux16开头的行,添加内核参数 rd.break 2.按ctr ...
- .NET Core 3.0 中间件 Middleware
中间件官网文档解释:中间件是一种装配到应用管道以处理请求和响应的软件 每个中间件: 选择是否将请求传递到管道中的下一个组件. 可在管道中的下一个组件前后执行工作. 使用 IApplicationBui ...
- egg-mongoose --- nodejs
项目 egg + mongoose 项目结构 配置 egg 安装模块 npm i egg-mongoose --save config/pulgin.js exports.mongoose = { e ...
- Java对象的"后事处理"——垃圾回收(二)
1 先谈Finalize() finalize()能做的所有工作,使用try-finally或者其他方式都可以做得更好.更及时,所以笔者建议大家完全可以忘掉Java语言中有这个方法的存在. ——< ...