精华内容
下载资源
问答
  • 多功能数字钟设计

    千次阅读 多人点赞 2020-11-13 21:32:33
    多功能数字钟设计 信息工程学院的电子技术综合实训 注:本实验报告,仅供参考,其中资料文献本文后面有注明来处,侵权删。 文章目录多功能数字钟设计前言一、设计目的和要求二、选题的目的和意义1.引入库2.读入...

    基于Multisim10.0.1的多功能数字钟的设计

    信息工程学院电子技术综合实训

    注:本实验报告,仅供参考,其中资料文献本文后面有注明来处,侵权删。


    课题前言

    电子综合实训包括很多实验,本实验课题选择多功能电子时钟的设计,其中包括模拟电子技术和数字电子技术的知识的运用,本文使用的实验环境是win7(当然win10可以的),仿真软件是Multisim10.0.1,打开界面如下:
    在这里插入图片描述


    提示:以下是本篇文章正文内容,下面案例供参考

    一、设计目的和要求

    设计一个多功能数字钟,能够准确记时并以数字化形式显示时、分、秒的时间,且该数字钟能够有以下功能:

    序号 功能
    1 校正时间
    2 准点报时
    3 定时闹钟

    二、选题的目的和意义

    数字钟从原理上来讲是一种典型的数字电路,其中包括了组合逻辑电路和时序电路。目前,数字钟的功能越来越多,并且有多种专门的大规模集成电路可供选择,一般由数钟电路、放大执行电路、电源电路等组成。
    设计多功能数字电路,通过简单的电路结构,并更改设定电路,了解通过输入脉冲,达到设计时钟目的,同时运用芯片以及逻辑门来实现进制从而理解数字电路的应用。

    三、方案的可行性论证

    1、方案的设计要求

       1、时间以24小时为周期;
       2、显示时、分、秒;
       3、具有校时功能,可以分别对时、分、秒进行单独校时,使其校正达到标准时间;
       4、具有整点报时功能,即设置时间到达整点前10秒进行蜂鸣器报时;
       5、具有定时闹钟功能。
    

    2、各电路模块初步分析

    时间显示电路

    时间显示模块包括时、分、秒部分,可用显示译码器来显示,从而实现24制以及60制。

    时间校准电路

    时间校准包括时钟校准、分钟校准和秒钟校准三个模块,可在各模块中设置点动开关,需要校准时,对应的显示模块数值随点动开关连续变换,待调到所需要的数值时,停止校准,从而达到对各个模块的单独校时。

    整点报时电路

    将显示译码器电路中加逻辑门与其相连,当整点时,报时可通过蜂鸣器蜂鸣实现,并可设置蜂鸣器的长鸣时间。

    定时闹钟电路

    可通过开关组来设置闹钟时间,芯片与逻辑门

    3、工作原理及图例

    当秒计时器计60后向分计数器进位,分计数器计数60后向小时进位,小时计数器设置成24进制计数器,满24后清零,重新开始计时。计数器的输出直接送到LED显示器,当计时出现误差时可以用校时电路进行校时、校分,校时电路是由一开关接到一个高电位上,当按一下开关就传送一个高位脉冲,计数器加一。

    连续脉冲
    时校
    24进制
    译码器
    显示器
    分校
    24进制
    译码器
    显示器
    秒校
    60进制
    译码器
    显示器

    四、元件、器件明细表

    1、74LS161N:
    可预置四位二进制计数器(并清除异步)
    1.QA~QD:计数输出端,输出二进制代码
    2.A~D:预置数据输入端,输入二进制代码
    3.CLK:相当于CP,接单次脉冲端输入
    4.ENT,ENP:计数控制端
    5.~CLR:直接清零端
    6.~LOAD:预置数控制端
    7.RCO:进位输出端
    在这里插入图片描述
    2、74LS85D:
    四位数字比较器
    通过功能表可知,该比较器的比较原理和两位比较器的比较原理相同。两个4位数的比较是从芯片1的最高位A3和芯片2的最高位B3进行比较,如果它们不相等,则该位的比较结果可以作为两数的比较结果。若最高位A3=B3,则再比较次高位A2和B2,余类推。显然,如果两数相等,那么,比较步骤必须进行到最低位才能得到结果,即可从而达到定时闹钟的效果。
    在这里插入图片描述
    3、74LS04N:
    74LS04是六个单输入端的反相器.它的输出信号与输入信号相位相反。六个反相器共用电源端和接地端,其它都是独立的。输出信号手动负载的能力也有一定程度的放大。
    在这里插入图片描述
    4、7400 输入与非门:
    内含四个独立的2输入端与非门,其逻辑功能是:输入端全部为1时,输出为0;输入端只要有0,输出就为1.
    在这里插入图片描述
    5、74LS08J 2输入四与门:
    与门,详细地说是4二输入与门,即一片74LS08芯片内有共四路二个输入端的与门。
    在这里插入图片描述
    6、74LS20D 4输入双与非门:
    两个4输入与非门,内含两组4与非门。
    在这里插入图片描述
    7、元件、器件明细表:

    序号 名称 数量
    1 显示译码器 6
    2 蜂鸣器 2
    3 74LS161N 6
    4 74LS85D 4
    5 7400N 8
    6 74LS08J 3
    7 74LS20D 2
    8 瞬时开关 3
    9 开关组 4
    10 数字电源VCC 5
    11 时钟脉冲源 1
    12 单刀双置开关 1
    13 电子探针 1

    附:74LS系列通用逻辑电路功能表

    五、各个电路模块分析

    1、闹钟电路

    闹钟电路蛮好做,如图,采用4片74LS85D芯片和4个拨码开关构成闹钟电路,从最低位(分个位)对应的比较器74LS85D(U21)的OAEQB端输出高电平,从而实现闹钟功能。

    在这里插入图片描述

    2、校时电路

    在分、秒的与非门与上一级的脉冲接口之间接瞬间开关即可。当开关按下时,产生一个低电平给计数器,从而在下降沿的时候计数器加一。
    注:瞬时开关是交互组件,在Multisim中可以通过键盘上的一个键或使用鼠标点击激活,
    在这里插入图片描述

    3、时记时电路

    24进制的实现用的是两片74LS161芯片以及与非门实现24进制(00~23)。时计时器的十位是二进制,个位是十进制,同时和与非门相连,实现满24时清零,由于小时位和分为、秒为不同,它是以十进制来显示24进制数,即它有两个清零信号,一是在小时的个位计数到10的瞬间,向本位发送一个清零信号,并同时向十位数发送一个进位脉冲。二是在小时的十位计数到2并且个数计数到4的瞬间,向个位和十位同时发送一个清零信号。
    在这里插入图片描述

    4、分、秒记时电路

    60进制的实现是采用两片74LS161芯片和与非门实现的,分、秒计数器的十位都是60进制,个位都是10进制,共同构成60精致。分、秒计时电路的控制是一样的,采用同一器件74LS161N的反馈置数法来实现10进制功能和6进制功能,根据芯片74LS161N的结构把输出端的0100(十进制为6)用一个与非门7400N引到CLR端便可置0,即当分(秒)的个位计数到10的瞬间,向本位发送一个清零信号,并同时向其个位发送一个进位脉冲。分(秒)的十位加法计数器在计数到6的瞬间,向本位发送一个清零信号,并同时向分(秒)位的个位发送一个进位脉冲。这样就构成了一个级联而形成的60进制带进位与清零的加法计数器。

    在这里插入图片描述

    六、总电路图

    - 不带闹钟总电路图:
    在这里插入图片描述
    - 带闹钟总电路图:
    在这里插入图片描述

    七、测试结果图

    连接好电路图后,准备开始仿真,同时可测试闹钟功能。
    结果如下:
    在这里插入图片描述

    文献

    1、参考作者以及网址

    https://blog.csdn.net/Jason_yesly
    https://blog.csdn.net/Jason_yesly/article/details/85297274


    https://wenku.baidu.com/view/64c63f1edd36a32d737581bc.html
    https://wenku.baidu.com/view/bb573f76700abb68a982fbe5.html

    2、书籍文献

    《电路基础与电子技术》
    《电类专业基础实践教程》

    总结

    以上,就是我对该实验的看法,通过实训,虽然最终电路设计有些缺陷和不足,但掌握了许多知识,学会了用Multisim仿真的基本操作,对改进电路和连接线路方面上有很充分的研究和认识,同时通过查阅大量书籍和网上资料,对元件的选用和代替以及不同元件的不同特性也作了比较到最终的选用,以及最终电路中某些开关以及小型元器件的参数调整进行了反复地测试,到达了基本本课题的基本要求,特别是对Multisim该软件的认识以及运用和该课题中所用到的模拟电子技术和数字电子技术的知识的运用。
    本博客,是我在CSDN上第一次发的博客,毕竟自己忙活了几周的结果,自己学到了不少知识,通过书本资料和网站确实不易。若有不当错误,望评论区订正。

    展开全文
  • 基于Arduino的多功能数字时钟

    万次阅读 多人点赞 2017-05-08 22:07:57
    实现功能: 1. 显示时间、日期和星期 2. 断电保存时间 3. 通过按钮设置时间、日期 4. 整点响铃 5. 自定义闹钟 6. 显示温度 7. 自定义报警温度 8. 按键功能:按选择键进入设置时间功能;同时按 + - 键进入...

    实现功能:

    1. 显示时间、日期和星期
    2. 断电保存时间
    3. 通过按钮设置时间、日期
    4. 整点响铃
    5. 自定义闹钟
    6. 显示温度
    7. 自定义报警温度
    8. 按键功能:按选择键进入设置时间功能;同时按 + - 键进入闹钟和报警温度设置功能;
    9. 再按选择键光标跳动,光标跳到哪当前的参数即可通过加减键修改。

    实验所需器件:
    Arduino开发板或Atmega328P芯片、DS1302时钟芯片、温度传感器DS18b20、蜂鸣器、不带锁开关、LCD1602、10K可调电阻、10K电阻(可不接,即DS18b20端口的电阻可去掉,不影响读数)

    Proteus ISIS 仿真图:
    这里写图片描述
    依赖库下载:
    DS1302
    OneWire
    DallasTemperature

    依赖库的安装方法,如不清楚,可以参考官方文档《安装其他的Arduino库》

    实物图:
    这里写图片描述

    程序如下:

    /* * 
     * LCD RS pin to digital pin 12
     * LCD Enable pin to digital pin 11
     * LCD D4 pin to digital pin 5
     * LCD D5 pin to digital pin 4
     * LCD D6 pin to digital pin 3
     * LCD D7 pin to digital pin 2
     * LCD R/W pin to ground
     * LCD VSS pin to ground
     * LCD VCC pin to 5V 
     * */
    #include <DS1302.h>    
    #include <LiquidCrystal.h>       //LCD1602显示头文件
    #include <OneWire.h> 
    #include <DallasTemperature.h>  //温度传感器DS18B20头文件
    #define ONE_WIRE_BUS A3            //DS18B20 信号端口 
    OneWire oneWire(ONE_WIRE_BUS); 
    DallasTemperature sensors(&oneWire);
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
    #define choose  A0   //选择端口
    #define add  A1      //加
    #define minus  A2    //减
    #define Tone 13      //蜂鸣器端口
    uint8_t CE_PIN   = 8;   //DS1302 RST端口
    uint8_t IO_PIN   = 9;   //DS1302 DAT端口
    uint8_t SCLK_PIN = 10;  //DS1302 CLK端口
    DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);  //创建 DS1302 对象
    unsigned long seconds;
    int s = 0, m = 0, h = 0, d = 0, mon = 0, y = 0;   //时间进位
    int second = 0, minute = 0, hour = 0, day = 0, month = 0, year = 0;  //当前时间
    int SECOND = 0, MINUTE = 0, HOUR = 0, DAY = 0, MONTH = 0, YEAR = 0;  //初始时间
    int chose = 0, alarm_choose = 0 ,ButtonDelay = 10, frequence = 2093;
    int alarm_hour = 7, alarm_minute = 30, alarm_second = 0;  //闹钟时间
    double Temperatures, Temp_Alarm = 30 ; 
    
    void setup(){    
        for(int i = 2;i <= 13; i++){
            pinMode(i,OUTPUT); 
        }                
        digitalWrite(add, HIGH);
        digitalWrite(minus, HIGH);
        digitalWrite(choose, HIGH);  
        lcd.begin(16, 2);  //初始化LCD1602 
        sensors.begin();   //初始化温度传感器DS18B20  
        //Time t(2015, 5, 16, 0, 2, 20, 1);  
        //rtc.time(t);  //设置DS1302芯片初始时间
        //由于当初遗留的一些问题,本方案有些不完美。我这里使用的方案是通电读取DS1302芯片的时间,然后再根据运行时间让时间走动。
        //如果对时间精确性比较敏感,可以改成始终从DS1302芯片读取时间。
        set(rtc.year(), rtc.month(), rtc.date(), rtc.hour(), rtc.minutes(), rtc.seconds());  
        rtc.write_protect(false);  // 关闭DS1302芯片写保护
        rtc.halt(false);           //为true时DS1302暂停
    }
    
    /** 格式化输出 */
    void FormatDisplay(int col, int row,int num){
        lcd.setCursor(col, row); 
        if(num < 10)   lcd.print("0");
        lcd.print(num);   
    }
    
    /** 计算时间 */
    void time() {    
        second = (SECOND + seconds) % 60;   //计算秒
        m = (SECOND + seconds) / 60;        //分钟进位
        FormatDisplay(6,1,second);
        
        minute = (MINUTE + m) % 60;  //计算分钟
        h = (MINUTE + m) / 60;       //小时进位
        FormatDisplay(3,1,minute);      
    
        hour = (HOUR + h) % 24;   //计算小时
        d = (HOUR + h) / 24;      //天数进位
        FormatDisplay(0,1,hour); 
        
        lcd.setCursor(2, 1);   
        lcd.print(":");   
        lcd.setCursor(5, 1);   
        lcd.print(":");  
    }
    
    /** 根据年月计算当月天数 */
    int Days(int year, int month){
        int days = 0;
        if (month != 2){
            switch(month){
                case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31;  break;
                case 4: case 6: case 9: case 11:  days = 30;  break;
            }
        }else{   //闰年    
            if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
                days = 29;          
            }    
            else{
                days = 28;  
            }     
        }  
        return days;   
    }
    
    /** 计算当月天数 */ 
    void Day(){     
        int days = Days(year,month);
        int days_up;
        if(month == 1){
            days_up = Days(year - 1, 12); 
        }   
        else{
            days_up = Days(year, month - 1);
        }  
        day = (DAY + d) % days;
        if(day == 0){
            day = days;  
        }     
        if((DAY + d) == days + 1 ){
            DAY -= days;
            mon++;
        }
        if((DAY + d) == 0){
            DAY += days_up;
            mon--;
        }
        FormatDisplay(8,0,day); 
    }
    
    /** 计算月份 */
    void Month(){  
        month = (MONTH + mon) % 12;
        if(month == 0){
            month = 12;
        }  
        y = (MONTH + mon - 1) / 12;
        FormatDisplay(5,0,month); 
        lcd.setCursor(7, 0);   
        lcd.print('-'); 
    }
    
    /** 计算年份 */
    void Year(){ 
        year = ( YEAR + y ) % 9999;
        if(year == 0){
            year = 9999;
        } 
        lcd.setCursor(0, 0); 
        if(year < 1000){ 
            lcd.print("0"); 
        }
        if(year < 100){ 
            lcd.print("0"); 
        }
        if(year < 10){ 
            lcd.print("0"); 
        }
        lcd.print(year);
        lcd.setCursor(4, 0);   
        lcd.print('-'); 
    }
    
    /** 根据年月日计算星期几 */
    void Week(int y,int m, int d){           
        if(m == 1){
            m = 13;
        }
        if(m == 2){
            m = 14;
        } 
        int week = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1; 
        String weekstr = "";
        switch(week){
            case 1: weekstr = "Mon. ";   break;
            case 2: weekstr = "Tues. ";  break;
            case 3: weekstr = "Wed. ";   break;
            case 4: weekstr = "Thur. ";  break;
            case 5: weekstr = "Fri. ";   break;
            case 6: weekstr = "Sat. ";   break;
            case 7: weekstr = "Sun. ";   break;
        }    
        lcd.setCursor(11, 0);  
        lcd.print(weekstr);
    }
    
    /** 显示时间、日期、星期 */
    void Display() { 
        time();
        Day();  
        Month();
        Year();
        Week(year,month,day);  
    }
    
    /** 显示光标 */
    void DisplayCursor(int rol, int row) {
        lcd.setCursor(rol, row);   
        lcd.cursor();
        delay(100);     
        lcd.noCursor();
        delay(100);    
    }
    
    /** 设置初始时间 */
    void set(int y, int mon, int d, int h, int m, int s){
        YEAR = y;
        MONTH = mon;
        DAY = d;  
        HOUR = h;
        MINUTE = m;
        SECOND = s;  
    }
    
    /** 通过按键设置时间 */
    void Set_Time(int rol, int row, int &Time){
        DisplayCursor(rol, row); 
        if(digitalRead(add) == LOW){
            delay(ButtonDelay);
            if(digitalRead(add) == LOW){
                Time ++;
            }           
            Display();      
        }  
        if(digitalRead(minus) == LOW){
            delay(ButtonDelay);
            if(digitalRead(minus) == LOW){
                Time --; 
            }            
            Display();  
        }
    }
    
    /** 按键选择 */
    void Set_Clock(){
        if(digitalRead(choose)==LOW){  
            lcd.setCursor(9, 1);  
            lcd.print("SetTime");
            while(1){       
                if(digitalRead(choose) == LOW){
                    delay(ButtonDelay);
                    if(digitalRead(choose) ==LOW){
                        chose++;  
                    }
                        
                } 
                seconds = millis()/1000; 
                Display(); 
                if(chose == 1){
                    Set_Time(1, 1, HOUR);      //SetHour
                }else if(chose == 2){ 
                    Set_Time(4, 1, MINUTE);    //SetMinute
                }else if(chose == 3){
                    Set_Time(7, 1, SECOND);    //SetSecond
                }else if(chose == 4){
                    Set_Time(9, 0, DAY);       //SetDay
                }else if(chose == 5){
                    Set_Time(6, 0, MONTH);     // SetMonth
                }else if(chose == 6){            
                    Set_Time(3, 0, YEAR);      //SetYear
                }else if(chose >= 7) {
                    chose = 0; 
                    break;
                }
            }
        }  
    }
    
    /** 设置闹钟小时 */
    void Set_Alarm_Hour(){
       DisplayCursor(1, 1);   
       if(digitalRead(add) == LOW){
           delay(ButtonDelay);
           if(digitalRead(add) == LOW){
               alarm_hour ++;
               if(alarm_hour == 24){
                   alarm_hour = 0;
               }   
               FormatDisplay(0,1,alarm_hour);   
           }
       }
        if(digitalRead(minus) == LOW){
                delay(ButtonDelay);
                if(digitalRead(minus) == LOW){                
                    alarm_hour --;
                    if(alarm_hour == -1){
                        alarm_hour = 23;
                    }   
                    FormatDisplay(0,1,alarm_hour); 
                }
        }
    }
    
    /** 设置闹钟分钟 */
    void Set_Alarm_Minute(){
       DisplayCursor(4, 1); 
       if(digitalRead(add) == LOW) {
           delay(ButtonDelay);
           if(digitalRead(add) == LOW){
                alarm_minute ++;
                if(alarm_minute == 60){
                    alarm_minute = 0;
                }  
                FormatDisplay(3,1,alarm_minute); 
           }
       }
        if(digitalRead(minus) == LOW){
                delay(ButtonDelay);
                if(digitalRead(minus) == LOW){                
                    alarm_minute --;
                    if(alarm_minute == -1){
                        alarm_minute = 59;
                    }  
                    FormatDisplay(3,1,alarm_minute); 
                } 
        }  
    }
    
    /** 设置报警温度 */
    void Set_Alarm_Temp(){  
        DisplayCursor(10, 1); 
        if(digitalRead(add) == LOW) {
            delay(ButtonDelay);
            if(digitalRead(add) == LOW){
                Temp_Alarm ++; 
            }             
        }
        if(digitalRead(minus) == LOW){
            delay(ButtonDelay);
            if(digitalRead(minus) == LOW){
                Temp_Alarm --; 
            }   
        }
    }
    
    /** 进入报警设置 */
    void Set_Alarm(){
        if(digitalRead(add) == LOW && digitalRead(minus) == LOW){
            alarm_hour = hour;
            alarm_minute = minute;
            //alarm_choose  = 1;
            lcd.setCursor(0, 0);   
            lcd.print("set alarm       ");  
            lcd.setCursor(6, 1);   
            lcd.print("00");         //闹钟秒数      
            while(1){
                if(digitalRead(choose) == LOW){
                    delay(ButtonDelay);
                    if(digitalRead(choose) == LOW){
                        alarm_choose++; 
    
                    }                    
                }
                lcd.setCursor(9, 1);   
                lcd.print(Temp_Alarm);
                lcd.setCursor(14, 1);  
                lcd.print((char)223);    //显示o符号
                lcd.setCursor(15, 1);  
                lcd.print("C");          //显示字母C     
                if(alarm_choose == 1){
                    Set_Alarm_Hour();
                }else if(alarm_choose == 2){
                    Set_Alarm_Minute();        
                }else if(alarm_choose == 3){
                    Set_Alarm_Temp(); 
                }else if(alarm_choose >= 4){
                    alarm_choose = 0;
                    break;
                }       
            }
        }
    } 
    
    /** 正点蜂鸣 */
    void Point_Time_Alarm(){
        if(minute == 0 && second == 0){
            tone(Tone,frequence); 
            delay(500);
            noTone(Tone);   
        }    
    }
    
    /** 闹钟 指定时间蜂鸣 */
    void Clock_Alarm(){
      if(hour == alarm_hour && minute == alarm_minute && second == alarm_second){
            tone(Tone,frequence); 
            delay(5000);
            noTone(Tone);   
      }
    } 
    
    /** 获取DS18B20温度 */
    void GetTemperatures(){
        sensors.requestTemperatures(); // Send the command to get temperatures
        Temperatures = sensors.getTempCByIndex(0);
        lcd.setCursor(9, 1) ;    
        lcd.print(Temperatures); //获取温度
        lcd.setCursor(14, 1);  
        lcd.print((char)223); //显示o符号
        lcd.setCursor(15, 1);  
        lcd.print("C"); //显示字母C     
    }
    
    /** 超过指定温度报警 */
    void Temperatures_Alarm(){
        if(Temperatures >= Temp_Alarm){
            tone(Tone,frequence); 
            delay(500);
            noTone(Tone);       
        }
    }
    
    void loop() { 
        seconds = millis()/1000;    //获取单片机当前运行时间 
        Display();       //显示时间
        Set_Clock();     //设置时间  
        Set_Alarm();     //设置闹钟
        Point_Time_Alarm();    //正点蜂鸣
        Clock_Alarm();         //闹钟时间蜂鸣
        GetTemperatures();     //获取DS18B20温度
        Temperatures_Alarm();  //超过指定温度报警
        Time t(year, month, day, hour, minute, second, 1);  //断电将单片机的当前时间写到DS1302芯片中
        rtc.time(t);
    }
    
    展开全文
  • FPGA-Verilog多功能数字时钟

    万次阅读 多人点赞 2018-05-13 12:02:33
    4. 按键功能设计:按键调整数字时钟分钟显示;1.数字时钟顶层模块RTL视图1) 说明:这个为数字时钟的顶层模块,按键消抖模块xd,计数模块分秒CNT59,时CNT24,数码管显示sz,时间模块div;2)...

    一.数字时钟设计

    1.硬件资源:共阴极数码管一块,FPGA开发板一块(EP4CE40F23C8);

    2. 开发板资源:3颗独立按键,数码管接口;

    3. 功能设计:三种功能:a.时钟功能;b.校时功能;

    4. 按键功能设计:按键调整数字时钟分钟显示;

    1.数字时钟顶层模块RTL视图


    1) 说明:这个为数字时钟的顶层模块,按键消抖模块xd,计数模块分秒CNT59,时CNT24,数码管显示sz,时间模块div;

    2) 端口

    输入:clock,reset;

    输出:keyl,sel,seg;

    3) 代码

    module top(keyl,clock,reset,sel,seg);
    input clock,reset;
    input[2:0] keyl;
    output[2:0]    sel;
    output[7:0] seg;
    wire clk_2k,clk_3k,clk_1k,cp,cp2,clk1,clk2,clk3,rst2,rst3;
    wire[31:0] data;
    wire[7:0] dout,cout;
    wire[2:0] key_w,K1,K2,K3,key_r;
    xd m1(.clk_4k(clk3),.key_w(keyl),.key_r(key_r));
    
    div m2(.clock1(clock),.clk1(clk1),.Key(key_r),.clk2(clk2),.clk3(clk3));
    
    CNT59 m3(.clk_3k(clk1),.rst3(reset),.K2(key_r),.K3(key_r),.cp(cp),.cout(data[7:0]),.cout1(data[19:12]));
    CNT24 m4(.clk_2k(cp),.rst2(reset),.K1(key_r),.dout(data[31:24]));
    
    sz m5(.clk_1k(clk2),.data(data),.sel(sel),.seg(seg));
    endmodule 

    2.按键消抖模块


    1) 说明:这个模块为按键消抖模块,三颗按键;

    2) 端口

    输入:clk_4k,key_w;

    输出:key_r;

    3) 代码

    module xd(clk_4k,key_w,key_r);
    input clk_4k;
    input[2:0] key_w;
    output[2:0] key_r;
    reg[2:0] k1,k2,k3;
    always@(posedge clk_4k)
    begin 
    	k3 <= k2;  
    	k2 <= k1;  
    	k1 <= key_w;        
    end
    assign key_r = k1 & k2 & k3;
    endmodule 

    3. 数码管模块


    1) 说明:这个为8位共阴极数码管模块;

    2) 端口

    输入:clk——1k,data;

    输出:sel,seg;

     3)代码

    module sz(clk_1k,data,sel,seg);
    input clk_1k;
    input[31:0] data;
    output[2:0]	sel;
    output[7:0] seg;
    
    reg[7:0] seg_r;
    reg[2:0] sel_r;
    reg[3:0] disp_dat;
    reg[2:0]count;
    
    assign sel= sel_r;
    assign seg = seg_r;	
    
    always @(posedge clk_1k)
    begin
    if(count<3'd7)
    	begin
    		count <= count + 1'b1;
    	end
    else
    	begin
    		count<=3'd0;
    	end
    end
    
    always @(posedge clk_1k)   						
    begin
    	case(count)
    		3'd0:disp_dat = data[31:28];
    		3'd1:disp_dat = data[27:24];
    		3'd2:disp_dat = 4'ha;
    		3'd3:disp_dat = data[19:16];
    		3'd4:disp_dat = data[15:12];
    		3'd5:disp_dat = 4'hb;
    		3'd6:disp_dat = data[7:4];
    		3'd7:disp_dat = data[3:0];
    	endcase
    	case(count)
    		3'd7:sel_r = 3'b111;
    		3'd6:sel_r = 3'b110;
    		3'd5:sel_r = 3'b101;
    		3'd4:sel_r = 3'b100;
    		3'd3:sel_r = 3'b011;
    		3'd2:sel_r = 3'b010;
    		3'd1:sel_r = 3'b001;
    		3'd0:sel_r = 3'b000;
    	endcase	
    end
    
    always @(disp_dat)
    begin
    	case(disp_dat)
    		4'h0:seg_r = 8'h3f;
    		4'h1:seg_r = 8'h06;
    		4'h2:seg_r = 8'h5b;
    		4'h3:seg_r = 8'h4f;
    		4'h4:seg_r = 8'h66;
    		4'h5:seg_r = 8'h6d;
    		4'h6:seg_r = 8'h7d;
    		4'h7:seg_r = 8'h07;
    		4'h8:seg_r = 8'h7f;
    		4'h9:seg_r = 8'h6f;
    		4'ha:seg_r = 8'h40;
    		4'hb:seg_r = 8'h40;
    	endcase
    end
    endmodule
    

    4.时钟钟功能模块


    1) 说明:这个模块为数字钟功能模块,包括小时模块CNT24,分秒模块CNT59;

    2) 端口

    输入:clk,reset,key;

    输出:cout;

    3) 代码

    module CNT59(clk_3k,rst3,K2,K3,cp,cout,cout1);
    input clk_3k,rst3;
    input[2:0] K2,K3;
    output[7:0] cout,cout1;
    output cp;
    reg [7:0] n,m;
    reg cp,cq;
    assign cout=n;
    assign cout1=m;
    always@(posedge clk_3k || K2 == 3'b110)
    begin
    	n[3:0]<=n[3:0]+4'd1;
    	if(n[3:0] == 4'd9)
    	begin
    		n[3:0]<=4'b0;
    		n[7:4]<=n[7:4]+4'b1;
    		if(n[3:0] == 4'd9 && n[7:4] == 4'd5)
    		begin
    			n<=8'h00;
    		end
    	end
    end
    
    always@(n)
    begin
    	if(n[7:4]==4'd5 && n[3:0]==4'd9 ) cq=1'b1;
    	else cq=1'b0;
    end
    
    always@(posedge cq || K3 == 3'b101)
    begin
    	m[3:0]<=m[3:0]+4'd1;
    	if(m[3:0] == 4'd9)
    	begin
    		m[3:0]<=4'b0;
    		m[7:4]<=m[7:4]+4'b1;
    		if(m[3:0] == 4'd9 && m[7:4] == 4'd5)
    		begin
    			m<=8'h00;
    		end
    	end
    end
    
    always@(m)
    begin
    	if(m[7:4]==4'd5 && m[3:0]==4'd9 ) cp=1'b1;
    	else cp=1'b0;
    end
    endmodule 

    module CNT24(K1,clk_2k,rst2,dout);
    input clk_2k,rst2;
    input[2:0] K1;
    output[7:0] dout;
    reg [7:0] dout;
    always@(posedge clk_2k || K1 == 3'b011)
    begin
    	if(dout[7:4]!=2)
    	begin
    		if(dout[3:0]==4'b1001)
    		begin
    			dout[7:4]<=dout[7:4]+4'b0001;
    			dout[3:0]<=4'b0000;
    		end
    		else
    		begin
    			dout[7:4]<=dout[7:4];
    			dout[3:0]<=dout[3:0]+4'b0001;
    		end
    	end
    	else
    		if(dout[3:0]==4'b0011)
    		begin
    			dout[7:4]<=4'b0000;
    			dout[3:0]<=4'b0000;
    		end
    		else
    		begin
    			dout[7:4]<=dout[7:4];
    			dout[3:0]<=dout[3:0]+4'b0001;
    		end
    end
    endmodule 

    5.div模块


    1) 说明:这个模块为分频模块;

    2) 端口

    输入:clock1,key;

    输出:clk1,clk2,clk3;

    3) 代码

    module div(clock1,clk1,Key,clk2,clk3);
    input clock1;
    input[2:0] Key;
    output clk1,clk2,clk3;
    reg clk1,clk2,clk3;
    reg[24:0] count1;
    reg[24:0] count2;
    reg[24:0] count3;  
    parameter  N1=50000000; 
    parameter  N2=2500;
    parameter  N3=500000;  
    always@(posedge clock1)
    	begin
    	if(Key == 3'b111)
    	begin
    		count1<=count1+1'b1;
    		  if(count1== N1/2-1)
    			begin	
    				clk1 <=~ clk1;
    			 	count1<=0;
    			end
    	end
    		count2<=count2+1'b1;
    		  if(count2==N2/2-1)
    		    begin
    	            clk2<=~clk2;
    	            count2<=0;
    	        end 
    		count3<=count3+1'b1;
    		  if(count3==N3/2-1)
    		    begin
    	            clk3<=~clk3;
    	            count3<=0;
    	        end 
    	end
    endmodule 


    展开全文
  • 数字时钟设计

    万次阅读 多人点赞 2017-12-08 21:00:15
    设计一个多功能数字时钟,有基本的数字时钟、秒表、闹钟三个功能。

    一、功能描述:

    设计一个多功能数字时钟,有基本的数字时钟、秒表、闹钟三个功能。其中,数字时钟可设置,秒表可以暂停和清零,闹钟可设置,到达设定时间后LED灯亮。

    二、具体说明

    1,数字时钟:
    当拨码开关为“00”状态时,对应功能为数字时钟状态。当按下一次设置键时,可以使用加减键设置小时,再次按下设置键时,可以使用加减键设置分钟。第三次按下设置键,返回正常数字时钟状态。
    2,秒表功能:
    当拨码开关为“01”状态时,对应功能为秒表。对应显示状态为“SS.0D”,这里,SS代表秒,范围0~59。D代表毫秒,范围0~9。两个按键,按键一代表暂停与继续,按键二代表清零。
    3,闹钟功能:
    当拨码开关为“10”状态时,对应功能为闹钟。默认进入闹钟状态时,不可以设置闹钟时间。当按下一次设置键时,可以使用加减键设置闹钟小时,再次按下设置键时,可以使用加减键设置闹钟分钟。第三次按下设置键,返回正常闹钟状态。

    三、框图

    这里写图片描述
    还没有总线的概念,因此各个模块和状态机的连线比较复杂。
    主要模块:数字时钟、秒表、闹钟设置、按键驱动、拨码开关驱动、数码管显示以及转换电路、LED显示、状态机。
    顶层模块:拨码开关选择功能,对应数码管显示不同内容。实际上就是动态地连接输入输出。

    四、各个模块的IO说明

    1,按键扫描模块

    module key_scan(
        input clk,
        input rst_n,
        input [4:0]button,  //Buttons
        output button_flag, //press button flag
        output [4:0]db_button   //debounced button,High valid
    );

    借鉴了CrazyBingo设计的按键消抖模块,这里button flag为指示有按键按下的标志,当db_button之中有任何一个按下时,button_flag维持一个时钟的高电平。

    2,拨码开关消抖模块

    module debounce_slide_switch(
        input clk,
        input rst_n,
        input [1:0]slide_switch,//slide switch
        output [1:0]db_slide_switch //debounced slide switch
    );
    

    利用《FPGA prototyping by Verilog examples》一书中P146页的拨码开关消抖例子来实现的,主要思路就是间隔一段时间去读取相应电平高低。

    3,数码管显示模块

    module data_disp_convert(
        input clk,
        input rst_n,
        input [5:0] bin_data1,      //input data to display in binary
        input [5:0] bin_data2,      //    
        input [3:0]dp_in,           //4 decimal points
        input start,        //start to convet binary to BCD
        output [7:0]seg_display,//7 segment display
        output [3:0]an_seg      //anode 7 segment display select
        );

    主要就是将输入的二进制数据转换为BCD码,然后将十位和个位分别显示在数码管上,dp_in为各个位的小数点。bin_data1和bin_data2为要显示的两个二进制数据。start为启动bin2bcd转换的信号。输出则是数码管8位段选信号和4个片选信号。
    下面来看一下内部构成,主要由‘bin2bcd’的数据格式转换模块和‘four_segment_display’十六进制数码管显示电路组成。
    bin2bcd模块的接口如下,主要完成二进制编码到BCD编码的转换。

    module bin2bcd(
        input clk,
        input rst_n,
        input start,
        input [12:0] bin,   //0000-8191
        output reg ready,   //ready to receive data to display
        output reg done_tick,//transform done trick signal
        output [3:0] bcd3,bcd2,bcd1,bcd0 //binary coded decimal
        );

    这部分利用《FPGA prototyping by Verilog examples》一书中P160页的Binary-to-BCD conversion的例子来实现的,需要注意的是start为启动转换信号,ready为可以转换信号(模块不忙),done_tick为转换结束标志位,当转换完成时,持续一个时钟周期,提醒显示模块读取数据。
    four_segment_display模块的接口如下:

    module four_segment_display(
        input clk,
        input rst_n,
        input load_data,    //load input signal
        input [3:0]data1,data2,data3,data4, //input data to display, in binary mode
        input [3:0]dp_in,   //4 decimal points
        output reg[7:0]seg_display,//7 segment display
        output reg[3:0]an_seg       //anode 7 segment display select
        );

    这部分很简单,就是将输入的四个数据按照预先编定的查找表,然后将显示数据依次送到数码管的段选上。这部分代码参考《FPGA prototyping by Verilog examples》一书中P99页的LED time-multiplesing circuit的例子。

    显示部分需要注意的就是,只有当bin2bcd模块的done_tick为高电平时,four_segment_display模块的load_data信号才为高,这时候才载入新的显示数据,以防在bin2bcd模块进行数据转换时,错误的数据被送给four_segment_display。

    4,正常时钟模块

    module normal_clock(
        input clk,
        input rst_n,
        input button_flag,      //button pressed flag
        input [4:0]db_button,
        output reg [3:0]dp_in,          //data points
        output [5:0]hh_data,mm_data //hour,minute in binary of 6 bits
        );

    输入按键信号,输出小时分钟(二进制格式)和小数点。这部分后面单独一个标题来说明。

    5,秒表模块

    module stopwatch(
        input clk,
        input rst_n,
        input button_flag,      //button pressed flag
        input [4:0]db_button,       //debounced button
        output reg [3:0]dp_in,          //data points
        output reg [5:0]stopwatch_ss,stopwatch_ms   //stopwatch's second and millisecond
        );

    这部分代码参考《FPGA prototyping by Verilog examples》一书中P107页的stopwatch的例子。

    6,闹钟模块

    module alarm_clock(
        input clk,
        input rst_n,
        input button_flag,
        input [4:0]db_button,       //debounced button
        input [5:0]hh_data,mm_data, //get the current time
        output reg led_alarm,           //led for alarming
        output reg [3:0]dp_in,          //data points
        output [5:0]alarm_hh_data,  // the setted alarm's hour
        output [5:0]alarm_mm_data   // the setted alarm's minute
        );

    主要就是获取当前的的时钟数据,以便和设置的闹钟数据进行对比。

    五,正常时钟模块

    这里主要讲一下正常时钟模块的设计思路,其他的闹钟或者秒表实际思路差不多。
    先来看一下需要实现的功能:
    1)显示格式为HH.MM,秒数利用小数点来显示。随着时钟运行,小数点闪烁。
    2)key[0]:在正常运行、设置HH、设置MM三个状态之间进行切换。利用小数点指示当前是设置小时还是分钟。
    3)Key[2] “++”。
    4)Key[4]“–”。
    状态转换图如下:
    这里写图片描述
    在这里设置三个状态,分别为normal、set_hh、set_mm,对应正常运行、设置小时、设置分钟三个状态。
    1) Normal状态,ss_reg正常累加,hh_reg和mm_reg根据进位累加。dp_in[2]跟随秒嘀嗒闪烁。
    2)Set_hh状态,ss_reg清零,hh_reg根据按键相应加减。Dp_in[3]亮起。
    3)Set_mm状态,ss_reg清零,mm_reg根据按键相应加减。Dp_in[1]亮起。
    需要操纵的数据主要是小时数,分钟数,秒数。数据路径需要执行的操作:
    1)秒数的累加与清零。
    2)hh_reg和mm_reg的进位累加和累减。
    为了状态机写起来直观,将控制路径和数据路径分开。根据以上的抽象,FSM对data path的control signal利用以下几个:
    1)ss_go来实现秒数的运行和暂停,ss_clr实现秒数的清零。
    2)hh_up_down来实现小时数的加减。
    3) mm_up_down来实现分钟的加减。
    部分代码如下:
    信号声明:

    //symbolic state declaration
    localparam [1:0]
        NORMAL = 2'b00,
        SET_HH = 2'b01,
        SET_MM = 2'b10;
    //signal declaration
    //clk=100Mhz,(100^6/100_000_000=1Hz)
    localparam FREQ_DV=32'd100_000_000; 
    //localparam FREQ_DV=32'd20;        //only for test
    //signal declaration
    reg [1:0] state_reg,state_next;
    reg [31:0] ss_tick_reg; //second tick register
    wire [31:0]ss_tick_next;
    wire ss_tick;           //second tick
    
    reg [7:0] ss_reg,mm_reg,hh_reg; //second,minute,hour register
    wire [7:0] ss_next,mm_next,hh_next;
    reg ss_go;  //second go or stop signal
                //1:go
                //0:stay at current value
    reg ss_clr; //second claer signal
                //1:clear
               //0:other
    reg ss_tick_clr;
    
    reg [1:0]hh_up_down;    //hour up or down signal
                            //00:keep current data;
                            //01:counter up
                            //10:counter down
                            //11:clear to zero
    reg [1:0]mm_up_down;    //minute up or down signal

    状态转换:

    //fsmd state & data register
    always @(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            begin           
                state_reg<=NORMAL;  // reset
                ss_tick_reg<=0;
                ss_reg<=0;
                mm_reg<=0;
                hh_reg<=0;
            end
        else 
            begin
                state_reg<=state_next;
                ss_tick_reg<=ss_tick_next;
                ss_reg<=ss_next;
                mm_reg<=mm_next;
                hh_reg<=hh_next;    
            end
    end

    数据流路径:

    //generate the second tick
    assign ss_tick_next = (ss_tick_clr || (ss_tick_reg==FREQ_DV-1'b1)) ? 31'd0 : ss_tick_reg + 1'b1;
    
    assign ss_tick = (ss_tick_reg==FREQ_DV-1'b1) ? 1'b1 : 1'b0;
    
    //FSMD data path next-state logic
    assign ss_next = (ss_clr)? 0 :
                     (ss_go)? (ss_reg + 1'b1) :
                               ss_reg;
    //assign ss_next = (ss_go_clr)? (ss_reg + 1'b1) : 0;
    
    assign hh_next = (hh_up_down == 2'b00)? hh_reg :
                     (hh_up_down == 2'b01)? hh_reg + 1'b1 :
                     (hh_up_down == 2'b10)? hh_reg - 1'b1 : 0;
    assign mm_next = (mm_up_down == 2'b00)? mm_reg :
                     (mm_up_down == 2'b01)? mm_reg + 1'b1 :
                     (mm_up_down == 2'b10)? mm_reg - 1'b1 : 0;

    状态转换机:

    //FSMD control path next-state logic
    always @*
    begin
        state_next=state_reg;   //default state: the same
    
        ss_clr=1'b1;            //ss_next=0
        ss_go=1'b0; 
        ss_tick_clr=1'b1;       //second tick clear
        hh_up_down=2'b00;       //hh_next=hh_reg
        mm_up_down=2'b00;       //mm_next=mm_reg
    
        case(state_reg)
            NORMAL:
                begin
                ss_tick_clr = 1'b0;
                ss_clr = 1'b0;
                    if(button_flag)
                        begin
                            if(db_button[0])
                                state_next=SET_HH;
                        end
                    else 
                        begin
                            if(ss_tick)
                                begin                               
                                    if(ss_reg!=8'd59)
                                        ss_go=1'b1;
                                    else
                                        begin
                                            ss_clr = 1'b1;/
                                            if(mm_reg!=8'd59)
                                                mm_up_down = 2'b01;
                                            else 
                                                begin
                                                    mm_up_down = 2'b11;
                                                    if(hh_reg !=8'd23)
                                                        hh_up_down = 2'b01;
                                                    else
                                                        hh_up_down = 2'b11;
                                                end
                                        end
                                end
                        end
                end
            SET_HH:
                begin
                    ss_tick_clr=1'b1;       //second tick clear
                    ss_clr=1'b1;            //ss_next=0             
                    if(button_flag)
                        begin
                            if(db_button[0])
                                state_next=SET_MM;
                            else if(db_button[2])   //hour ++
                                begin
                                    if(hh_reg !=8'd23)
                                        hh_up_down = 2'b01;                                 
                                    else 
                                        hh_up_down = 2'b11;
                                end                          
                            else if(db_button[4])   //hour --
                                begin
                                    if(hh_reg !=8'd0)
                                        hh_up_down = 2'b10;                                 
                                    else 
                                        hh_up_down = 2'b11;
                                end 
                        end
                end
            SET_MM:
                begin
                    ss_tick_clr=1'b1;       //second tick clear
                    ss_clr=1'b1;            //ss_next=0                     
                    if(button_flag)
                        begin
                            if(db_button[0])
                                state_next=NORMAL;
                            else if(db_button[2])   //minute ++
                                begin
                                    if(mm_reg !=8'd59)
                                        mm_up_down = 2'b01;
                                    else 
                                        mm_up_down = 2'b11;
                                end
                            else if(db_button[4])   //minute --
                                begin
                                    if(mm_reg !=8'd0)
                                        mm_up_down = 2'b10;
                                    else 
                                        mm_up_down = 2'b11;
                                end
                        end
                end
            default: state_next=NORMAL;
            endcase
    end

    同步化输出:

    //output data point signal
    always @(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            begin           
                dp_in <=4'b1111;    //reset,data point off
            end
        else
            begin
                case(state_reg)
                    NORMAL:
                        if(ss_tick)
                        dp_in <={1'b1,~dp_in[2],1'b1,1'b1};    
                    SET_HH:
                        dp_in <= 4'b0111;
                    SET_MM:
                        dp_in <= 4'b1101;
                    default:
                        dp_in <= 4'b1111; 
                endcase
            end
    end
    assign hh_data = hh_reg[5:0];
    assign mm_data = mm_reg[5:0];

    七,总结

    学到了什么,
    1)学到了状态机写法,control path和data path的抽象分立和通信。
    2)模块化划分,各个模块之间的通信。
    待学习:
    1)四段式状态机写法。
    2)常用的模块间通信控制信号。

    展开全文
  • 多功能数字时钟

    千次阅读 2015-07-27 14:11:35
    该时钟具有时、分、秒计时的电子电路,24小时制计时。能够准确计时,以数字的形式显示时、分、秒;具有分、时校正功能,校正输出脉冲频率为1HZ;具有仿广播电台整点报时功能,即每逢59分51秒,53秒,57秒时,发出...
  • FPGA实现多功能数字钟(Verilog)

    千次阅读 多人点赞 2020-06-15 11:26:12
    FPGA实现多功能数字钟(Verilog)介绍整体框架 介绍 本文设计的数字钟的功能包括:正常时钟、日期显示、调整时间(日期)、整点报时、闹钟(包括闹钟音乐)、秒表、数码管显示。使用的rtl语言为Verilog,参考了一些...
  • VHDL编写多功能数字钟,spartan3 FPGA开发板硬件实现-学习笔记1.数字钟标准-功能总体描述1.1 正常时间显示模式1.2 秒表模式1.3 闹铃设定模式1.4 时间设定模式 个人理解对于一个数字设计过程需要先进行功能总体描述...
  • 数字逻辑 课程设计 多功能电子 Quartus II

    万次阅读 多人点赞 2014-09-27 15:00:31
    设计方案 1.系统功能描述 (1) 系统输入:系统状态及校时、定时转换的控制信号为k、set;...(3) 多功能数字钟控制器的状态图如图所示 图中:S0:显示计时器时间 T0:显示闹铃时间  S1:调计
  • 多功能数字时钟(VHDL)

    千次阅读 多人点赞 2021-01-22 10:53:19
    功能要求2.各个模块描述三、具体实现过程描述1、小时计时2、分计时3、秒计时4、闹钟小时计时5、闹钟分计时6、闹钟比较模块7、控制器模块(设置状态转换)8、控制显示模块(显示时间以及校时,校分,秒清零,设置闹钟...
  •  自从学习FPGA以来,唯一做过的完整系统就是基于basys2得多功能数字表。记得当时做的时候也没少头疼,最后用时间磨出来了一个不是很完整的小系统,当时还是产生了满满的成就感。现在回头看来,先不说功能实现的如何...
  • 简易数字钟设计

    千次阅读 2019-07-06 14:42:15
    简易数字钟设计 一、摘要 信息时代,时间观念深入人心,所以掌握数字钟的设计具有一定的时代意义,并且使用Multisim进行分立元件设计数字钟,可以大大提升个人数字电路的素养。 设计思路是从上至下,先进行数字钟...
  • 优化第8章数字钟的程序,优化的具体内容主要是与时钟相关,采用同源时钟,经过严格的计数器分频后再连接到所有触发器,时钟不能经过路选择器直接连接到触发器的时钟端 编写测试激励,对数字钟进行仿真,要求仿真到...
  • 基于74LS161实现的多功能数字钟

    千次阅读 多人点赞 2020-01-03 22:39:22
    1、 利用74LS161芯片将各引脚正确连接实现计数功能,并将输出连接在DCD_HEX显像管上予以显示。 2、 利用两片74LS161芯片实现60进制和24进制并实现进位和进位后的清零功能。 图2 60进制的实现 图3 24进制的实现 3...
  • 基于BASYS 2开发板的多功能数字钟Verilog程序

    千次阅读 热门讨论 2017-04-12 20:18:48
    一、实验目的用 EDA 技术设计多功能数字钟 能够实现任意设定闹铃时间,到达闹钟时间时闹钟持续响一分钟 能够对小时进行12/24进制切换,并用LED指示AM和PM 整点报时,从整点零分一秒开始,奇数秒亮LED,偶数秒熄灭,...
  • 多功能数字电子

    千次阅读 2014-08-10 22:27:57
    多功能数字电子             姓 名:张士卫  班 级:计135班  学 号:201358501149 指导老师:沈春华      ●设计要求  在Quartus II环境下设计芯片完成二十四小时制计时、显示、整点报时、时间...
  • 基于VHDL实现的多功能电子钟设计

    千次阅读 2018-09-09 23:42:38
    主要功能要求: 1、电子时钟。要求用 24 时制显示。分屏显示“时、分”和“分、秒”,即 4 个数码管不能同时显示“时、分、秒”,但可以只显示“时、分”,或只显示“分、秒”,通过按键来切换这两种显示方式。用...
  • 今天给大侠带来基于 FPGA Vivado 的数字钟设计,开发板实现使用的是Digilent basys 3,如有想要入手basys3开发板的,可以联系牛总:18511371833。话不说,上货。 “FPGA产品设计与研发 ” 零基础入门及就业 ...
  • 数字电子电路——数字钟仿真图

    千次阅读 2019-04-22 14:44:22
    题目:多功能数字钟 要求: 1.设计的数字钟具有正常走时功能。 在计时开始或计时出现误差时,由校时电路完成对分、小时与标准时间的校准。 3.设计的数字钟具有显示功能。 设计的数字钟具有整点报时功能、要求能...
  • 1、基本要求:(80分)(1)时钟显示功能:时、分、秒采用数码管显示,要求与北京时间同步。...(2)多人共享模式:允许个人同时使用闹钟,即可以设置个提醒时间(至少3个)。所有要求都已经实现
  • 二级项目:数字系统设计——数字钟系统设计

    千次阅读 热门讨论 2009-09-10 22:14:00
    摘要本项目旨在设计一个多功能数字钟系统,整个试验过程包括最初的绘制电路图、在quartusII 上面仿真、下载到DE2板上面运行以及最后编写汇编程序实现数字钟功能。最终不仅按照要求项目实现了数字钟的计时、校时,校...
  • Verilog数字钟

    千次阅读 2019-10-31 08:16:41
    这次的做的题是:设计一个数字钟,该数字钟能进行正常的时,分计时功能,且能对数字钟的时间进行调整。 该数字钟有3个按键,按键1为功能键,用于数字钟在“正常计时”,“时调整”,“分调整”这三个功能之间切换;...
  • 数字数字钟课程设计

    千次阅读 2011-06-27 12:26:00
    2、 设计指标 (1) 时钟的“时”要求用两位显示;上、下午用发光管作为标志; (2) 时钟的“分”、“秒... 3、 设计原理 (1) 由石英晶体谐振荡器和分频器产生1HZ标准秒脉冲。 (2) “秒电路”、“分电路”均为00—5
  • FPGA数字时钟系统-设计教程

    千次阅读 2019-07-29 23:06:20
    数字钟是一个常用的数字系统,其主要功能是计时和显示时间。这里通过一个数字钟表的模块化设计方法,说明自顶向下的模块化设计方法和实现一个项目的设计步骤。这里实现的电子表具有显...
  • Verilog设计实例(7)基于Verilog的数字电子钟设计

    千次阅读 多人点赞 2020-06-17 21:51:43
    基于模块化的设计思想, 采用 Verilog HDL 语言设计一个能进行时、分、秒计时的二十四小时制的数字电子, 并具有整点报时功能。 采用数码管进行时间显示,要求显示格式为:小时-分钟-秒钟。
  • 数字钟设计与制作

    万次阅读 2008-01-17 16:30:00
    2006-06-13 11:28:37 数字钟设计与制作 数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。...
  • 数字钟课程设计(74HC393版)

    千次阅读 2019-12-26 13:44:27
    经过前几次的实验,我使用了74ls192等一系列芯片,今天给大家推荐一个超级好用,经济实惠的芯片74HC393,可以说专为数字钟设计,特别适合焊出作品,下面给大家讲解一下,当然有兴趣的可以看看之前的74HC192版本的...
  • 多功能数字电子仿真文件及文章全文请戳末尾链接一、功能1、显示时间2、显示星期3、时间校准4、整点报时5、(扩展功能)定时闹钟二、原理资料已存入文章末尾链接三、元件清单四、仿真截图五、实物展示六、故障及排查1...
  • 数字电路】数字电子时钟设计

    千次阅读 2021-04-21 14:32:33
    数字钟功能以及要求3.制作主要元器件4.设计原理5.各部分原理解析(1)石英晶体振荡电路(2)分频器电路(3)计数显示部分(4)译码显示部分(5)校时电路(6)整点报时电路(7)显示部分设计6.焊接调试7.图片展示9...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,362
精华内容 17,344
关键字:

多功能数字钟的设计