verilog实现毫秒计时器


整体电路图

实验状态图



Stop代表没有计时,Start代表开始计时,Inc代表计时器加1,Trap代表inc按钮按下去时候的消抖状态。

状态编码表

实验设计思路

  • 时钟分频:用一个diver=49999来让count从0根据100MHz的内部时钟变化到diver让myclk取反一次,以达到myclk的频率为1KHz的时钟。
  • 计时器:以myclk来触发,从小数点后第三位开始计数,每次+1,用往前面进位的方法,从而不需要分成四个自定义时钟。
  • 显示器:定义好七段译码器的数字显示,然后每次挑选一位数字,分频每次显示一位,小数点同最高位同时显示消失。分频足够低的时候,肉眼的视觉暂留效果,看起来就是同时显示。
  • 亮点:代码全程用模块实现,简单易读易维护。

完整代码

//counter.v
`timescale 1ns / 1ps module counter(
input myclk,
input reset,
input cen,
output [15:0] number
); wire up0, up1, up2; counter4bit c1(
.myclk(myclk),
.reset(reset),
.cen(cen),
.four(number[3:0]),
.up(up0)
); counter4bit c2(
.myclk(myclk),
.reset(reset),
.cen(cen & up0),
.four(number[7:4]),
.up(up1)
); counter4bit c3(
.myclk(myclk),
.reset(reset),
.cen(cen & up0 & up1),
.four(number[11:8]),
.up(up2)
); counter4bit c4(
.myclk(myclk),
.reset(reset),
.cen(cen & up0 & up1 & up2),
.four(number[15:12]),
.up()
); endmodule

//clk_div.v
`timescale 1ns / 1ps module clk_div(
input clk_in,
input reset,
output reg clk_out
);
parameter diver = 49999;//for FPGA
//parameter diver = 4;//for test
reg [15:0] count;//just for 49999 or warning always@(posedge clk_in or posedge reset)
begin
if(reset)
begin
count <= 0;
clk_out <= 1'b0;
end
else if(count == diver)
begin
clk_out <= ~clk_out;
count <= 0;
end
else
begin
count <= count + 1'b1;
end
end endmodule

//MillisecondCounter.v
`timescale 1ns / 1ps module MillisecondCounter(
input start,
input stop,
input inc,
input clk,
input reset,
output [3:0] en,
output [6:0] light,
output dot
); wire myclk;
wire cen;
wire [15:0] number; clk_div d(
.clk_in(clk),
.reset(reset),
.clk_out(myclk)
); state_transform st(
.start(start),
.stop(stop),
.inc(inc),
.myclk(myclk),
.reset(reset),
.cen(cen)
); counter ct(
.myclk(myclk),
.reset(reset),
.cen(cen),
.number(number[15:0])
); show_number sn(
.myclk(myclk),
.reset(reset),
.number(number[15:0]),
.en(en[3:0]),
.light(light[6:0]),
.dot(dot)
); endmodule

//counter4bit.v
`timescale 1ns / 1ps module counter4bit(
input myclk,
input reset,
input cen,
output reg [3:0] four,
output up
); assign up = (four == 4'b1001) ? 1'b1 : 1'b0; always@(posedge myclk or posedge reset)
begin
if(reset)
four <= 0;
else if(cen)
begin
if(four == 4'b1001)
four <= 0;
else
four <= four + 1'b1;
end
end endmodule

//state_transform.v
`timescale 1ns / 1ps module state_transform(
input start,
input stop,
input inc,
input myclk,
input reset,
output reg cen
);
parameter STOP = 2'b00, START = 2'B01, INC = 2'b10, TRAP = 2'b11; reg [1:0] state, nextstate; always@(posedge myclk or posedge reset)
begin
if(reset)
state <= STOP;
else
state <= nextstate;
end always@(*)
begin
case(state)
STOP:
if(stop) nextstate <= STOP;
else if(start) nextstate <= START;
else if(inc) nextstate <= INC;
else nextstate <= STOP;
START:
if(start) nextstate <= START;
else if(stop) nextstate <= STOP;
else nextstate <= START;
INC:
nextstate <= TRAP;
TRAP:
if(inc) nextstate <= TRAP;
else nextstate <= STOP;
default:
nextstate <= STOP;
endcase
end always@(*)
begin
case(state)
STOP: cen <= 1'b0;
START: cen <= 1'b1;
INC: cen <= 1'b1;
TRAP: cen <= 1'b0;
default: cen <= 1'b0;
endcase
end endmodule

//show_number.v
`timescale 1ns / 1ps module show_number(
input myclk,
input reset,
input [15:0] number,
output reg [3:0] en,
output reg [6:0] light,
output dot
); reg [1:0] index;
reg [3:0] num_index; assign dot = (index == 2'b11) ? 1'b0 : 1'b1; always@(posedge myclk or posedge reset)
begin
if(reset)
index <= 0;
else
index <= index + 1'b1;
end always@(*)
begin
case(index)
2'b00: en <= 4'b1110;
2'b01: en <= 4'b1101;
2'b10: en <= 4'b1011;
2'b11: en <= 4'b0111;
default: en <= 4'b1111;
endcase
end always@(*)
begin
case(index)
2'b00: num_index <= number[3:0];
2'b01: num_index <= number[7:4];
2'b10: num_index <= number[11:8];
2'b11: num_index <= number[15:12];
default: num_index <= 4'b0000;
endcase
end always@(*)
begin
case(num_index)
4'b0000: light <= 7'b0000001;
4'b0001: light <= 7'b1001111;
4'b0010: light <= 7'b0010010;
4'b0011: light <= 7'b0000110;
4'b0100: light <= 7'b1001100;
4'b0101: light <= 7'b0100100;
4'b0110: light <= 7'b0100000;
4'b0111: light <= 7'b0001111;
4'b1000: light <= 7'b0000000;
4'b1001: light <= 7'b0000100;
default: light <= 7'b1111111;
endcase
end endmodule

仿真测试文件

//VTF_Millisecond.v
`timescale 1ns / 1ps module VTF_Millisecond; // Inputs
reg start;
reg stop;
reg inc;
reg clk;
reg reset; // Outputs
wire [3:0] en;
wire [6:0] light;
wire dot; // Instantiate the Unit Under Test (UUT)
MillisecondCounter uut (
.start(start),
.stop(stop),
.inc(inc),
.clk(clk),
.reset(reset),
.en(en),
.light(light),
.dot(dot)
); initial begin
// Initialize Inputs
start = 0;
stop = 0;
inc = 0;
clk = 0;
reset = 1; // Wait 100 ns for global reset to finish
#100;
reset = 0;
// Add stimulus here
start = 1;
#1200;
start = 0;
stop = 1;
#200;
inc = 1;
#200;
stop = 1;
#200;
start = 1;
#200;
inc = 0;
#200;
reset = 1;
#200;
reset = 0;
end always #2 clk = ~clk; endmodule

verilog实现毫秒计时器的更多相关文章

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

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

  2. js实现时分秒毫秒计时器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. [FPGA]Verilog实现可自定义的倒计时器(24秒为例)

    目录 想说的话... 样例_边沿检测计数器 代码讲解 仿真演示 拓展_自定义倒计时数和倒计时间隔 代码讲解 仿真演示 总结 实例_24秒倒计时器 想说的话... 本次实现的是一个24秒倒计时器,功能顾 ...

  4. Android线程计时器实现

    cocos2dx的计时器很好用,但当app进入后台,其计时器会pause掉,如果想要一个稳恒计时器就得自己去实现完成了,在Cocos2d-x for ios中我们可以利用NSTimer类并结合objc ...

  5. LabVIEW串口通信

    Instrument I/O 利用LabVIEW内置的驱动程序库和具有工业标准的设备驱动软件,可对 GPIB(通用接口总线).Ethernet(以太网)接口.RS-232(标准串行接口总线)/RS-4 ...

  6. Labview中定时函数之间的区别

    第一个定时函数(时间延迟):在VI中插入时间延迟,指定在运行调用VI之前延时的秒数.默认值为1.000. 第一个定时函数(等待(ms)):等待指定长度的毫秒数,并返回毫秒计时器的值.该函数进行异步系统 ...

  7. 微信小程序倒计时组件开发

    今天给大家带来微信小程序倒计时组件具体开发步骤: 先来看下最终效果: git源:http://git.oschina.net/dotton/CountDown 分步骤-性子急的朋友,可以直接看最后那段 ...

  8. 【system.date】使用说明

    对象:system.date 说明:提供一系列针对日期类型的操作 目录: 方法 返回 说明  system.date.isDate( date_string )  [True | False]  判断 ...

  9. 浅谈labviEW定时器

    Labview提供了五种定时器:普通定时器3种: Tick Count (ms). Wait(ms).Wait Until Next ms  Multipule(等待下一个毫秒的整数倍) API函数定 ...

随机推荐

  1. 线程池ThreadPoolExecutor使用原理

    本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...

  2. DHU 1788 Chinese remainder theorem again 中国剩余定理

    Chinese remainder theorem again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  3. JDBC进行事务管理

    JDBC进行事务管理 事务的四个特征:原子性 : 是指事务中包含的操作都被看做是一个逻辑单元一致性: 开始前和结束后数据库都处于一致性状态隔离性: 对数据库修改的多个事务是彼此隔离的持久性 事务完成之 ...

  4. Asp.net MVC流程简述

    先上个图 步骤一 IIS   当请求到达我们的服务器时,在asp.net取得控制之前,windows操作系统的核心组件 HTTP.SYS一直在监听请求端口,  接下来asp.net会通知所有注册的ht ...

  5. Swift 函数调用到底写不写参数名

    最近真正开始学 Swift,在调用函数的时候遇到一个问题:到底写不写函数名? 我们来看两个个例子: // 1 func test(a: Int, b: Int) ->Int { return a ...

  6. 记录在window平台安装python的第三库(py,whl)

    在下载python的第三库文件的时候,有些库文件有exe的发行版,但是有些第三库并没有找到针对于window的可执行文件安装包即exe文件,而只有源代码文件即py文件,和whl文件. 下面记录一下在w ...

  7. Yii 时间戳格式化显示的问题

    这个控件是CJuiDatePicker控件的扩展,支持时分秒. 下载地址:http://www.yiiframework.com/extension/timepicker/ 这个控件用在view里的_ ...

  8. css实现div不定宽高垂直水平居中解决方案

    在项目中我们经常能碰见然图片垂直水平居中,不定宽高的div垂直水平居中,等等~~ 现在我将介绍我所知道的几种用css来解决的几种方案. 1.父元素text-align:center;display:t ...

  9. How to download a CRX file from the Chrome web store

    如何从 谷歌浏览器商店 离线下载 谷歌浏览器扩展 Simply copying the Chrome store extension url to the following website: htt ...

  10. MVP+Dagger2+Rxjava+Retrofit+GreenDao 小应用,包含新闻、图片、视频3个大模块,代码整洁干练

    练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的,代码量还是有的,里面做了大量封装,整体代码整理得很干净,这个我已经尽力整理了.不管是文件(Java.xml. ...