Verilog HDL 实现电子万年历

 基本功能

1七段数码管分别显示年、月、日、时、分、秒的数值。时间显示为24进制;

2按照要求分别对年、月、日、时、分、秒进行数值设定;

3考虑润年的设计;

4实现闹钟的功能。

计算时间模块:

module Time1(rst,mS,year,mon,day,hour,min,sec,msec);

input rst;
input mS;
output[3:0] mon;  // 4'b1100=12
output[4:0] day;  // 5'b1_1111=31
output[4:0] hour;   // 5'b1_1000=24
output[5:0] min;  // 6'b11_1100=60
output[5:0] sec;  // 6'b11_1100=60
output[6:0] msec; // 7'b1100100=100
output[11:0] year;  // 12'b1000_0011_0100=2100

reg sec_carry,min_carry,hour_carry,day_carry,mon_carry,year_carry;
reg[3:0] mon;  // 4'b1100=12
reg[4:0] day;  // 5'b1_1111=31
reg[4:0] hour;  // 5'b1_1000=24
reg[4:0] date; // 5'b1_1111=31
reg[5:0] min;  // 6'b11_1100=60
reg[5:0] sec;  // 6'b11_1100=60
reg[6:0] msec; // 7'b1100100=100
reg[11:0] year;  // 12'b1000_0011_0100=2100

always@(posedge mS or negedge rst)//msec
begin
    if(!rst)
        begin
            msec<=0;
        end
    else 
        if(msec==99)
            begin
                msec<=0;
                sec_carry=1;
            end
        else
            begin
                msec<=msec+1'b1;
                sec_carry<=0;
            end
end

always@(posedge sec_carry or negedge rst) //sec
   begin
       if(!rst)
             begin    
                 sec<=0;
             end
       else if(sec==59)
             begin
               sec<=0;
               min_carry<=1'b1;
             end
       else
             begin
                sec<=sec+1'b1;
                min_carry<=0;
             end

   end

always@(posedge min_carry or negedge rst)//min
    begin
        if(!rst)
            begin
                min<=0;
            end
        else
            if(min==59)
                begin
                    min<=0;
                    hour_carry<=1;
                end   
            else
                begin
                    min<=min+1'b1;
                    hour_carry<=0;
                end
    end
always@(posedge hour_carry or negedge rst) //hour
    begin
        if(!rst)
            begin
                hour<=0;
            end
        else 
            if(hour==23)
                begin
                    hour<=0;
                    day_carry<=1;
                end
            else 
                begin
                    hour<=hour+1'b1;
                    day_carry<=0;               
                end      
    end    

always@(posedge day_carry or negedge rst)//day
    begin
        if(!rst)
            begin
                day<=1;
            end
        else 
            if(day==date)
                 begin
                      day<=1;
                      mon_carry<=1;
                 end
              else 
                 begin
                      day<=day+1'b1;
                      mon_carry<=0;
                 end
    end
always@(posedge mon_carry or negedge rst) //month
    begin
        if(!rst)
            begin
                mon<=1;
            end
        else 
            if(mon==12)
                begin
                    mon<=1;
                    year_carry<=1;
                end
            else
                begin
                    mon<=mon+1'b1;
                    year_carry<=0;
                end 
    end

always@(posedge year_carry or negedge rst)//year
    begin
        if(!rst)
            begin
                year<=2000;
            end
          else 
                if(year==2199)              
                    begin
                        year<=2000;        
                    end
                else 
                    begin
                        year<=year+1'b1;               
                    end
    end
      
always@(*)
    begin 
        case(mon) 
            1:date=31; 
            2: 
                begin 
                    //if(((year_4&&!year_400)&&!year_100)||year_400)
                    if(!(year%400)||(!(year%4)&&(year%100)))
                        date=29;
                    else
                        date=28;
                end
            3:date=31;
            4:date=30;
            5:date=31; 
            6:date=30;
            7:date=31;
            8:date=31; 
            9:date=30;
            10:date=31;
            11:date=30; 
            12:date=31;
            default:date=30; 
        endcase 
    end   
endmodule
 

闹钟模块:

module alarm(clk,add,aSW,alP,alCR,IS_SET,IS_TURN_ON,beep,hour,min,set_hour,set_min);
    
input add,aSW,clk,alP,alCR;
input [4:0] hour;
input [5:0] min;

output beep,IS_SET,IS_TURN_ON;
output reg [4:0] set_hour; // 5'b1_1000=24
output reg [5:0] set_min;  // 6'b11_1100=60

reg a;
reg b;
reg beep_r;

assign beep=beep_r;
assign IS_TURN_ON=b;
assign IS_SET=!alCR;

always@(posedge aSW)
    begin
        if(a==1)
            a<=0;
        else
            a<=a+1'b1;
    end
    
always@(posedge alP)
    begin
        b<=!b;
    end

always@(posedge add)
    begin
        if(!alCR)
            begin
                if(a==0)
                    if(set_hour==23)
                        set_hour<=0;
                    else
                        set_hour=set_hour+1'b1;
                if(a==1)
                    if(set_min==59)
                        set_min<=0;
                    else
                        set_min=set_min+1'b1;
            end
        else
            begin
                set_hour<=0;
                set_min<=0;
            end
    end
    
always@(posedge clk)
    begin
        if(b&&(set_hour==hour))
            if(set_min==min)
                beep_r<=!beep_r;
    end
    
endmodule
 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值