zxopenljx 发表于 2020-5-12 13:59:22

数字钟之时钟控制模块

前几天,我们介绍了一下简单数字时钟的整体设计思路。今天我们来着重分享一下其中的“时钟控制模块”。
数字钟的设计思路有很多,我们今天采用一种相对简单的逻辑来实现控制模块功能(从大到小去考虑)。

一天中最大的时刻是: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

    这样,我们的时钟控制模块就设计完成了。今天就到这里,咱们明天接着分享学习。

zhangyukun 发表于 2020-5-12 15:49:35

数字钟之时钟控制模块
页: [1]
查看完整版本: 数字钟之时钟控制模块