集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1341|回复: 2

数字钟之时钟控制模块

[复制链接]
zxopenljx 发表于 2020-5-12 13:59:22 | 显示全部楼层 |阅读模式
前几天,我们介绍了一下简单数字时钟的整体设计思路。今天我们来着重分享一下其中的“时钟控制模块”。
数字钟的设计思路有很多,我们今天采用一种相对简单的逻辑来实现控制模块功能(从大到小去考虑)。

一天中最大的时刻是: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
zhangyukun 发表于 2020-5-12 15:49:35 | 显示全部楼层
数字钟之时钟控制模块
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-4-20 03:32 , Processed in 0.057580 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表