想说的话...

本次实现的是一个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秒为例)的更多相关文章

  1. [FPGA]Verilog 60s秒表计时器(最大可计时间长达9min)

    [FPGA]Verilog 60s秒表计时器 1.引述 这次的实验来自于本人本科课程数电结课时的自选题目.由于这次上传是后知后觉,学校已将小脚丫板子回收,所以在这篇文章中没法贴出代码结果的效果图了,但 ...

  2. [FPGA] Verilog 燃气灶控制器的设计与实现

    燃气灶控制器的设计与实现 一.引述 本次实验所用可编程器件型号为MAXII EPM1270T144C5(其引脚表见本人另一博文:可编程实验板EPM1270T144C5使用说明),通过可编程实验板实现一 ...

  3. FPGA Verilog HDL 系列实例--------步进电机驱动控制

    [连载] FPGA Verilog HDL 系列实例 Verilog HDL 之 步进电机驱动控制 步进电机的用途还是非常广泛的,目前打印机,绘图仪,机器人等等设备都以步进电机为动力核心.那么,下面我 ...

  4. 多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier

    1.倒计时器CountDownLatch CountDownLatch是一个多线程控制工具类.通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行 构造函数: public Count ...

  5. Android倒计时器——CountDownTimer

    Android倒计时器--CountDownTimer 说明 第一个参数是倒计时的时间 第二个参数是多长时间执行一次回调 /** * @param millisInFuture The number ...

  6. 多线程控制工具类--倒计时器CountDownLatch的使用(模仿火箭发射)

    package com.thread.test.Lock; import java.util.Random; import java.util.concurrent.CountDownLatch; i ...

  7. 3.1.5 倒计时器:CountDownLatch

    package 第三章.倒计时器CountDownLatch; import java.util.concurrent.CountDownLatch; /** * Created by zzq on ...

  8. 【JavaScript】分秒倒计时器

    一.基本目标 在JavaScript设计一个分秒倒计时器,一旦时间完毕使button变成不可点击状态 详细效果例如以下图.为了说明问题.调成每50毫秒也就是每0.05跳一次表, 真正使用的时候,把wi ...

  9. Java基础教程:多线程基础(5)——倒计时器(CountDownLatch)

    Java基础教程:多线程基础(5)——倒计时器(CountDownLatch) 引入倒计时器 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种 ...

随机推荐

  1. VS Code断点调试PHP超详细萌新教程

    AppServ安装 1. 下载 2. 安装,一路默认设置顺便设置sql密码即可.这里建议不要修改端口,后续教程默认80端口. 3.点我测试,有下图则恭喜你AppServ安装完成. Xdebug配置 1 ...

  2. SpringBoot与MybatisPlus3.X整合示例(十六)

    包含 分页.逻辑删除.自定义全局操作 等绝大部分常用功能的使用示例,相当于大整合的完整示例 pom.xml <dependencies> <dependency> <gr ...

  3. C#开发命令执行驱动程序 之 读入命令行参数

    /// <summary> /// 在cmd窗体内执行如下: /// OrderDriverApp.exe Order Driver App /// 返回: /// The args ar ...

  4. dbms_job基础

    a.创建job: dbms_job.submit(jobno,what,next_date,interval);b.删除job: dbms_job.remove(jobno); c.修改要执行的操作: ...

  5. 二:Mysql库相关操作

    1:系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等.performance_schema: My ...

  6. 身份证号码验证算法(php和js实现)

    原文:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=21126994&id=3938244 http://www.jb ...

  7. Java后端开发工作 - 写接口

    我在公司的工作内容是,对于一个BS应用,负责服务器端开发工作,Java语言.与前端开发人员合作,最终提供给前端RESTFUL接口,保证页面正常响应. 经验之谈 一个接口可以理解为一个业务逻辑,一个业务 ...

  8. MySQL的统计信息学习总结

    统计信息概念 MySQL统计信息是指数据库通过采样.统计出来的表.索引的相关信息,例如,表的记录数.聚集索引page个数.字段的Cardinality.....MySQL在生成执行计划时,需要根据索引 ...

  9. 学习笔记22_AspMvc简介

    *Mvc和webForm区别 1. Mvc模式下,前台和后台的交流,是后台提供数据,使用对象包裹的形式,前台来使用,类似于webForm定义一个属性那样. 2.Mvc模式下,再也不是使用this.la ...

  10. shell 字符串比较与脚本 too many arguments 报错

    一.问题 最近在写 shell 脚本的时候,遇到了一些小问题,就是我在判断一个字符串是否为空的时候经常报下面的错,程序是正常执行了,但是有这个提示很蛋疼,下面就是看看是什么问题导致的? [: too ...