数字逻辑课程设计--电子闹钟

一、功能介绍

本次数字逻辑与EDA实验课程设计我设计的是电子闹钟,该电子闹钟具体能实现的功能如下:

基本功能

  1. 正常时间和闹钟时间显示功能
  2. 闹钟触发功能

设计功能

  1. 手动设置和修改闹钟时间功能
  2. 当正常时间有误时,矫正时间功能
  3. 利用有限状态机设计闹钟触发30s的LED彩灯提示功能

二、设计思路

首先设计一个分频模块,将50mhz的时钟分频得到1hz的时钟,分频的方法在前面的几次实验中多次用到。其次,是设计时钟模块,通过得到的1hz的时钟,在时钟上升沿进行触发,分别设置分钟和秒,当秒为59时,置零,然后分钟加1。当数满一个小时时,自动归零。然后需要设置修改正常时间和闹钟时间的模块,我通过引入寄存器型变量,能够临时存储修改的值,并且增加标记位的方式实现该模块。其次,还需要设置时间显示模块,通过控制输出,并进行管脚分配来在7段数码管上显示。最后还需设置一个闹钟触发模块,通过有限状态机设计,实现LED彩灯提示。

三、模块结构

在这里插入图片描述在这里插入图片描述

四、代码及其注释

module clock(clk50mhz,clr,mod_time,mod_clock,mod_min,mod_sec,led,out1,out2,out3,out4);
(*chip_pin="Y2"*)input clk50mhz;
(*chip_pin="AB28"*)input clr;         //SW[0] 清零信号,clear=1时时钟清零
(*chip_pin="M23"*)input mod_time;     //KRY[0] 修改正常时间
(*chip_pin="M21"*)input mod_clock;    //KEY[1] 设置(修改)闹钟时间
(*chip_pin="AD26,AC26,AB27,AD27,AC27,AC28"*)input [5:0] mod_min; //修改的分 SW[6]-SW[1]
(*chip_pin="AB23,AB24,AC24,AB25,AC25,AB26"*)input [5:0] mod_sec; //修改的秒 SW[12]-SW[7]
(*chip_pin="G21,G22,G20,H21,E24,E25,E22,E21"*)output reg[7:0] led; //LED黄灯
(*chip_pin="V21,U21,AB20,AA21,AD24,AF23,Y19,AA25,AA26,Y25,W26,Y26,W27,W28"*)output reg[13:0] out1;//HEX[3]与HEX[2]  min
(*chip_pin="M24,Y22,W21,W22,W25,U23,U24,G18,F22,E17,L26,L25,J22,H22"*)output reg[13:0] out2; //HEX[1]与HEX[0]   sec
(*chip_pin="AD17,AE17,AG17,AH17,AF17,AG18,AA14,AA17,AB16,AA16,AB17,AB15,AA15,AC17"*)output reg[13:0] out3; //HEX[7]与HEX[6]   clock_min    
(*chip_pin="AD18,AC18,AB18,AH19,AG19,AF18,AH18,AB19,AA19,AG21,AH21,AE19,AF19,AE18"*)output reg[13:0] out4; //HEX[5]与HEX[4]   clock_sec                                                                                     
reg[5:0] min; //正常分钟
reg[5:0] sec; //正常秒
reg[5:0] clock_min=0;//闹钟分钟
reg[5:0] clock_sec=10; //闹钟秒
reg[5:0] min_temp;
reg[5:0] sec_temp;
reg flag=0; //时钟触发信号
reg flag_mod_time;
//1.分频模块,得到1s时钟信号
reg clk1hz;
reg[24:0] cout;
always@(posedge clk50mhz)
begin
    if(cout==25'd24999999)
    begin
        cout = 0;
        clk1hz = ~clk1hz;
    end
    else
        cout = cout + 1;
end
 
//2.正常时间模块
always@(posedge clk1hz)
begin
   if(clr)
    begin
        min=0;
        sec=0;   
    end
    else if(flag_mod_time)
    begin 
        min=min_temp;
         sec=sec_temp;
    end
    else 
    begin
        if(sec==6'd59 && min==6'd59)
                begin
           sec=0;
           min=0;
                end
        else if(sec==6'd59)
                begin
           sec=0;
           min=min+1;
                end
        else 
                begin
           sec=sec+1;
           min=min;
                end
    end
    if(min==clock_min && sec==clock_sec)
       flag=1;
    else if(min*60+sec-clock_min*60-clock_sec>30)
    begin
       flag=0;
    end
     
end
 
//3.修改正常时间
always@(mod_time)
begin
   if(mod_time==0)
    begin
    min_temp=mod_min;
    sec_temp=mod_sec;
    flag_mod_time=1;
    end
    else
    begin
       min_temp=min_temp;
        sec_temp=sec_temp;
       flag_mod_time=0;
    end
end
 
//4.修改闹钟时间
always@(mod_clock)
begin
   if(mod_clock==0)
    begin
    clock_min=mod_min;
    clock_sec=mod_sec;
    end
    else
    begin
        clock_min=clock_min;
         clock_sec=clock_sec;
    end
end
 
//5.显示正常时间和闹钟时间
always@(min or sec or clock_min or clock_sec)
begin
        case(min) 
            6'd0:out1=14'b0000001_0000001;
            6'd1:out1=14'b0000001_1001111;
            6'd2:out1=14'b0000001_0010010;
            6'd3:out1=14'b0000001_0000110;
            6'd4:out1=14'b0000001_1001100;
            6'd5:out1=14'b0000001_0100100;
            6'd6:out1=14'b0000001_0100000;
            6'd7:out1=14'b0000001_0001111;
            6'd8:out1=14'b0000001_0000000;
            6'd9:out1=14'b0000001_0000100;
            6'd10:out1=14'b1001111_0000001;
            6'd11:out1=14'b1001111_1001111;
            6'd12:out1=14'b1001111_0010010;
            6'd13:out1=14'b1001111_0000110;
            6'd14:out1=14'b1001111_1001100;
            6'd15:out1=14'b1001111_0100100;
            6'd16:out1=14'b1001111_0100000;
            6'd17:out1=14'b1001111_0001111;
            6'd18:out1=14'b1001111_0000000;
            6'd19:out1=14'b1001111_0000100;
            6'd20:out1=14'b0010010_0000001;
            6'd21:out1=14'b0010010_1001111;
            6'd22:out1=14'b0010010_0010010;
            6'd23:out1=14'b0010010_0000110;
            6'd24:out1=14'b0010010_1001100;
            6'd25:out1=14'b0010010_0100100;
            6'd26:out1=14'b0010010_0100000;
            6'd27:out1=14'b0010010_0001111;
            6'd28:out1=14'b0010010_0000000;
            6'd29:out1=14'b0010010_0000100;
            6'd30:out1=14'b0000110_0000001;
            6'd31:out1=14'b0000110_1001111;
            6'd32:out1=14'b0000110_0010010;
            6'd33:out1=14'b0000110_0000110;
            6'd34:out1=14'b0000110_1001100;
            6'd35:out1=14'b0000110_0100100;
            6'd36:out1=14'b0000110_0100000;
            6'd37:out1=14'b0000110_0001111;
            6'd38:out1=14'b0000110_0000000;
            6'd39:out1=14'b0000110_0000100;
            6'd40:out1=14'b1001100_0000001;
            6'd41:out1=14'b1001100_1001111;
            6'd42:out1=14'b1001100_0010010;
            6'd43:out1=14'b1001100_0000110;
            6'd44:out1=14'b1001100_1001100;
            6'd45:out1=14'b1001100_0100100;
            6'd46:out1=14'b1001100_0100000;
            6'd47:out1=14'b1001100_0001111;
            6'd48:out1=14'b1001100_0000000;
            6'd49:out1=14'b1001100_0000100;
            6'd50:out1=14'b0100100_0000001;
            6'd51:out1=14'b0100100_1001111;
            6'd52:out1=14'b0100100_0010010;
            6'd53:out1=14'b0100100_0000110;
            6'd54:out1=14'b0100100_1001100;
            6'd55:out1=14'b0100100_0100100;
            6'd56:out1=14'b0100100_0100000;
            6'd57:out1=14'b0100100_0001111;
            6'd58:out1=14'b0100100_0000000;
            6'd59:out1=14'b0100100_0000100;
            default:out1=14'b1111111_1111111;
        endcase
        case(sec)
            6'd0:out2=14'b0000001_0000001;
            6'd1:out2=14'b0000001_1001111;
            6'd2:out2=14'b0000001_0010010;
            6'd3:out2=14'b0000001_0000110;
            6'd4:out2=14'b0000001_1001100;
            6'd5:out2=14'b0000001_0100100;
            6'd6:out2=14'b0000001_0100000;
            6'd7:out2=14'b0000001_0001111;
            6'd8:out2=14'b0000001_0000000;
            6'd9:out2=14'b0000001_0000100;
            6'd10:out2=14'b1001111_0000001;
            6'd11:out2=14'b1001111_1001111;
            6'd12:out2=14'b1001111_0010010;
            6'd13:out2=14'b1001111_0000110;
            6'd14:out2=14'b1001111_1001100;
            6'd15:out2=14'b1001111_0100100;
            6'd16:out2=14'b1001111_0100000;
            6'd17:out2=14'b1001111_0001111;
            6'd18:out2=14'b1001111_0000000;
            6'd19:out2=14'b1001111_0000100;
            6'd20:out2=14'b0010010_0000001;
            6'd21:out2=14'b0010010_1001111;
            6'd22:out2=14'b0010010_0010010;
            6'd23:out2=14'b0010010_0000110;
            6'd24:out2=14'b0010010_1001100;
            6'd25:out2=14'b0010010_0100100;
            6'd26:out2=14'b0010010_0100000;
            6'd27:out2=14'b0010010_0001111;
            6'd28:out2=14'b0010010_0000000;
            6'd29:out2=14'b0010010_0000100;
            6'd30:out2=14'b0000110_0000001;
            6'd31:out2=14'b0000110_1001111;
            6'd32:out2=14'b0000110_0010010;
            6'd33:out2=14'b0000110_0000110;
            6'd34:out2=14'b0000110_1001100;
            6'd35:out2=14'b0000110_0100100;
            6'd36:out2=14'b0000110_0100000;
            6'd37:out2=14'b0000110_0001111;
            6'd38:out2=14'b0000110_0000000;
            6'd39:out2=14'b0000110_0000100;
            6'd40:out2=14'b1001100_0000001;
            6'd41:out2=14'b1001100_1001111;
            6'd42:out2=14'b1001100_0010010;
            6'd43:out2=14'b1001100_0000110;
            6'd44:out2=14'b1001100_1001100;
            6'd45:out2=14'b1001100_0100100;
            6'd46:out2=14'b1001100_0100000;
            6'd47:out2=14'b1001100_0001111;
            6'd48:out2=14'b1001100_0000000;
            6'd49:out2=14'b1001100_0000100;
            6'd50:out2=14'b0100100_0000001;
            6'd51:out2=14'b0100100_1001111;
            6'd52:out2=14'b0100100_0010010;
            6'd53:out2=14'b0100100_0000110;
            6'd54:out2=14'b0100100_1001100;
            6'd55:out2=14'b0100100_0100100;
            6'd56:out2=14'b0100100_0100000;
            6'd57:out2=14'b0100100_0001111;
            6'd58:out2=14'b0100100_0000000;
            6'd59:out2=14'b0100100_0000100;
            default:out2=14'b1111111_1111111;
        endcase
        case(clock_min)
            6'd0:out3=14'b0000001_0000001;
            6'd1:out3=14'b0000001_1001111;
            6'd2:out3=14'b0000001_0010010;
            6'd3:out3=14'b0000001_0000110;
            6'd4:out3=14'b0000001_1001100;
            6'd5:out3=14'b0000001_0100100;
            6'd6:out3=14'b0000001_0100000;
            6'd7:out3=14'b0000001_0001111;
            6'd8:out3=14'b0000001_0000000;
            6'd9:out3=14'b0000001_0000100;
            6'd10:out3=14'b1001111_0000001;
            6'd11:out3=14'b1001111_1001111;
            6'd12:out3=14'b1001111_0010010;
            6'd13:out3=14'b1001111_0000110;
            6'd14:out3=14'b1001111_1001100;
            6'd15:out3=14'b1001111_0100100;
            6'd16:out3=14'b1001111_0100000;
            6'd17:out3=14'b1001111_0001111;
            6'd18:out3=14'b1001111_0000000;
            6'd19:out3=14'b1001111_0000100;
            6'd20:out3=14'b0010010_0000001;
            6'd21:out3=14'b0010010_1001111;
            6'd22:out3=14'b0010010_0010010;
            6'd23:out3=14'b0010010_0000110;
            6'd24:out3=14'b0010010_1001100;
            6'd25:out3=14'b0010010_0100100;
            6'd26:out3=14'b0010010_0100000;
            6'd27:out3=14'b0010010_0001111;
            6'd28:out3=14'b0010010_0000000;
            6'd29:out3=14'b0010010_0000100;
            6'd30:out3=14'b0000110_0000001;
            6'd31:out3=14'b0000110_1001111;
            6'd32:out3=14'b0000110_0010010;
            6'd33:out3=14'b0000110_0000110;
            6'd34:out3=14'b0000110_1001100;
            6'd35:out3=14'b0000110_0100100;
            6'd36:out3=14'b0000110_0100000;
            6'd37:out3=14'b0000110_0001111;
            6'd38:out3=14'b0000110_0000000;
            6'd39:out3=14'b0000110_0000100;
            6'd40:out3=14'b1001100_1111110;
            6'd41:out3=14'b1001100_1001111;
            6'd42:out3=14'b1001100_0010010;
            6'd43:out3=14'b1001100_0000110;
            6'd44:out3=14'b1001100_1001100;
            6'd45:out3=14'b1001100_0100100;
            6'd46:out3=14'b1001100_0100000;
            6'd47:out3=14'b1001100_0001111;
            6'd48:out3=14'b1001100_0000000;
            6'd49:out3=14'b1001100_0000100;
            6'd50:out3=14'b0100100_1111110;
            6'd51:out3=14'b0100100_1001111;
            6'd52:out3=14'b0100100_0010010;
            6'd53:out3=14'b0100100_0000110;
            6'd54:out3=14'b0100100_1001100;
            6'd55:out3=14'b0100100_0100100;
            6'd56:out3=14'b0100100_0100000;
            6'd57:out3=14'b0100100_0001111;
            6'd58:out3=14'b0100100_0000000;
            6'd59:out3=14'b0100100_0000100;
            default:out3=14'b1000100_1000100;
        endcase
        case(clock_sec)
            6'd0:out4=14'b0000001_0000001;
            6'd1:out4=14'b0000001_1001111;
            6'd2:out4=14'b0000001_0010010;
            6'd3:out4=14'b0000001_0000110;
            6'd4:out4=14'b0000001_1001100;
            6'd5:out4=14'b0000001_0100100;
            6'd6:out4=14'b0000001_0100000;
            6'd7:out4=14'b0000001_0001111;
            6'd8:out4=14'b0000001_0000000;
            6'd9:out4=14'b0000001_0000100;
            6'd10:out4=14'b1001111_0000001;
            6'd11:out4=14'b1001111_1001111;
            6'd12:out4=14'b1001111_0010010;
            6'd13:out4=14'b1001111_0000110;
            6'd14:out4=14'b1001111_1001100;
            6'd15:out4=14'b1001111_0100100;
            6'd16:out4=14'b1001111_0100000;
            6'd17:out4=14'b1001111_0001111;
            6'd18:out4=14'b1001111_0000000;
            6'd19:out4=14'b1001111_0000100;
            6'd20:out4=14'b0010010_0000001;
            6'd21:out4=14'b0010010_1001111;
            6'd22:out4=14'b0010010_0010010;
            6'd23:out4=14'b0010010_0000110;
            6'd24:out4=14'b0010010_1001100;
            6'd25:out4=14'b0010010_0100100;
            6'd26:out4=14'b0010010_0100000;
            6'd27:out4=14'b0010010_0001111;
            6'd28:out4=14'b0010010_0000000;
            6'd29:out4=14'b0010010_0000100;
            6'd30:out4=14'b0000110_0000001;
            6'd31:out4=14'b0000110_1001111;
            6'd32:out4=14'b0000110_0010010;
            6'd33:out4=14'b0000110_0000110;
            6'd34:out4=14'b0000110_1001100;
            6'd35:out4=14'b0000110_0100100;
            6'd36:out4=14'b0000110_0100000;
            6'd37:out4=14'b0000110_0001111;
            6'd38:out4=14'b0000110_0000000;
            6'd39:out4=14'b0000110_0000100;
            6'd40:out4=14'b1001100_0000001;
            6'd41:out4=14'b1001100_1001111;
            6'd42:out4=14'b1001100_0010010;
            6'd43:out4=14'b1001100_0000110;
            6'd44:out4=14'b1001100_1001100;
            6'd45:out4=14'b1001100_0100100;
            6'd46:out4=14'b1001100_0100000;
            6'd47:out4=14'b1001100_0001111;
            6'd48:out4=14'b1001100_0000000;
            6'd49:out4=14'b1001100_0000100;
            6'd50:out4=14'b0100100_0000001;
            6'd51:out4=14'b0100100_1001111;
            6'd52:out4=14'b0100100_0010010;
            6'd53:out4=14'b0100100_0000110;
            6'd54:out4=14'b0100100_1001100;
            6'd55:out4=14'b0100100_0100100;
            6'd56:out4=14'b0100100_0100000;
            6'd57:out4=14'b0100100_0001111;
            6'd58:out4=14'b0100100_0000000;
            6'd59:out4=14'b0100100_0000100;
            default:out4=14'b1000100_1000100;
        endcase
end
 
//6.闹钟触发模块
reg[3:0] cs;
reg[3:0] ns;
parameter s0=4'd0,s1=4'd1,s2=4'd2,s3=4'd3,s4=4'd4,s5=4'd5,s6=4'd6,s7=4'd7,s8=4'd8,s9=4'd9;
 
always@(posedge clk1hz)
begin
    if(flag==1)
    begin
        cs=ns;
    end
    else cs=s0;
end
 
always@(cs)
begin
    case(cs)
       s0:ns=s1;
        s1:ns=s2;
        s2:ns=s3;
        s3:ns=s4;
        s4:ns=s5;
        s5:ns=s6;
        s6:ns=s7;
        s7:ns=s8;
        s8:ns=s9;
        s9:ns=s0;
        default:ns=s0;
    endcase
 
end
 
always@(cs)
begin
    case(cs)
        4'd0:led=8'b00000000;   
        4'd1:led=8'b11111111;
        4'd2:led=8'b11111111;
        4'd3:led=8'b11100111;
        4'd4:led=8'b11000011;
        4'd5:led=8'b10000001;
        4'd6:led=8'b11000011;
        4'd7:led=8'b11100111;
        4'd8:led=8'b11111111;
        4'd9:led=8'b00000000;
        default:led=8'b00000000;
    endcase
end
 
endmodule

效果展示

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_55085530/article/details/125092597
今日推荐