您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 基于QuartusⅡ的VHDL语言多功能数字钟
基于QuartusⅡ的VHDL语言多功能数字钟注:任何人不得作为商业用途数字钟的功能1)以24小时制显示时、分、秒计数;2)时间清零,时设置,分设置功能;3)整点报时功能。实验环境1.软件环境:QuartusII7.22.硬件环境:MAXII-EPM240T100C51.分频器1KHz分频器VHDL:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityFPQ1Kisport(clk:instd_logic;q1khz:outstd_logic);end;architecturebehavofFPQ1Kisbegins1:process(clk)variablecount2:integerrange0to50000;beginif(clk='1'andclk'event)thencount2:=count2+1;if(count2=25000)thenq1khz='1';elsif(count2=50000)thenq1khz='0';count2:=0;endif;endif;endprocess;ENDbehav;1KHz分频器顶层设计原理图1Hz分频器VHDL:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityFPQ1isport(clk:instd_logic;q1hz:outstd_logic);end;architecturebehavofFPQ1isbegins1:process(clk)variablecount2:integerrange0to1000;beginif(clk='1'andclk'event)thencount2:=count2+1;if(count2=500)thenq1hz='1';elsif(count2=1000)thenq1hz='0';count2:=0;endif;endif;endprocess;ENDbehav;1Hz分频器顶层设计原理图2.秒模块设计libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitySecisport(clk,reset,min_set:instd_logic;--clk为1Hz的秒脉冲输入信号,reset为秒清零(复位)信号--min_set为分钟调整enmin:outstd_logic;--enmin为秒模块进位输出daout:outstd_logic_vector(6downto0));--2n-1≥60,n=7,27=64,分钟用7位二进制数表示--daout(6..4)为十位,daout(3..0)为个位,60循环计数endentitySec;architecturebehaveofSecissignalcount:std_logic_vector(6downto0);--定义内部计数节点,60循环计数signalenmin1,enmin2:std_logic;--enmin为60秒产生的进位,enmin2为调分键产生的向分模块的进位begindaout=count;enmin2=(min_setandclk);enmin=(enmin1orenmin2);--60秒钟到和调分键均向分模块产生进位脉冲process(clk,reset,min_set)beginif(reset='0')thencount=0000000;--检测秒模块的1Hz脉冲上升沿elsif(clk'eventandclk='1')thenif(count(3downto0)=1001)then--秒的个位是否到“9”ifcount(6downto4)=101then--秒各位到“9”后,十位计数到“5”enmin1='1';--秒模块的60秒进位输出enmin置“1”,向分模块产生进位count=0000000;--秒计数值“0000000”(零秒)elsecount=count+7;--秒各位到“9”后,十位计数没到“5”,则加“7”变为“0”,同时向十位进位endif;elsecount=count+1;--秒个位没计到“9”时,秒计数值加“1”enmin1='0';--秒模块的60秒进位输出enmin1置“0”,不向分模块进位endif;endif;endprocess;endbehave;秒模块顶层设计原理图3.分模块设计LIBRARYieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;ENTITYMinISPORT(clk,clk1,hour_set,reset:INSTD_LOGIC;--clk为分钟模块的脉冲输入信号,接秒模块的进位输出--clk1接秒脉冲输入,hour_set为小时调整enhour:OUTSTD_LOGIC;--enhour为分钟模块的进位输出daout:OUTSTD_LOGIC_VECTOR(6DOWNTO0));--2n-1≥60,n=7,27=64,分钟用7位二进制数表示--daout(6..4)为十位,daout(3..0),60循环计数ENDENTITYMin;ARCHITECTUREbehaveOFMinISSIGNALcount:STD_LOGIC_VECTOR(6DOWNTO0);--定义内部计数节点,60循环计数SIGNALenhour1,enhour2:STD_LOGIC;--enhour1为60分钟产生的进位。enhour2为调时键的脉冲BEGINdaout=count;enhour2=(hour_setandclk1);enhour=(enhour1orenhour2);--60分钟到和调时键均向小时模块产生进位脉冲PROCESS(clk,reset)BEGINIF(reset='0')THENcount=0000000;ELSIF(clk'eventandclk='1')THEN--检测分钟模块的脉冲上升沿IF(count(3downto0)=1001)THEN--分钟的各位是否到“9”IFcount(6downto4)=101THEN--分钟各位到“9”后,十位计数到“5”enhour1='1';--分钟模块的60分钟进位输出enhour1置“1”,向时模块产生进位count=0000000;--分钟计数值回零“0000000”(零分)ELSEcount=count+7;--分钟各位到“9”后,十位计数没到“5”,则“7”变为“0”,同时向十位进位ENDIF;ELSEcount=count+1;--分钟各位没计到“9”时,分钟计数值加“1”enhour1='0';--分钟模块的60分钟进位输出enhour1置“0”,不向时模块进位ENDIF;ENDIF;ENDPROCESS;ENDbehave;分模块顶层设计原理图4.时模块设计LIBRARYieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;ENTITYFenISPORT(clk,clk1,hour_set,reset:INSTD_LOGIC;--clk为分钟模块的脉冲输入信号,接秒模块的进位输出--clk1接秒脉冲输入,hour_set为小时调整enhour:OUTSTD_LOGIC;--enhour为分钟模块的进位输出daout:OUTSTD_LOGIC_VECTOR(6DOWNTO0));--2n-1≥60,n=7,27=64,分钟用7位二进制数表示--daout(6..4)为十位,daout(3..0),60循环计数ENDENTITYFen;ARCHITECTUREbehaveOFFenISSIGNALcount:STD_LOGIC_VECTOR(6DOWNTO0);--定义内部计数节点,60循环计数SIGNALenhour1,enhour2:STD_LOGIC;--enhour1为60分钟产生的进位。enhour2为调时键的脉冲BEGINdaout=count;enhour2=(hour_setandclk1);enhour=(enhour1orenhour2);--60分钟到和调时键均向小时模块产生进位脉冲PROCESS(clk,reset)BEGINIF(reset='0')THENcount=0000000;ELSIF(clk'eventandclk='1')THEN--检测分钟模块的脉冲上升沿IF(count(3downto0)=1001)THEN--分钟的各位是否到“9”IFcount(6downto4)=101THEN--分钟各位到“9”后,十位计数到“5”enhour1='1';--分钟模块的60分钟进位输出enhour1置“1”,向时模块产生进位count=0000000;--分钟计数值回零“0000000”(零分)ELSEcount=count+7;--分钟各位到“9”后,十位计数没到“5”,则“7”变为“0”,同时向十位进位ENDIF;ELSEcount=count+1;--分钟各位没计到“9”时,分钟计数值加“1”enhour1='0';--分钟模块的60分钟进位输出enhour1置“0”,不向时模块进位ENDIF;ENDIF;ENDPROCESS;ENDbehave;时模块顶层设计原理图5.整点报时模块LIBRARYieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityZDBSisport(clk:instd_logic;--脉冲输入,可接1Hz秒脉冲输入,用于整点声报时发出间断报时响声daout:instd_logic_vector(6downto0);dain:instd_logic_vector(6downto0);--分钟模块计数输入speak:outstd_logic);endentityZDBS;architecturebehaveofZDBSisbeginprocess(dain,clk)beginifdaout=0000000anddain=0000000then--“0000000”(“零分”)时,即为整点speak=clk;elsespeak='1';endif;endprocess;endbehave;整点报时模块顶层设计原理图6.动态显示模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityDTXSisport(clk1:instd_logic;--动态扫描输入脉冲sec,min:instd_logic_vector(6downto0);--7位二进制数表示的秒、分计数输入hour:instd_logic_vector(5downto0);--6位二进制数表示的小时计数输入daout:outstd_logic_vector(3downto0);--4位十进制码计数输入dp:outstd_logic;--时、分、秒间的间隔“点”输出sel:outstd_logic_vector(2downto0));--3位数码管位选输出,接外部3-8译码器输出,译码输出再经驱动接数码管共阴极端endentityDTXS;architecturebehaveofDTXSissignalcount:std_logic_vector(2downto0);--定义内部计数节点,六进制循环计数(6个数码管显示)beginsel=count;process(clk1)
本文标题:基于QuartusⅡ的VHDL语言多功能数字钟
链接地址:https://www.777doc.com/doc-3869835 .html