HDLBits 系列(19) 12小时时钟的Verilog设计

举报
李锐博恩 发表于 2021/07/15 04:06:01 2021/07/15
【摘要】 目录 背景 原题复现 审题 我的设计 设计解释 欢迎加入 背景 这篇博客设计一个12小时的时钟,通过例化4bit BCD码计数器来设计,如果你给予的时钟周期是1s,则能够当做时钟来用哦。 原题复现 原题如下: Create a set of counters suitable for use as a 12-hour clock (with am/pm...

目录

背景

原题复现

审题

我的设计

设计解释

欢迎加入


背景

这篇博客设计一个12小时的时钟,通过例化4bit BCD码计数器来设计,如果你给予的时钟周期是1s,则能够当做时钟来用哦。

原题复现

原题如下:

Create a set of counters suitable for use as a 12-hour clock (with am/pm indicator). Your counters are clocked by a fast-running clk, with a pulse on ena whenever your clock should increment (i.e., once per second).

reset resets the clock to 12:00 AM. pm is 0 for AM and 1 for PM. hh, mm, and ss are two BCD (Binary-Coded Decimal) digits each for hours (01-12), minutes (00-59), and seconds (00-59). Reset has higher priority than enable, and can occur even when not enabled.

用计数器设计一个带am/pm的12小时时钟。该计数器通过一个CLK进行计时,用ena使能信号来驱动时钟的递增。

reset信号将时钟复位为12:00 AM。 信号pm为0代表AM,为1代表PM。hh、mm和ss由两个BCD计数器构成hours(01~12), minutes(00~59) , second(00~59)。Reset信号比enable信号有更高的优先级,即使没有enable信号也可以进行复位操作。

The following timing diagram shows the rollover behaviour from 11:59:59 AM to 12:00:00 PM and the synchronous reset and enable behaviour.

模块声明如下:

Module Declaration


  
  1. module top_module(
  2. input clk,
  3. input reset,
  4. input ena,
  5. output pm,
  6. output [7:0] hh,
  7. output [7:0] mm,
  8. output [7:0] ss);

审题

这个题目的几个要求:

  • 能够进行12小时计数,那就要求有秒,分钟,小时;
  • 使用BCD计数器来实现;
  • 复位有效时,复位到12点;
  • 要能够区分上下午,上午pm为0,下午pm为1;
  • 复位比使能优先级更高;
  • 由于是时钟,所以是从1点到12点;

我的设计

好了,这里为了解决这个大问题,我先设计一个秒和分钟的计数器,也就是能从0到59的模60BCD计数器:


  
  1. module count60(
  2. input clk,
  3. input reset,
  4. input en,
  5. output reg [7:0] cnt_out
  6. );
  7. always@(posedge clk) begin
  8. if(reset) cnt_out <= 0;
  9. else if(en) begin
  10. if(cnt_out == 8'h59) begin
  11. cnt_out <= 0;
  12. end
  13. else if(cnt_out[3:0] == 9) begin
  14. cnt_out[3:0] <= 0;
  15. cnt_out[7:4] <= cnt_out[7:4] + 1;
  16. end
  17. else begin
  18. cnt_out[3:0] <= cnt_out[3:0] + 1;
  19. end
  20. end
  21. end
  22. endmodule

在设计一个从1计数到12的模12 BCD计数器:


  
  1. module count12 (
  2. input clk, // Clock
  3. input reset, // Asynchronous reset active high
  4. input en,
  5. output reg [7:0] cnt_out
  6. );
  7. always@(posedge clk) begin
  8. if(reset) cnt_out <= 8'h12;
  9. else if(en) begin
  10. if(cnt_out == 8'h12) begin
  11. cnt_out <= 1;
  12. end
  13. else if(cnt_out[3:0] == 9) begin
  14. cnt_out[3:0] <= 0;
  15. cnt_out[7:4] <= cnt_out[7:4] + 1;
  16. end
  17. else begin
  18. cnt_out[3:0] <= cnt_out[3:0] + 1;
  19. end
  20. end
  21. end
  22. endmodule

最后,通过例化得到最终的12小时时钟:


  
  1. module top_module(
  2. input clk,
  3. input reset,
  4. input ena,
  5. output pm,
  6. output [7:0] hh,
  7. output [7:0] mm,
  8. output [7:0] ss);
  9. count60 inst_second(
  10. .clk(clk),
  11. .reset(reset),
  12. .en(ena),
  13. .cnt_out(ss)
  14. );
  15. count60 inst_min(
  16. .clk(clk),
  17. .reset(reset),
  18. .en(ena&(ss == 8'h59)),
  19. .cnt_out(mm)
  20. );
  21. count12 inst_hour(
  22. .clk(clk),
  23. .reset(reset),
  24. .en(ena&(ss == 8'h59)&(mm == 8'h59)),
  25. .cnt_out(hh)
  26. );
  27. reg p;
  28. always@(posedge clk) begin
  29. if(reset) p <= 0;
  30. else if(hh == 8'h11 && ss == 8'h59&& mm == 8'h59) p <= ~p;
  31. else ;
  32. end
  33. assign pm = p;
  34. endmodule

设计解释

上面代码的最后一部分用于产生pm指示上下午的信号:

    reg p;
    always@(posedge clk) begin
        if(reset) p <= 0;
        else if(hh == 8'h11 && ss == 8'h59&& mm == 8'h59) p <= ~p;
        else ;
    end
    assign pm = p;

这样,设计就结束了。

通过例化模块的方式比在一个模块中写完整个设计要简洁,清晰,思路也更明朗了。

欢迎加入


在今年的秋招一开始,我就建立了一个微信群,在CSDN发布了一条博文,召集全国各地的同行朋友们共同加入,共同讨论秋招求职笔试,面试经验,目前已经有300多人加入,各位才华横溢,让我大开眼界。 到今天11月份,从西北地区最早结束到其他各地陆续结束,但是我们曾开玩笑说,本群继续召集下一届同行,作为先行者的我们也会对你们给予应有的帮助,欢迎加入,到你们晒工资的时候,会不会再次把我们倒挂呢?拭目以待。 由于人数较多,所以加我的时候务必备注:CSDN+地区或学校+职位(意向职位)+昵称。 对于后来很晚的人,也许你看到这个博客我已经工作了,也许我已经变了,不再是一个热心的博主,因此,可能我没有时间做这些事情了,还请见谅。

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/103265196

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。