我是靠谱客的博主 儒雅黄豆,最近开发中收集的这篇文章主要介绍数字时钟计数器(内含模60计数器以及8421BCD码计数器设计代码),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

前言

模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)
		begin
			if(!rst_n)
				dout <= 4'b0000;
			else if(en == 1'b1)
				begin
					if(dout == 4'b1001)
						dout <= 4'b0000;
					else 
						dout <= dout + 1'b1;
				end
			else
				dout <= dout;
		end
		
	assign 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)
		begin
		if(!rst_n)
			dout <= 4'b0000;
		else if(en == 1'b1)
			begin
				if(dout == 4'b0101)
					dout <= 4'b0000;
				else
					dout <= dout + 1;
			end
		else
			dout <= dout;
		end
	assign 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)          //异步复位
begin
	if(!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时,低位清零,高位加1
	begin
		dout[3:0] <= 4'b0000;
		dout[7:4] <= dout[7:4] + 1'b1;
	end
	else                     //上述情况都没有发生,则高位不变,低位加1
	begin
		dout[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)
		begin
			if(!rst_n)
				dout <= 4'b0000;
			else if(en == 1'b1)
				begin
					if(dout == 4'b1001)
						dout <= 4'b0000;
					else 
						dout <= dout + 1'b1;
				end
			else
				dout <= dout;
		end
		
	assign 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)
		begin
		if(!rst_n)
			dout <= 4'b0000;
		else if(en == 1'b1)
			begin
				if(dout == 4'b0101)
					dout <= 4'b0000;
				else
					dout <= dout + 1;
			end
		else
			dout <= dout;
		end
	assign 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)          //异步复位
begin
	if(!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时,低位清零,高位加1
	begin
		dout[3:0] <= 4'b0000;
		dout[7:4] <= dout[7:4] + 1'b1;
	end
	else                     //上述情况都没有发生,则高位不变,低位加1
	begin
		dout[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
begin
	clk = 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综合

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

最后

以上就是儒雅黄豆为你收集整理的数字时钟计数器(内含模60计数器以及8421BCD码计数器设计代码)的全部内容,希望文章能够帮你解决数字时钟计数器(内含模60计数器以及8421BCD码计数器设计代码)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部