目录
前言
这是我刚开始写博客时候写的了,本身结构很丑,我于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,