首页 > 其他分享 >12-hour clock

12-hour clock

时间:2024-04-10 14:45:33浏览次数:23  
标签:12 end wire hour clock ss hh ones tens

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.

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.

timu
题目网站

  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 reg pm_temp;
 10     reg [3:0] ss_ones;
 11     reg [3:0] ss_tens;
 12     reg [3:0] mm_ones;
 13     reg [3:0] mm_tens;
 14     reg [3:0] hh_ones;
 15     reg [3:0] hh_tens;
 16     
 17     wire        add_ss_ones;
 18     wire        end_ss_ones;
 19     wire        add_ss_tens;
 20     wire        end_ss_tens;
 21     wire        add_mm_ones;
 22     wire        end_mm_ones;
 23     wire        add_mm_tens;
 24     wire        end_mm_tens;
 25     wire        add_hh_ones;
 26     wire        end_hh_ones_0;
 27     wire        end_hh_ones_1;
 28     wire        add_hh_tens;
 29     wire        end_hh_tens_0;
 30     wire        end_hh_tens_1;
 31     wire        pm_ding;
 32     
 33     assign add_ss_ones = ena;
 34     assign end_ss_ones = add_ss_ones && (ss_ones == 4'd9);
 35     always @(posedge clk)begin
 36         if(reset)begin
 37             ss_ones <= 4'b0;
 38         end
 39         else if(add_ss_ones)begin
 40             if(end_ss_ones)begin
 41                 ss_ones <= 4'b0;
 42             end
 43             else begin
 44                 ss_ones <= ss_ones + 4'b1;
 45             end
 46         end
 47     end
 48     
 49     assign add_ss_tens = end_ss_ones;
 50     assign end_ss_tens = add_ss_tens && (ss_tens == 4'd5);
 51     always @(posedge clk)begin
 52         if(reset)begin
 53             ss_tens <= 4'b0;
 54         end
 55         else if(add_ss_tens)begin
 56             if(end_ss_tens)begin
 57                 ss_tens <= 4'b0;
 58             end
 59             else begin
 60                 ss_tens <= ss_tens + 4'b1;
 61             end
 62         end
 63     end
 64     
 65     assign add_mm_ones = end_ss_tens;
 66     assign end_mm_ones = add_mm_ones && (mm_ones == 4'd9);
 67     always @(posedge clk)begin
 68         if(reset)begin
 69             mm_ones <= 4'b0;
 70         end
 71         else if(add_mm_ones)begin
 72             if(end_mm_ones)begin
 73                 mm_ones <= 4'b0;
 74             end
 75             else begin
 76                 mm_ones <= mm_ones + 4'b1;
 77             end
 78         end
 79     end
 80     
 81     assign add_mm_tens = end_mm_ones;
 82     assign end_mm_tens = add_mm_tens && (mm_tens == 4'd5);
 83     always @(posedge clk)begin
 84         if(reset)begin
 85             mm_tens <= 4'b0;
 86         end
 87         else if(add_mm_tens)begin
 88             if(end_mm_tens)begin
 89                 mm_tens <= 4'b0;
 90             end
 91             else begin
 92                 mm_tens <= mm_tens + 4'b1;
 93             end
 94         end
 95     end
 96     
 97     assign add_hh_ones = end_mm_tens;
 98     assign end_hh_ones_0 = add_hh_ones && (hh_ones == 4'd9);
 99     assign end_hh_ones_1 = add_hh_ones && ((hh_ones == 4'd2) && (hh_tens == 4'd1));
100     always @(posedge clk)begin
101         if(reset)begin
102             hh_ones <= 4'd2;
103         end
104         else if(add_hh_ones)begin
105             if(end_hh_ones_0)begin
106                 hh_ones <= 4'b0;
107             end
108             else if(end_hh_ones_1)begin
109                 hh_ones <= 4'b1;
110             end
111             else begin
112                 hh_ones <= hh_ones+4'b1;
113             end
114         end
115     end
116 
117     assign add_hh_tens = end_mm_tens;
118     assign end_hh_tens_0 = add_hh_tens && end_hh_ones_1;
119     assign end_hh_tens_1 = add_hh_tens && end_hh_ones_0;
120     always @(posedge clk)begin
121         if(reset)begin
122             hh_tens <= 4'b1;
123         end
124         else if(add_hh_tens)begin
125             if(end_hh_tens_0)begin
126                 hh_tens <= 4'b0;
127             end
128             else if(end_hh_tens_1)begin
129                 hh_tens <= hh_tens + 4'b1;
130             end
131         end
132     end
133     
134     always@(posedge clk)begin
135         if(reset)begin
136             pm_temp <= 1'b0;
137         end
138         else if(pm_ding)begin
139             pm_temp <= ~pm_temp;
140         end
141     end
142     
143     assign pm_ding = hh_tens == 4'd1 && hh_ones == 4'd1 && end_mm_tens;
144     
145     assign ss = {ss_tens, ss_ones};
146     assign mm = {mm_tens, mm_ones};
147     assign hh = {hh_tens, hh_ones};
148     assign pm = pm_temp;
149 
150 endmodule

按照之前的题目,由简单到复杂,这个题目就可以解决了,如果不清楚,建议把counter这个部分的题目,从第一题开始重新写一遍,慢慢理解就好。

标签:12,end,wire,hour,clock,ss,hh,ones,tens
From: https://www.cnblogs.com/jzzg/p/18125995

相关文章

  • ORA-01652 无法通过128 (在表空间 TEMP中)扩展temp段
    1,同事说执行sql报错同事在plsql里面执行sql报错,报错信息:ora-01652无法通过128(在表空间TEMP中)扩展temp段,如下图所示: 2,查看报错sql语句Sql比较长,而且无法扩展temp字段,那么基本推断可能有如下2种情况:(1)oracle的temp临时表空间太小了;(2)一个性能非常差的笛卡尔积的带全表扫描......
  • ORA-01652: 无法通过 128 (在表空间 TEMP 中) 扩展 temp 段
    1、报错信息ORA-01652:无法通过128(在表空间TEMP中)扩展temp段2、原因临时表空间满了3、解决办法3.1添加临时表空间的数据文件altertablespaceTEST_TEMPadddatafile'+DATA/ZYGLZXDB/F5324C63FB43C214E0536E9ECE0A6F9E/TEMPFILE/test_temp_01.dbf'size30g;注意:临时......
  • Mac OS12虚拟机安装教程
    MacOS12虚拟机安装教程目录MacOS12虚拟机安装教程前置条件VMwareworkstation安装步骤!!!完成安装后先不要打开软件!!!解锁vmvare中macos安装功能处理VMware进程和服务解锁MacOS安装功能创建虚拟机安装MacOS12安装VMwareTools工具优化虚拟机mac系统结束语前置条件VMwareWork......
  • 算法模板 v1.12.1.20240409
    算法模板v1.1.1.20240115:之前历史版本已不可寻,创建第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”;删除“编译”-“手动开O优化”;修改“编译”-“CF模板”;删除“读写”;删除“图论”-“欧拉图”-“混合图”;删除“图论”-“可达性统计”;删除“数据类型”-“高精类”。......
  • Kubernetes学习笔记12
    k8s核心概念:控制器:我们删除Pod是可以直接删除的,如果生产环境中的误操作,Pod同样也会被轻易地被删除掉。所以,在K8s中引入另外一个概念:Controller(控制器)的概念,用于在k8s集群中以loop的方式监视pod状态,如果其发现Pod被删除,将会重新拉起一个Pod,以让Pod一直保持在用户期望的状态。......
  • 轻松应对复杂电压转换!PW2205 5A芯片实现12V/24V转5V/3.3V稳定供电
    在电子设备蓬勃发展的今天,高效稳定的电源转换技术成为了推动行业进步的关键。PW2205平芯微芯片推出的高效同步降压DC-DC转换器,以其出色的性能和广泛的应用领域,成为了了市场上的热门选择。PW2205转换器凭借其卓越的性能,为各类电子设备提供了强大的电力支持。它能够在4.5V至30V的宽......
  • 使用SPI+DMA控制算法驱动WS2812
    1、ws2812b是一款集控制电路与发光电路于一体的智能外控LED光源,采用单线归0码协议,每个像素点的三基色颜色可实现256级亮度显示。速率能达到1024pixel×30fps/s,故被广泛用于各种需要大量使用RGB灯的场合。2、不同厂商生产的ws2812存在不同的时序要求,下图是一款最常见的ws2812b......
  • 20211128李杰——实验一-密码引擎-3-加密API研究
    实验一-密码引擎-加密API研究 实验一-密码引擎-加密API研究密码引擎API的主要标准和规范包括:1微软的CryptoAPI2RAS公司的PKCS#11标准3中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异......
  • FPGA入门笔记012——嵌入式块RAM应用之ROM
    1、实验现象​ 实现一组固定的数据(三角波形表)存储在FPGA中使用IP核构建的片上ROM中,开发板上电后,系统开始从ROM中读出数据,并将数据直接通过并口输出。通过使用SignalTapII软件实时抓取并口上的数据,显示得到三角波形。然后使用Quartus软件中提供的In-SystemMemor......
  • 模拟心电芯片LHE7909兼容代替ADS1291
    在大时代的浪潮下,以美国为首的欧美企业,对于中国实施制裁,不仅导致了局势的紧张,也导致了近年来芯片市场的混乱,部分进口芯片一度价格攀升。以心电芯片为例,高精度的ECG信号是医生用来准确判断用户心脏健康的依据。此类专用芯片技术门槛较高,目前主要被国外如TI,ADI等巨头公司垄断。......