可编程数字系统设计课程设计实验报告实验名称:基于VHDL的数字钟设计_所属课程:可编程数字系统设计《可编程数字系统》课程设计一、课程设计目的:熟悉EDA工具;掌握用VHDL语言进行数字系统设计的基本方法和过程。二、设计任务:设计一数字钟,用数码管显示基本功能要求:(1)可以分屏显示时、分、秒,可用数码管的小数点“.”代替时、分、秒的分隔符“:”,分屏显示是指由于数码管只有4个,不能同时显示时、分、秒,但可以只显示时、分,或只显示分、秒,通过按键来切换这两种显示方式。(2)可设置时钟的开始时间。设置时,相应的数码管要闪烁,指示当前设置的设置(内容)。(3)具有闹铃功能,可以设定闹铃时间。闹铃时间到,LED闪烁进行指示。三、设计原理:数字钟的逻辑框图如图1所示。它由校时部分、闹钟部分、计时部分、显示部分组成。振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒钟计数器满60后向分计数器进位,分钟计数器满60后向小时计数器进位,时钟计数器按照“24归0”规律计数。计数器的输出分别经译码器送显示。当计时出现误差时或者到达另外一个时区时,可以用校时部分校时、校分、校秒。需要是用闹钟时,可以利用闹钟部分进行定时。四、系统分析:根据数字钟的功能,我们可以将它的系统电路设计划分为四个部分:校时部分、闹钟部分、计时部分和显示部分。其中计时部分又划分为秒钟计时模块、分钟计时模块、时钟计时模块,显示部分又划分为BCD译码模块和扫屏输出模块。校时模块秒钟计时模块分钟计时模块时钟计时模块译码模块扫屏输出闹钟模块LED灯图1数字钟的顶层实体描述如下:--TOP.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYdigitalclockISPORT(--输入时钟CLK:INSTD_LOGIC;--设定闹钟ALARM_SET:INSTD_LOGIC;--双键位校时SET:INSTD_LOGIC;MODE:INSTD_LOGIC;--选择显示方式CHG:INSTD_LOGIC;--八段译码输出out_data:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--输出片选seg_out:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--LED输出ED_OUT:OUTSTD_LOGIC);ENDdigitalclock;ARCHITECTUREEXAMPLEOFdigitalclockIS--元件例化COMPONENTadjusterPORT(--输入时钟CLK:INSTD_LOGIC;--双键位校时SET:INSTD_LOGIC;MODE:INSTD_LOGIC;--计数使能,接VCCEN:INSTD_LOGIC;--秒计数器进位输入S_ENOUT:INSTD_LOGIC;--分计数器进位输入M_ENOUT:INSTD_LOGIC;--输出1HZ时钟CLK1HZ:OUTSTD_LOGIC;--输出使能S_CE:OUTSTD_LOGIC;M_CE:OUTSTD_LOGIC;H_CE:OUTSTD_LOGIC);ENDCOMPONENT;COMPONENTCNT60PORT(--输入1HZ时钟CLK1HZ:INSTD_LOGIC;--计数使能EN:INSTD_LOGIC;--进位输出ENOUT:OUTSTD_LOGIC;--BCD输出LOW:OUTSTD_LOGIC_VECTOR(3DOWNTO0);HIGH:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENT;COMPONENTCNT24ORT(--输入1HZ时钟CLK1HZ:INSTD_LOGIC;--计数使能EN:INSTD_LOGIC;--BCD输出LOW:OUTSTD_LOGIC_VECTOR(3DOWNTO0);HIGH:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENT;COMPONENTdisplayPORT(--BCD输入in_data:INSTD_LOGIC_VECTOR(3DOWNTO0);--八段译码输出out_data:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDCOMPONENT;COMPONENTsaopingPORT(--选择显示方式CHG:INSTD_LOGIC;--BCD输入SL:INSTD_LOGIC_VECTOR(7DOWNTO0);SH:INSTD_LOGIC_VECTOR(7DOWNTO0);ML:INSTD_LOGIC_VECTOR(7DOWNTO0);MH:INSTD_LOGIC_VECTOR(7DOWNTO0);HL:INSTD_LOGIC_VECTOR(7DOWNTO0);HH:INSTD_LOGIC_VECTOR(7DOWNTO0);ALARM_L:INSTD_LOGIC_VECTOR(7DOWNTO0);ALARM_H:INSTD_LOGIC_VECTOR(7DOWNTO0);--输入时钟CLK:INSTD_LOGIC;--输出片选seg:outstd_logic_vector(3downto0);--BCD输出out_data:outstd_logic_vector(7downto0));ENDCOMPONENT;COMPONENTalarmPORT(--输入时钟CLK:INSTD_LOGIC;--设定闹钟ALARM_SET:INSTD_LOGIC;--BCD输入IN_HL:INSTD_LOGIC_VECTOR(3DOWNTO0);IN_HH:INSTD_LOGIC_VECTOR(3DOWNTO0);IN_ML:INSTD_LOGIC_VECTOR(3DOWNTO0);IN_MH:INSTD_LOGIC_VECTOR(3DOWNTO0);--BCD输出LOW:OUTSTD_LOGIC_VECTOR(3DOWNTO0);HIGH:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--LED输出LED_OUT:OUTSTD_LOGIC);ENDCOMPONENT;--常数说明CONSTANTVCC:STD_LOGIC:='1';--信号说明SIGNALVCC_CON:STD_LOGIC;SIGNALS_ENOUT:STD_LOGIC;SIGNALM_ENOUT:STD_LOGIC;SIGNALCLK1HZ:STD_LOGIC;--计数使能SIGNALS_CE:STD_LOGIC;SIGNALM_CE:STD_LOGIC;SIGNALH_CE:STD_LOGIC;--BCD码SIGNALSL:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALSH:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALML:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALMH:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALHL:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALHH:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALALARM_LOW:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALALARM_HIGH:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALSL_OUT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALSH_OUT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALML_OUT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALMH_OUT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALHL_OUT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALHH_OUT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALALARM_L_OUT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALALARM_H_OUT:STD_LOGIC_VECTOR(7DOWNTO0);BEGIN--元件声明ADJUST_CONTROL:adjusterPORTMAP(--输入时钟CLK=CLK,--双键位校时SET=SET,MODE=MODE,--计数使能,接VCCEN=VCC_CON,--秒计数器进位输入S_ENOUT=S_ENOUT,--分计数器进位输入M_ENOUT=M_ENOUT,--输出信号CLK1HZ=CLK1HZ,--输出使能S_CE=S_CE,M_CE=M_CE,H_CE=H_CE);VCC_CON=VCC;S_CONTROL:CNT60PORTMAP(--输入1HZ时钟CLK1HZ=CLK1HZ,--计数使能,接VCCEN=S_CE,--进位输出ENOUT=S_ENOUT,--BCD输出LOW=SL,HIGH=SH);M_CONTROL:CNT60PORTMAP(--输入1HZ时钟CLK1HZ=CLK1HZ,--计数使能EN=M_CE,--进位输出ENOUT=M_ENOUT,--BCD输出LOW=ML,HIGH=MH);H_CONTROL:CNT24PORTMAP(--输入1HZ时钟CLK1HZ=CLK1HZ,--计数使能EN=H_CE,--BCD输出LOW=HL,HIGH=HH);ALARM_CLOCK:alarmPORTMAP(--输入时钟CLK=CLK,--设定闹钟ALARM_SET=ALARM_SET,--BCD输入IN_HL=HL,IN_HH=HH,IN_ML=ML,IN_MH=MH,--BCD输出LOW=ALARM_LOW,HIGH=ALARM_HIGH,--LED输出LED_OUT=LED_OUT);SL_DIS:displayPORTMAP(--BCD输入in_data=SL,--八段译码输出out_data=SL_OUT);SH_DIS:displayPORTMAP(--BCD输入in_data=SH,--八段译码输出out_data=SH_OUT);ML_DIS:displayPORTMAP(--BCD输入in_data=ML,--八段译码输出out_data=ML_OUT);MH_DIS:displayPORTMAP(--BCD输入in_data=MH,--八段译码输出out_data=MH_OUT);HL_DIS:displayPORTMAP(--BCD输入in_data=HL,--八段译码输出out_data=HL_OUT);HH_DIS:displayPORTMAP(--BCD输入in_data=HH,--八段译码输出out_data=HH_OUT);ALARM_L_DIS:displayPORTMAP(--BCD输入in_data=ALARM_LOW,--八段译码输出out_data=ALARM_L_OUT);ALARM_H_DIS:displayPORTMAP(--BCD输入in_data=ALARM_HIGH,--八段译码输出out_data=ALARM_H_OUT);SAOPINGQI:saopingPORTMAP(--BCD输入SL=SL_OUT,SH=SH_OUT,ML=ML_OUT,MH=MH_OUT,HL=HL_OUT,HH=HH_OUT,ALARM_L=ALARM_L_OUT,ALARM_H=ALARM_H_OUT,--选择显示方式CHG=CHG,--输入时钟CLK=CLK,--输出片选seg=seg_out,--BCD输出out_data=out_data);ENDEXAMPLE;仿真结果如下:该顶层文件原理