数字钟之时钟控制模块
前几天,我们介绍了一下简单数字时钟的整体设计思路。今天我们来着重分享一下其中的“时钟控制模块”。数字钟的设计思路有很多,我们今天采用一种相对简单的逻辑来实现控制模块功能(从大到小去考虑)。
一天中最大的时刻是:23时59分59秒。最小的单位1秒。
具体的逻辑关系,我们用一个图来表示:如下图
看懂了这个图,接下来我们把它描述出来,今天的模块就完成了。
源程序:
00//时钟控制模块:描述一下时分秒的逻辑关系,产生数字钟的原始数据
01module clock_ctrl(clk, rst_n, date_out);
02
03 input clk;
04 input rst_n;
05
06 outputreg date_out;
07
08 //产生1s的单位
09 reg cnt;
10 reg clk_1hz;
11
12 parameter cnt_num =50_000_000/1/2-1; //0.5s
13
14 always@(posedge clk,negedge rst_n)
15 begin
16 if(!rst_n)
17 begin
18 cnt <=26'd0; //复位,计数器清零
19 clk_1hz <=1'b0; //输出时钟一个初值0(低电平)
20 end
21 else
22 begin
23 if(cnt < cnt_num) //否则,判断cnt是否小于最大值
24 cnt <= cnt +26'd1; //如果小于,cnt加1
25 else
26 begin
27 cnt <=26'd0; //否则,cnt清零
28 clk_1hz <=~clk_1hz; //输出时钟取反,得到一个周期为1秒的时钟
29 end
30 end
31 end
32
33 //数字钟逻辑实现
34 always@(posedge clk_1hz,negedge rst_n)
35 begin
36 if(!rst_n)
37 begin
38 date_out <=24'd0; //复位,全部清零
39 end
40 else
41 begin
42 if(date_out ==24'h173B3B) //23:59:59
43 date_out <=24'h0; //时、分、秒全部清零
44 elseif(date_out==16'h3B3B)//59:59
45 begin
46 date_out<= date_out+16'd1;//小时加1,
47 date_out<=16'h0; //分钟和秒清零
48 end
49 elseif(date_out==8'h3B) //59
50 begin
51 date_out<= date_out+8'd1; //分钟加1
52 date_out<=8'h0; //秒清零
53 end
54 else //0-59
55 date_out<= date_out+8'd1; //秒加1
56 end
57 end
58
59endmodule
这样,我们的时钟控制模块就设计完成了。今天就到这里,咱们明天接着分享学习。 数字钟之时钟控制模块
页:
[1]