|
前几天,我们介绍了一下简单数字时钟的整体设计思路。今天我们来着重分享一下其中的“时钟控制模块”。
数字钟的设计思路有很多,我们今天采用一种相对简单的逻辑来实现控制模块功能(从大到小去考虑)。
一天中最大的时刻是:23时59分59秒。最小的单位1秒。
具体的逻辑关系,我们用一个图来表示:如下图
看懂了这个图,接下来我们把它描述出来,今天的模块就完成了。
源程序:
00 //时钟控制模块:描述一下时分秒的逻辑关系,产生数字钟的原始数据
01 module clock_ctrl(clk, rst_n, date_out);
02
03 input clk;
04 input rst_n;
05
06 outputreg[23:0] date_out;
07
08 //产生1s的单位
09 reg[25:0] 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[15:0]==16'h3B3B)//59:59
45 begin
46 date_out[23:16]<= date_out[23:16]+16'd1;//小时加1,
47 date_out[15:0]<=16'h0; //分钟和秒清零
48 end
49 elseif(date_out[7:0]==8'h3B) //59
50 begin
51 date_out[15:8]<= date_out[15:8]+8'd1; //分钟加1
52 date_out[7:0]<=8'h0; //秒清零
53 end
54 else //0-59
55 date_out[7:0]<= date_out[7:0]+8'd1; //秒加1
56 end
57 end
58
59 endmodule
这样,我们的时钟控制模块就设计完成了。今天就到这里,咱们明天接着分享学习。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?我要注册
x
|