您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 课程设计之可编程时钟
自动化三班程兴婷20080711303数字电路课程设计题目:基于FPGA的可编程时钟设计者:程兴婷班级:自动化3班学号:20080711303指导老师:何洪英周冰航日期:2010年11月自动化三班程兴婷20080711303设计内容功能设置:1)时钟显示:24小时制。如同电子表的六位显示。如上午十点三十分三十秒,液晶显示器上显示为10:30:30;为晚上的相同时间时,则显示为:1)22:30:30;同时23:59:59后显示为00:00:00;2)调整时间:当时间不准确时,可以通过键盘按键实现小时,分钟和秒的调整。拨动开关S2后,按动对应的按键使能端选择调整时分秒的十位或者个位。并且由LED的亮暗来显示当前调整的是时分秒的哪一位。3)整点报时:当为整点时蜂鸣器报时。4)设置闹钟:拨动开关S7后,状态转到设定闹钟状态,对应的LCD显示跳转到要设定的时间。通过按键来设定闹钟。设定好闹钟后,拨回开关,正常显示时间。到闹钟时间后,设定蜂鸣器响一分钟。可以通过开关S4关掉闹钟程序模块:1)CLOCK模块实现由脉冲得到的时分秒,并设置调整时间。将整点RING信号送入蜂鸣器;2)CP脉冲分频模块,将提供的10MHZ的脉冲分频得到1HZ的小脉冲;3)ALASET闹钟设置模块实现闹钟的设置,将RING信号送到蜂鸣器;4)PADTOKEY模块实现将键盘的按键转换为16位二进制;5)KEYTOBCD模块实现将16位二进制转化为4位BCD码,送入ALASET;6)LCDSWI模块:选择LCD液晶显示器的显示为当前时间输出或者设置的闹钟时间输出,输入为CLOCK,ALASET的时分秒输出,输入接LCD的输入;7)LCD显示模块:显示时间(当前时间或者闹钟时间);开关:RST——S0(复位或者置数)SET——S2(时间调整选择)ALACFF——S4(关闹钟)ALASET——S7(闹钟设置选择)自动化三班程兴婷20080711303一)主程序模块:小时(24进制),分(60进制),秒(60进制)Clock生成模块如下:CLK_INHOUM[7..0]HSETMINM[7..0]MSETRINGRSTSECM[7..0]SETSSETVHDLENTITY:clockU_clockCLOCK.vhd模块功能介绍:1)说明:set=‘0’时,秒钟和分钟都为60进制。秒钟从零计数到59后,分钟计时开始。分钟计数到59后,时钟开始计时。由于LCD是按BCD显示,在低位计数到9时,向高位的进位应为7。当set=‘1’时,设置信号有效,开始调整显示时间,可以分别调整时分秒2)输入管脚:CLK-IN——脉冲输入;HSET,MSET,SSET——小时,分钟,秒钟的设置信号;SET——为高电平时,时分秒的设置信号才有效;RST——重置,时分秒全部清零;3)输出管脚:HOUM,MINM,SECM——时分秒的输出信号;自动化三班程兴婷20080711303RING——整点报时,连接蜂鸣器;。VHDL语言程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCLOCKISPORT(CLK_IN,RST,SET,SSET,MSET,HSET:INSTD_LOGIC;SECM,MINM,HOUM:OUTSTD_LOGIC_VECTOR(7DOWNTO0);RING:OUTSTD_LOGIC);ENDENTITYCLOCK;ARCHITECTURECJOFCLOCKISSIGNALSECC,MINC,HOUC:STD_LOGIC_VECTOR(7DOWNTO0);BEGINSECM=SECC;MINM=MINC;HOUM=HOUC;PROCESS(CLK_IN)BEGINIFRST='1'THENSECC=00000000;MINC=00000000;HOUC=00000000;RING='0';--设置复位ELSEIF(CLK_IN='1'ANDCLK_IN'EVENT)THENIFSET='0'THENIFSECC01011001THENIF(SECC(3DOWNTO0)=1001)THENSECC=SECC+7;ELSESECC=SECC+1;RING='0';ENDIF;自动化三班程兴婷20080711303ELSESECC=00000000;--秒钟secIFMINC01011001THENIF(MINC(3DOWNTO0)=1001)THENMINC=MINC+7;ELSEMINC=MINC+1;ENDIF;ELSEMINC=00000000;--分钟minIFHOUC00100100THENIF(HOUC(3DOWNTO0)=1001)THENHOUC=HOUC+7;RING='1';ELSEHOUC=HOUC+1;RING='1';ENDIF;ELSEHOUC=00000000;--小时hourENDIF;ENDIF;ENDIF;ELSEIFHSET='1'--设置时间调整THENIFHOUC00100100THENIF(HOUC(3DOWNTO0)=1001)THENHOUC=HOUC+7;ELSEHOUC=HOUC+1;ENDIF;ELSEHOUC=00000000;ENDIF;ELSEIFMSET='1'THENIFMINC01100000THENIF(MINC(3DOWNTO0)=1001)自动化三班程兴婷20080711303THENMINC=MINC+7;ELSEMINC=MINC+1;ENDIF;ELSEMINC=00000000;ENDIF;ELSEIFSSET='1'THENSECC=00000000;ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;ENDPROCESS;ENDCJ;二)脉冲分频——将20Mhz脉冲分频为1HZCP_INCP_OUTRSTVHDLENTITY:cp20mthalfU_cp20mthalfCP.vhd自动化三班程兴婷20080711303输入输出管脚说明:CP_IN——输入脉冲信号,置count=5,000,000。对脉冲进行分频RST——重置,实现清零作用;CPOUT——输出分频后的脉冲VHDL语言程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCP20MTHALFISPORT(CP_IN,RST:INSTD_LOGIC;CP_OUT:OUTSTD_LOGIC);ENDENTITYCP20MTHALF;ARCHITECTUREFUCOFCP20MTHALFISSIGNALCOUNT:INTEGER;SIGNALCPOUT:STD_LOGIC;BEGINCP_OUT=CPOUT;PROCESS(CP_IN,RST)BEGINIFRST='1'THENCPOUT='0';COUNT=0;ELSEIF(CP_IN='1'ANDCP_IN'EVENT)THENIFCOUNT=5000000THENCOUNT=0;CPOUT=NOTCPOUT;ELSECOUNT=COUNT+1;ENDIF;自动化三班程兴婷20080711303ENDIF;ENDIF;ENDPROCESS;ENDFUC;三)闹钟设置模块生成模块如图:CLK_INHH[3..0]HL[3..0]KEYIN[3..0]LEDOUT[7..0]MH[3..0]ML[3..0]RSTSETENSH[3..0]SL[3..0]SWIVHDLENTITY:alasetU_alasetALASET.vhd1)输入管脚:CLK_IN——接分频后的脉冲1HZKEYIN[3…0]——接KEYTOBCD的输出,对应设置时分秒的各位数值;RST——复位置数;SETEN——设置使能信号,为高电平时,SWI选择信号才工作;SWI——为高电平时,设置闹钟;2)输出管脚:HH,HL,MH,ML,SH,SL——时分秒的对应十位和个位;自动化三班程兴婷20080711303LEDOUT——输出接灯,用来显示当前设置的是时分秒六位数字的哪一位;VHDL语言程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;--USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYALASETISPORT(SWI,SETEN,CLK_IN,RST:INSTD_LOGIC;KEYIN:INSTD_LOGIC_VECTOR(3DOWNTO0);HH,HL,MH,ML,SH,SL:OUTSTD_LOGIC_VECTOR(3DOWNTO0);LEDOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDALASET;ARCHITECTURECJOFALASETISSIGNALCOUNT:STD_LOGIC_VECTOR(2DOWNTO0);SIGNALkey:STD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(clk_in)BEGINIF(CLK_IN='1'ANDCLK_IN'EVENT)THENcaseKEYINISWHEN0000=KEY=0000;WHEN0001=KEY=0001;WHEN0010=KEY=0010;WHEN0011=KEY=0011;WHEN0100=KEY=0100;WHEN0101=KEY=0101;WHEN0110=KEY=0110;WHEN0111=KEY=0111;WHEN1000=KEY=1000;自动化三班程兴婷20080711303WHEN1001=KEY=1001;WHENOTHERS=NULL;ENDCASE;ENDIF;ENDPROCESS;PROCESS(CLK_IN)BEGINIFSETEN='1'THENIF(SWI='1'ANDSWI'EVENT)THENIFCOUNT110THENCOUNT=COUNT+1;ELSECOUNT=000;ENDIF;ENDIF;endif;IF(RST='1')THENCOUNT=110;ELSEIF(CLK_IN='1'ANDCLK_IN'EVENT)THENCASECOUNTISWHEN000=HL=KEY;LEDOUT=00000001;WHEN001=HH=KEY;LEDOUT=00000010;WHEN010=ML=KEY;LEDOUT=00000100;WHEN011=MH=KEY;LEDOUT=00001000;WHEN100=SL=KEY;LEDOUT=00010000;WHEN101=SH=KEY;LEDOUT=00100000;WHENOTHERS=LEDOUT=00000000;ENDCASE;ENDIF;自动化三班程兴婷20080711303ENDIF;ENDPROCESS;ENDCJ;四)PADTOKEY(键盘输入转换为二进制码)生成模块如图:CPINICOL[3..0]OROW[3..0]RY[15..0]VHDLENTITY:padtokeyU_padtokeyPADTOKEY.Vhd1)目的:将板上键盘变为16个按键,从左上到右下,按键按下时,对应输出为1,松开为0;支持多个按键(必须是同一行)同时按下,带防抖,与NANOBOARD库中器件KEYPAD直接相连2)管脚说明:Y[15..0]16个按键输出;CPIN时钟脉冲输入按10MHz设计;复位RICOL[3..0]、OROW[3..0]连接KEYPAD器件VHDL语言程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_
本文标题:课程设计之可编程时钟
链接地址:https://www.777doc.com/doc-3379636 .html