zoukankan      html  css  js  c++  java
  • 使用BCD计数器设计时钟

    `timescale 1ns / 1ps
    //////////////////////////////////////////////////////////////////////////////////
    // Engineer: connor jiao
    // Create Date: 21:42 2020/8/5
    // Design Name: 
    // Module Name: 
    // Function   : 
    //用计数器设计一个带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信号也可以进行复位操作。 
    // Revision 0.01 - File Created
    // Additional Comments:
    //////////////////////////////////////////////////////////////////////////////////
    module top_module(
        input clk,
        input reset,
        input ena,
        output reg pm,
        output reg [7:0] hh,
        output reg [7:0] mm,
        output reg [7:0] ss); 
        
        always@(posedge clk)
            if(reset)
                ss<='d0;
            else if(ena)
                if(ss==8'h59)
                    ss<='d0;
                else if(ss[3:0]=='d9)begin
                    ss[3:0]<='d0;
                    ss[7:4]<=ss[7:4]+1'b1;
                end
                else begin
                    ss[7:4]<=ss[7:4];
                    ss[3:0]<=ss[3:0]+1'b1;
                end
            else
                ss<=ss;      
        always@(posedge clk)
        begin
            if(reset)
                mm<='d0;
            else if(ena&&ss==8'h59)
                if(mm=='h59)
                    mm<='d0;
                else begin
                    if(mm[3:0]=='d9)begin
                        mm[3:0]<='d0;
                        mm[7:4]<=mm[7:4]+1'b1;
                    end
                    else begin
                        mm[3:0]<=mm[3:0]+1'b1;
                        mm[7:4]<=mm[7:4];
                    end
                end    
            else 
                mm<=mm;
        end        
        always@(posedge clk)
        begin
            if(reset)
                hh<=8'h12;
            else begin
                if(ena&&mm==8'h59&&ss==8'h59)
                    if(hh==8'h12)
                        hh<='d1;
                    else begin
                        if(hh[3:0]=='d9)begin
                            hh[3:0]<='d0;
                            hh[7:4]<=hh[7:4]+1'b1;
                        end
                        else begin
                            hh[3:0]<=hh[3:0]+1'b1;
                            hh[7:4]<=hh[7:4];
                        end
                    end
                else
                    hh<=hh;
            end
        end
        always@(posedge clk)
        begin
            if(reset)
                pm<=1'b0;
            else if(ena&&hh==8'h11&&mm==8'h59&&ss==8'h59)
                pm<=~pm;
            else
                pm<=pm;
        end
    endmodule
  • 相关阅读:
    Java锁---偏向锁、轻量级锁、自旋锁、重量级锁
    Java自旋锁
    设计模式的原则
    CGLIB介绍与原理(通过继承的动态代理)
    Android Messenger
    Android AIDL的用法
    长连接和短连接和推送
    Java对称加密算法
    Android 热修复技术中的CLASS_ISPREVERIFIED问题
    Java类加载器
  • 原文地址:https://www.cnblogs.com/ajiaoa/p/13492503.html
Copyright © 2011-2022 走看看