首页 分享 数字时钟计数器(内含模60计数器以及8421BCD码计数器设计代码)

数字时钟计数器(内含模60计数器以及8421BCD码计数器设计代码)

来源:花匠小妙招 时间:2024-12-05 15:02

目录

前言

模60计数器

verilog设计代码如下:

ISE综合

模24的8421BCD码计数器

原理

verilog HDL代码

测试文件

仿真波形

数字时钟计数器

verilog HDL代码

测试代码

仿真波形

ISE综合

前言

这是我刚开始写博客时候写的了,本身结构很丑,我于2018/8/2 15:26重新整理了下结构,就不删了,然后我又重新整理了一份博文,和这个一样,但要比这个清晰,贴出地址:数字时钟计数器(Verilog HDL语言描述)(仿真和综合),可以看这篇以及相关的那几个小模块部分。

简单的数字时钟计数器,其实现方法也是通过计数器的级联,由两个模60计数器和一个模24计数器子模块共同构成,下面的这段代码采用结构性描述方法,U1,U2,U3为调用的两个模60计数器和一个模24计数器子模块,模60计数器实现分秒的计数,模24计数器实现小时的计数。

在进行设计数字时钟计数器之前,分别介绍模60计数器count60以及8421BCD计数器count24。

模60计数器

verilog设计代码如下:

//模60计数器模块 module counter60(clk, rst_n, en, dout, co);input clk, rst_n, en;output co;output [7:0] dout;wire co10_1, co10, co6;wire [3:0] dout10, dout6;count10 U1(.clk(clk), .rst_n(rst_n), .en(en), .dout(dout10), .co(co10_1));count6 U2(.clk(clk), .rst_n(rst_n), .en(co10), .dout(dout6), .co(co6));and U3(co, co10, co6);and U4(co10, en, co10_1);assign dout = {dout6, dout10}; endmodule //模10计数器 module count10(clk, rst_n, en, dout, co);input clk, rst_n, en;output co;output [3:0] dout;reg [3:0] dout;always @ (posedge clk or negedge rst_n)beginif(!rst_n) dout <= 4'b0000;else if(en == 1'b1) begin if(dout == 4'b1001) dout <= 4'b0000; else dout <= dout + 1'b1; endelse dout <= dout;endassign co = dout[0] & dout[3]; endmodule //模6计数器 module count6(clk, rst_n, en, dout, co);input clk, rst_n, en;output co;output [3:0] dout;reg [3:0] dout;always @(posedge clk or negedge rst_n)beginif(!rst_n)dout <= 4'b0000;else if(en == 1'b1)begin if(dout == 4'b0101) dout <= 4'b0000; else dout <= dout + 1;endelsedout <= dout;endassign co = dout[0] & dout[2]; endmodule

ISE综合

综合工具综合而出的电路如下:

模24的8421BCD码计数器

原理

计数器实现的模制为24,clr为异步清零信号,当时钟上升沿到来或clr下降沿到来,

clr = 0时,计数器清零为0000_0000。该计数器的计数过程为,当输出信号的低4位(即 dout[3:0])从0000计数到1001后(即十进制的0 ~ 9),高4位(即dout[3:4])计数加1,当计数计到23时(即0010_0011),计数器又清零为0000_0000,然后重新开始计数。

verilog HDL代码

//8421BCD码计数器,模24 module counter24(clk, rst_n, en, dout); input clk, rst_n, en; output[7:0] dout; reg[7:0] dout; always@(posedge clk or negedge rst_n) //异步复位 beginif(!rst_n) //复位信号有效时,输出清零dout <= 8'b00000000;else if(en == 1'b0) //计数使能无效时,输出不变dout <= dout;else if( (dout[7:4] == 4'b0010)&&(dout[3:0] == 4'b0011) ) //计数达到23时,输出清零dout <= 8'b00000000;else if(dout[3:0] == 4'b1001) //低位达到9时,低位清零,高位加1begindout[3:0] <= 4'b0000;dout[7:4] <= dout[7:4] + 1'b1;endelse //上述情况都没有发生,则高位不变,低位加1begindout[7:4] <= dout[7:4];dout[3:0] <= dout[3:0] + 1'b1;end end endmodule

测试文件

`timescale 1ns/1ps module count24_tb; reg clk, clr, en; wire [7:0] dout; always begin #10 clk = ~clk; end initial begin clk = 1'b0; clr = 1'b1; en = 1'b0; #20 clr = 1'b0; #10 clr = 1'b1; #30 en = 1'b1; #100; end count24 U1(.clk(clk), .clr(clr), .en(en), .dout(dout)); endmodule

仿真波形

在Modelsim中仿真得到的波形为:(为了能看清,截了一部分图片)

 

数字时钟计数器

verilog HDL代码

下面正式给出数字时钟计数器的verilog HDL代码:

//数字时钟计数器 module digital_clock(hour,min,sec,clk,rst_n,en); input clk,rst_n,en; output[7:0] hour, min, sec; wire co_sec1,co_sec,co_min,co_min1; counter60 u1(.clk(clk), .rst_n(rst_n), .en(en), .dout(sec), .co(co_sec1)); and u2(co_sec,en,co_sec1); counter60 u3(.clk(clk), .rst_n(rst_n), .en(co_sec), .dout(min), .co(co_min1)); and u4(co_min,co_sec,co_min1); counter24 u5(.clk(clk), .rst_n(rst_n), .en(co_min), .dout(hour)); endmodule //模60计数器模块 module counter60(clk, rst_n, en, dout, co);input clk, rst_n, en;output co;output [7:0] dout;wire co10_1, co10, co6;wire [3:0] dout10, dout6;count10 U1(.clk(clk), .rst_n(rst_n), .en(en), .dout(dout10), .co(co10_1));count6 U2(.clk(clk), .rst_n(rst_n), .en(co10), .dout(dout6), .co(co6));and U3(co, co10, co6);and U4(co10, en, co10_1);assign dout = {dout6, dout10}; endmodule //模10计数器 module count10(clk, rst_n, en, dout, co);input clk, rst_n, en;output co;output [3:0] dout;reg [3:0] dout;always @ (posedge clk or negedge rst_n)beginif(!rst_n) dout <= 4'b0000;else if(en == 1'b1) begin if(dout == 4'b1001) dout <= 4'b0000; else dout <= dout + 1'b1; endelse dout <= dout;endassign co = dout[0] & dout[3]; endmodule //模6计数器 module count6(clk, rst_n, en, dout, co);input clk, rst_n, en;output co;output [3:0] dout;reg [3:0] dout;always @(posedge clk or negedge rst_n)beginif(!rst_n)dout <= 4'b0000;else if(en == 1'b1)begin if(dout == 4'b0101) dout <= 4'b0000; else dout <= dout + 1;endelsedout <= dout;endassign co = dout[0] & dout[2]; endmodule //8421BCD码计数器,模24 module counter24(clk, rst_n, en, dout); input clk, rst_n, en; output[7:0] dout; reg[7:0] dout; always@(posedge clk or negedge rst_n) //异步复位 beginif(!rst_n) //复位信号有效时,输出清零dout <= 8'b00000000;else if(en == 1'b0) //计数使能无效时,输出不变dout <= dout;else if( (dout[7:4] == 4'b0010)&&(dout[3:0] == 4'b0011) ) //计数达到23时,输出清零dout <= 8'b00000000;else if(dout[3:0] == 4'b1001) //低位达到9时,低位清零,高位加1begindout[3:0] <= 4'b0000;dout[7:4] <= dout[7:4] + 1'b1;endelse //上述情况都没有发生,则高位不变,低位加1begindout[7:4] <= dout[7:4];dout[3:0] <= dout[3:0] + 1'b1;end end endmodule

测试代码

//数字时钟计数器的测试代码 module digital_clock_tb; reg clk,rst_n,en; wire[7:0] hour,min,sec; always begin#1 clk = ~clk; end initial beginclk = 1'b0; rst_n = 1'b0;en = 1'b0;#3 rst_n = 1'b1; en = 1'b1; end digital_clock u0(.clk(clk),.rst_n(rst_n),.en(en),.hour(hour),.min(min),.sec(sec)); endmodule

仿真波形

在Modelsim中仿真得到如下波形图:

 

ISE综合

用综合工具综合后的数字时钟:

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/80373163

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com

相关知识

盆花自动浇水系统的设计.doc
智能花盆自动浇水系统的设计
智能花盆自动浇水系统的设计说明书
用功能指令改变计数器C0的设定值,当X1、X0=00时设定值为10,当X1、X0
自动浇水系统设计说明
智能花盆自动浇水系统的设计论文.doc
智能花盆自动浇水系统的设计.docx
花卉温室控制系统设计(论文)
彩灯控制电路设计
花园自动浇灌系统的设计 王天宇0601

网址: 数字时钟计数器(内含模60计数器以及8421BCD码计数器设计代码) https://www.huajiangbk.com/newsview893363.html

所属分类:花卉
上一篇: FPGA学习篇之计数器
下一篇: 基于 Verilog 的经典数字

推荐分享