~1~课程实践报告题目名称硬件描述语言与EDA技术实践学院名称物理与电气工程学院专业班级2011级自动化一班学号111101022学生姓名刘杰华指导教师李斌~2~一、课程设计的内容1、课程设计要求设计一个以“秒”为基准信号的简单数字钟,显示时、分、秒,同时可实现整点报时和清零。2、设计方案方案一:设计采用底层文件与顶层文件都用VHDL语言进行设计,同时采用手动校时功能。方案二:设计的底层文件采用VHDL语言设计,顶层文件用原理图进行设计,同时采用脉冲校时功能。最终方案为方案二。顶层文件采用原理图设计可以更加直观的了解电路原理,以及进行电路的调试和检验。而脉冲校时相对手动按键校时更为方便。二、设计思路1、设计系统组成:系统由秒计数器、分计数器、小时计数器、数码管扫描模块、译码模块、整点报时模块、分频模块和按键防抖模块构成。2、工作原理:系统输入2.5kHZ的信号,经过分频后,得到1HZ、50HZ和2.5HZ的信号;将1Hz的信号送入时钟计数器模块中作为计数基准脉冲,50Hz的信号作为按键防抖模块的时钟脉冲信号,2.5Hz的信号作为校时脉冲信号,而2.5kHz的信号作为数码管扫描脉冲信号。时分秒的计数信号经过数码管扫描模块,由译码模块输出经数码管显示。3、设计系统的功能1)时钟计数:由输入1HZ的时钟信号完成时、分、秒的正确计时并且显示所计的数字;对秒、分——实现60进制计数,即从0到59循环计数;对时——实现24进制技术,即从0到23循环计数;并且在实验设备的数码管上显示。2)清零功能:CLR_SM和CLR_H分别为秒分与小时的复位键,高电平时实现清零的功能,低电平时为正常计数。方便调时的实现。3)调时功能:通过校时键HOUR_SET和MIN_SET的设置可以进行时和分的设置。高电平时为正常计数,低电平时为时分的设置。4)数码管显示:由6个7段数码管同时显示时、分、秒。5)整点报时功能:当时钟计数到达59分59秒时,报时模块会产生一个1s的高电平使蜂鸣器报时。三、系统模块功能分析1、秒计数器~3~秒计数模块有秒时钟信号输入端、RESET清零输入端,分时钟信号输出端CTMIN、秒各位输出端SEC0和秒十位输出端SEC1。秒计数器VHDL源程序:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitySECONDisport(CLK,RESET:inSTD_LOGIC;CTMIN:outSTD_LOGIC;SEC1,SEC0:outSTD_LOGIC_VECTOR(3DOWNTO0));endentitySECOND;architectureARTofSECONDissignalTsec1,Tsec0:STD_LOGIC_VECTOR(3DOWNTO0);beginprocess(CLK,RESET)isbeginif(RESET='1')thenTsec1=0000;Tsec0=0000;elsif(CLK'EVENTandCLK='1')thenif(Tsec1=0101andTsec0=1001)thenTsec1=0000;Tsec0=0000;CTMIN='1';elsif(Tsec0=1001)thenTsec0=0000;Tsec1=Tsec1+0001;CTMIN='0';elseTsec0=Tsec0+0001;CTMIN='0';endif;endif;SEC1=Tsec1;SEC0=Tsec0;endprocess;endarchitectureART;~4~仿真波形:2、分计数器分计数模块有分时钟信号输入端、RESET清零输入端,小时时钟信号输出端CTHOUR、分各位输出端MIN0和分十位输出端MIN1。分计数器VHDL源程序:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityMINUTEisport(CLK,RESET:inSTD_LOGIC;CKHOUR:outSTD_LOGIC;MIN1,MIN0:outSTD_LOGIC_VECTOR(3DOWNTO0));endentityMINUTE;architectureARTofMINUTEissignalTmin1,Tmin0:STD_LOGIC_VECTOR(3DOWNTO0);beginprocess(CLK,RESET)isbeginif(RESET='1')thenTmin1=0000;Tmin0=0000;elsif(CLK'EVENTandCLK='1'andCLK'LAST_VALUE='0')thenif(Tmin1=0101andTmin0=1001)thenTmin1=0000;Tmin0=0000;CKHOUR='1';elsif(Tmin0=1001)thenTmin0=0000;Tmin1=Tmin1+0001;CKHOUR='0';else~5~Tmin0=Tmin0+0001;CKHOUR='0';endif;endif;MIN1=Tmin1;MIN0=Tmin0;endprocess;endarchitectureART;仿真波形:3、时计数器时计数模块有时时钟信号输入端、RESET清零输入端,时各位输出端HOUR0和时十位输出端HOUR1。时计数器VHDL源程序:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityHOURisport(CLK,RESET:inSTD_LOGIC;HOUR1,HOUR0:outSTD_LOGIC_VECTOR(3DOWNTO0));endentityHOUR;architectureARTofHOURissignalThour1,Thour0:STD_LOGIC_VECTOR(3DOWNTO0);beginprocess(CLK,RESET)isbeginif(RESET='1')thenThour1=0000;Thour0=0000;elsif(CLK'EVENTandCLK='1'andCLK'LAST_VALUE='0')thenif(Thour1=0010andThour0=0011)thenThour1=0000;~6~Thour0=0000;elsif(Thour0=1001)thenThour0=0000;Thour1=Thour1+0001;elseThour0=Thour0+0001;endif;endif;HOUR1=Thour1;HOUR0=Thour0;endprocess;endarchitectureART;仿真波形:4、数码管扫描模块每当扫描信号CKDSP有一上升沿脉冲时,数码管扫描模块就会由NUM端口向译码模块输送显示数据;每一个上升沿脉冲改变一次输出数据的来源,在时个位、时十位,分各位、分十位,秒各位、秒十位间循环选择。数码管扫描模块VHDL源程序:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitySEL_CLOCKisport(CKDSP:inSTD_LOGIC;SEC0,SEC1,MIN0,MIN1,HOUR0,HOUR1:inSTD_LOGIC_VECTOR(3DOWNTO0);NUM:outSTD_LOGIC_VECTOR(3DOWNTO0);wx:outstd_logic_vector(7DOWNTO0));endentity;architectureARTofSEL_CLOCKis~7~signalSTATE:STD_LOGIC_VECTOR(2DOWNTO0);beginprocess(CKDSP)beginif(CKDSP'EVENTandCKDSP='1')thenif(state=101)thenstate=000;elseSTATE=STATE+1;endif;endif;caseSTATEiswhen000=NUM=HOUR1;wx=11011111;when001=NUM=HOUR0;wx=11101111;when010=NUM=MIN1;wx=11110111;when011=NUM=MIN0;wx=11111011;when100=NUM=SEC1;wx=11111101;when101=NUM=SEC0;wx=11111110;whenothers=NUM=ZZZZ;endcase;endprocess;endarchitectureART;仿真波形:5、译码模块译码模块把需要数码管显示的4位数据转换为7段数码管的显示码。译码模块VHDL源程序:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityENCODER7is~8~port(DATA_NUM:inSTD_LOGIC_VECTOR(3DOWNTO0);DRIVEOUT:outSTD_LOGIC_VECTOR(6DOWNTO0));endentityENCODER7;architectureCOMMON_ANODEofENCODER7issignalNUM:STD_LOGIC_VECTOR(3DOWNTO0);signalDRIVEOUT_TEMP:STD_LOGIC_VECTOR(6DOWNTO0);begin--NUM=NUM3&NUM2&NUM1&NUM0;NUM=DATA_NUM;process(NUM)isbegincaseNUMiswhen0000=DRIVEOUT_TEMP=1111110;when0001=DRIVEOUT_TEMP=0110000;when0010=DRIVEOUT_TEMP=1101101;when0011=DRIVEOUT_TEMP=1111001;when0100=DRIVEOUT_TEMP=0110011;when0101=DRIVEOUT_TEMP=1011011;when0110=DRIVEOUT_TEMP=1011111;when0111=DRIVEOUT_TEMP=1110000;when1000=DRIVEOUT_TEMP=1111111;when1001=DRIVEOUT_TEMP=1111011;whenothers=DRIVEOUT_TEMP=ZZZZZZZ;endcase;endprocess;DRIVEOUT=DRIVEOUT_TEMP;endarchitectureCOMMON_ANODE;仿真波形:6、整点报时模块当时钟计数到达59分59秒时,整点报时模块会输出一个1秒钟的的高电平,使蜂鸣器~9~报时。整点报时模块VHDL源程序:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityALARMisport(SEC1,SEC0,MIN1,MIN0:inSTD_LOGIC_VECTOR(3DOWNTO0);RING:outSTD_LOGIC);endentityALARM;architectureARTofALARMisSIGNALSEC,MIN:STD_LOGIC_VECTOR(7DOWNTO0);beginSEC=SEC1&SEC0;MIN=MIN1&MIN0;PROCESS(SEC,MIN)BEGINIF(SEC=01011001ANDMIN=01011001)THENRING='1';ELSERING='0';ENDIF;ENDPROCESS;ENDART;仿真波形:7、分频模块2.5kHz的输