0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用至简设计法的数字时钟设计

电子设计 来源:网络整理 作者:工程师1 2018-05-24 10:45 次阅读

数字时钟是常见的毕业设计题目。我们做毕业设计时,一般使用数码管来显示数字。小时、分钟和秒钟各两位数字,所以需要用到6位的数码管。

如果平时不动手,要做这个毕业设计,很多人都会觉得挺难的。收集到的代码,其风格也是五花八门,第一感觉是貌似能看懂,但就是不知道怎么设计出来的。

其实如果有正确的设计思路和方法,其实现起来是非常简单的。下面我们就核心的数字模块为例,讲解如何使用至简设计法来实现。

数字模块的功能,是产生6个信号,分别表示时十位、时个位、分十位、分个位、秒十位和秒个位的值。例如上述信号值依次为2、1、4、3、5、9时,则表示时间为21点43分59秒。

仔细观察6个信号,每个单独来看,其数字都是递增的,增加到一定数后就清零。以秒个位为例,开始时值为0,然后是1、2、3依次增加,直到变成9后,然后变成0,再次循环。其他信号都是相同的规律。这些依次递增的信号,就是计数器。

我们认识到这些信号是计数器,那就好办了。计数器设计只需要考虑两点,什么时候加1和要数多少个,明确这两个问题后,剩下的就是套用计数器模板了。

以秒个位这个计数器为例,这个计数器加1的条件是什么呢?到了1秒就加1。那我们怎么知道1秒钟时间到了呢?FPGA是通过数时钟周期数来确定时间的。例如下图,假设时钟频率是50MHz,即时钟周期是20ns,cnt是每个时钟加1,则当cnt==99时,就说明数了100个时钟周期,也就是时间是100*20=2000ns了。

同样的道理,1秒钟时间,我们就是数1s/20ns= 50_000_000个时钟周期。我们也认识到这个cnt也是计数器,其加1条件是“1”,要数50_000_000个数。我们套用计数器模块,即有下面代码。

always @(posedge clk or negedge rst_n)begin

if(!rst_n)begin

cnt 《= 0;

end

else if(add_cnt)begin

if(end_cnt)

cnt 《= 0;

else

cnt 《= cnt + 1;

end

end

assign add_cnt = 1 ;

assign end_cnt = add_cnt && cnt== 50_000_000-1;

代码中,always语句除了名字后,完全套用模板,不用更改。加1条件体现在第13行,要数多少个体现在第14行。

确定了cnt后,那么秒个位的加1条件就非常明确了,就是cnt数到50_000_000个,也就是end_cnt有效的时候。所以秒个位的加1条件是end_cnt。

秒个位要数多少个数字呢?由0到9,因此有10个。

综上所述,我们得到秒个位的代码如下表。

always@(posedge clk or negedge rst_n)begin

if(rst_n==1‘b0)begin

miao_g 《= 0;

end

else if(add_miao_g)begin

if(end_miao_g)

miao_g 《= 0;

else

miao_g 《= miao_g + 1;

end

end

assign add_miao_g = end_cnt;

assign end_miao_g = add_miao_g && miao_g == 10-1;

用类似于秒个位的思考方法,我们可以得到秒十位、分个位、分十位、时个位和时十位的代码,完整的代码如下表。

always @(posedge clk or negedge rst_n)begin

if(!rst_n)begin

cnt 《= 0;

end

else if(add_cnt)begin

if(end_cnt)

cnt 《= 0;

else

cnt 《= cnt + 1;

end

end

assign add_cnt = 1 ;

assign end_cnt = add_cnt && cnt== 50_000_000-1;

always@(posedge clk or negedge rst_n)begin

if(rst_n==1’b0)begin

miao_g 《= 0;

end

else if(add_miao_g)begin

if(end_miao_g)begin

miao_g 《= 0;

end

else begin

miao_g 《= miao_g + 1;

end

end

end

assign add_miao_g = end_cnt;

assign end_miao_g = add_miao_g && miao_g == 10-1;

always @(posedge clk or negedge rst_n)begin

if(rst_n==1‘b0)begin

miao_s 《= 0;

end

else if(add_miao_s)begin

if(end_miao_s)begin

miao_s 《= 0;

end

else begin

miao_s 《= miao_s + 1;

end

end

end

assign add_miao_s = end_miao_g;

assign end_miao_s = add_miao_s && miao_s == 6-1;

always @(posedge clk or negedge rst_n)begin

if(rst_n==1’b0)begin

fen_g 《= 0;

end

else if(add_fen_g)begin

if(end_fen_g)begin

fen_g 《= 0;

end

else begin

fen_g 《= fen_g + 1;

end

end

end

assign add_fen_g = end_miao_s;

assign end_fen_g = add_fen_g && fen_g == 10-1;

always @(posedge clk or negedge rst_n)begin

if(rst_n==1‘b0)begin

fen_s 《= 0;

end

else if(add_fen_s)begin

if(end_fen_s)begin

fen_s 《= 0;

end

else begin

fen_s 《= fen_s + 1;

end

end

end

assign add_fen_s = end_fen_g;

assign end_fen_s = add_fen_s && fen_s == 6-1;

always @(posedge clk or negedge rst_n)begin

if(rst_n==1’b0)begin

shi_g 《= 0;

end

else if(add_shi_g)begin

if(end_shi_g)begin

shi_g 《= 0;

end

else begin

shi_g 《= shi_g + 1;

end

end

end

assign add_shi_g = end_fen_s;

assign end_shi_g = add_shi_g && shi_g ==x-1;

always @(posedge clk or negedge rst_n)begin

if(rst_n==1‘b0)begin

shi_s 《= 0;

end

else if(add_shi_s)begin

if(end_shi_s)begin

shi_s 《= 0;

end

else begin

shi_s 《= shi_s + 1;

end

end

end

assign add_shi_s = end_shi_g;

assign end_shi_s = add_shi_s && shi_s == 3-1;

always@(*)begin

if(shi_s==2)

x =4;

else

x =10;

end

细心的读者可以发现,上面每段计数器格式都非常相似。没错,这就是技巧。我们设计的这套模板,基本上可以应用于任何场合,任何时候读者只考虑两个因素就够了,不会出现丢三落四的情况,而且每次只需要考虑一个因素,保证能做出最优的设计。

对了,上面代码中,我们没有补充信号定义这些。其实我们认为这些信号定义纯属体力劳动,是根本就不需要学习的,所以我们就没列出来。读者有兴趣可必补充。另外加上数码管译码电路,那么一个完整的数字时钟代码就出来了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计数器
    +关注

    关注

    32

    文章

    2118

    浏览量

    92848
  • 数字时钟
    +关注

    关注

    2

    文章

    144

    浏览量

    20115
收藏 人收藏

    评论

    相关推荐

    FPGA的数字时钟电路解析

    FPGA 在通信领域的应用可以说是无所不能,得益于 FPGA 内部结构的特点,它可以很容易地实现分布式的算法结构,这一点对于实现无线通信中的高速数字信号处理十分有利。
    发表于 01-24 13:46 494次阅读
    FPGA的<b class='flag-5'>数字</b><b class='flag-5'>时钟</b>电路解析

    单片机电子时钟功能介绍

    单片机电子时钟是一种基于微处理器和数字时钟显示技术的计时装置。它通过内部的晶振电路精确地计算时间,并将结果显示在数字时钟面板上。在现代生活中
    的头像 发表于 01-08 14:40 466次阅读

    全视通数字时钟系统在医院的解决方案-智慧医院子母钟系统解决方案

    医院时钟系统主要为全医院提供统一的精准同步时间,其主要作用是为整个医院的计算机系统及呼叫系统、BA系统、手术室控制系统以及其它弱电子系统提供标准的时间源。 精准统一的时间标准,可以给护士
    的头像 发表于 11-24 16:15 214次阅读

    51单片机数字时钟(带闹钟)

    发表于 11-08 08:32 2次下载
    51单片机<b class='flag-5'>数字</b><b class='flag-5'>时钟</b>(带闹钟)

    基于单片机多功能数字时钟(附完整程序版)

    发表于 11-08 08:32 0次下载
    基于单片机多功能<b class='flag-5'>数字</b><b class='flag-5'>时钟</b>(附完整程序版)

    基于单片机设计的数字时钟

    发表于 11-06 08:31 0次下载
    基于单片机设计的<b class='flag-5'>数字</b><b class='flag-5'>时钟</b>

    怎么判断CDR成功lock?

    Serdes RX通过CDR的PD(数字鉴相器)来提取相位信息,然后调整DCO(数字压控振荡器)的输出相位来实现数字时钟恢复,如图1所示。
    的头像 发表于 09-01 15:18 644次阅读
    怎么判断CDR成功lock?

    基于单片机的DS1302实时时钟实验 实时时钟芯片DS1302的工作原理

    在许多系统当中都需要精确的时钟功能,因此时钟芯片孕育而生。其中美国达拉斯 DALLAS 公司设计的 DS1302 是一款非常流行的数字时钟芯片。DS1302 是一款具有涓细电流充电能力
    的头像 发表于 07-27 18:27 3368次阅读
    基于单片机的DS1302实时<b class='flag-5'>时钟</b>实验 实时<b class='flag-5'>时钟</b>芯片DS1302的工作原理

    led数码管静态显示和动态显示的区别

    静态显示是指数码管中的数字独立显示,不会有任何变化,只显示静态的数字或字符。这种显示方式在需要显示稳定数字或字符时较为常见,比如数字时钟、温
    的头像 发表于 07-21 11:29 1.3w次阅读

    如何用8051单片机做一个温度计?

    温度传感器广泛用于电子设备中,用来显示实时温度,比如我们经常看到一些数字时钟便带有温度计,这是由于其中嵌入了温度传感器。在这个项目中,将展示如何设计数字温度传感器电路。在这个过程中,使用的是8051单片机。
    的头像 发表于 07-07 11:40 609次阅读

    使用Arduino制作简单的数字时钟

    电子发烧友网站提供《使用Arduino制作简单的数字时钟.zip》资料免费下载
    发表于 06-26 10:48 5次下载
    使用Arduino制作简单的<b class='flag-5'>数字</b><b class='flag-5'>时钟</b>

    如何在HLS中描述数字时钟

    它有两种操作模式:时钟和设置。时钟模式是标准模式,在此模式下,当前时间显示在数码管上。
    的头像 发表于 06-12 09:01 590次阅读
    如何在HLS中描述<b class='flag-5'>数字</b><b class='flag-5'>时钟</b>?

    小家电LED显示驱动多功能语音芯片IC方案 WT2003H4 B002

    随着时代的进步,智能家电的普及已经成为了一个趋势。而在智能家电中,LED显示屏也成为了不可或缺的一部分。因此,在小家电的设计中,LED显示驱动芯片的应用也越来越广泛。比如:电饭煲、电磁炉、数字时钟、咖啡机、电磁炉、湿度计、电子秤等等。
    的头像 发表于 05-10 10:06 331次阅读
    小家电LED显示驱动多功能语音芯片IC方案 WT2003H4 B002

    小家电LED显示驱动多功能语音芯片IC方案WT2003H4 B002

    随着时代的进步,智能家电的普及已经成为了一个趋势。而在智能家电中,LED显示屏也成为了不可或缺的一部分。因此,在小家电的设计中,LED显示驱动芯片的应用也越来越广泛。比如:电饭煲、电磁炉、数字时钟、咖啡机、电磁炉、湿度计、电子秤等等。
    的头像 发表于 05-10 09:05 410次阅读
    小家电LED显示驱动多功能语音芯片IC方案WT2003H4 B002

    ESP32+LED点阵DIY透明面板的数字时钟

    这是一款类似 HUD(抬头显示器,又称平视显示器)的时钟,通过 WiFi 获取当前时间。它基于 ESP32 控制器,使用四个常见的 8×8 点阵显示单元,由 MAX7219 芯片驱动。
    的头像 发表于 04-27 10:42 2073次阅读
    ESP32+LED点阵DIY透明面板的<b class='flag-5'>数字</b><b class='flag-5'>时钟</b>