实验四:电子钟显示一、实验目的(1)掌握较复杂的逻辑设计和调试。(2)学习用原理图+VHDL语言设计逻辑电路。(3)学习数字电路模块层次设计。(4)掌握ispLEVER软件的使用方法。(5)掌握ISP器件的使用。二、实验所用器件和设备在系统可编程逻辑器件ISP1032一片示波器一台万用表或逻辑笔一只TEC-5实验系统,或TDS-2B数字电路实验系统一台三、实验内容数字显示电子钟1、任务要求(1)、时钟的“时”要求用两位显示;上、下午用发光管作为标志;(2)、时钟的“分”、“秒”要求各用两位显示;(3)、整个系统要有校时部分(可以手动,也可以自动),校时时不能产生进位;(4)*、系统要有闹钟部分,声音要响5秒(可以是一声一声的响,也可以连续响)。VHDL源代码:LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;----主体部分-ENTITYclockisport(clk,clr,put,clk1:instd_logic;--clr为清零信号,put为置数脉冲,clk1为响铃控制时钟choice:instd_logic;--用来选择时钟状态的脉冲信号lighthour:outstd_logic_vector(10downto0);lightmin:outstd_logic_vector(7downto0);lightsec:outstd_logic_vector(7downto0);--输出显示ring:outstd_logic);--响铃信号endclock;--60进制计数器模块ARCHITECTUREfuncofclockiscomponentcounter_60port(clock:instd_logic;clk_1s:instd_logic;putust:instd_logic;clr:instd_logic;load:instd_logic;s1:outstd_logic_vector(3downto0);s10:outstd_logic_vector(3downto0);co:outstd_logic);endcomponent;--24进制计数器模块componentcounter_24port(clock:instd_logic;clk_1s:instd_logic;putust:instd_logic;clr:instd_logic;load:instd_logic;s1:outstd_logic_vector(3downto0);s10:outstd_logic_vector(6downto0));endcomponent;signalsec,a:std_logic;---2分频产生1s信号signall1,l2,l3:std_logic;---判定对时间三部分修改signalc1,c2:std_logic;---进位信号signalload:std_logic_vector(1downto0);signaltemp:integerrange0to2499;signaltemp1:integerrange0to95;--计数信号signalsec_temp:std_logic_vector(7downto0);--总进程beginu1:counter_60portmap(sec,sec,put,clr,l1,sec_temp(3downto0),sec_temp(7downto4),c1);u2:counter_60portmap(c1,sec,put,clr,l2,lightmin(3downto0),lightmin(7downto4),c2);u3:counter_24portmap(c2,sec,put,clr,l3,lighthour(3downto0),lighthour(10downto4));lightsec(7downto0)=sec_temp(7downto0);--状态转换process(choice)beginif(choice'eventandchoice='1')thencaseloadiswhen00=l1='0';--非修改状态l2='0';l3='0';load=01;when01=l1='0';--此状态下对小时进行修改l2='0';l3='1';load=10;when10=l1='0';--此状态下对分钟进行修改l2='1';l3='0';load=11;whenothers=l1='1';--此状态下对秒进行修改l2='0';l3='0';load=00;endcase;endif;endprocess;--计数进程process(clk)beginif(clk'eventandclk='1')then--分频if(temp=2499)thentemp=0;sec=notsec;elsetemp=temp+1;endif;endif;endprocess;--响铃进程process(clk1)beginif(clk1'eventandclk1='1')thenif(temp1=95)thentemp1=0;a=nota;elsetemp1=temp1+1;endif;endif;endprocess;ring=awhen(c2='1'andsec_temp5andsec='1')else--5s整点响铃'0';endfunc;libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycounter_60isport(clock:instd_logic;--计数信号,即低位的进位信号或时钟脉冲信号clk_1s:instd_logic;--周期1s的时钟信号putust:instd_logic;--调表置数信号clr:instd_logic;--清零load:instd_logic;--判定信号s1:outstd_logic_vector(3downto0);--计数器的个位s10:outstd_logic_vector(3downto0);--计数器的十位co:outstd_logic);endcounter_60;if(load=1)--防止脉冲产生进位co_temp=’0’;architecturefuncofcounter_60issignals1_temp:std_logic_vector(3downto0);signals10_temp:std_logic_vector(3downto0);signalclk,co_temp:std_logic;beginclk=clockwhenload='0'elseputust;process(clk,clr)beginif(clr='1')thens1_temp=0000;s10_temp=0000;elsif(clk'eventandclk='1')then--进位判断if(s1_temp=9)thens1_temp=0000;if(s10_temp=5)thens10_temp=0000;co_temp='1';elseco_temp='0';s10_temp=s10_temp+1;endif;elseco_temp='0';s1_temp=s1_temp+1;endif;endif;endprocess;s1=s1_tempwhen(clk_1s='1'orload='0')else1111;s10=s10_tempwhen(clk_1s='1'orload='0')else1111;co=co_tempwhen(load='0')else'0';endfunc;libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;--24进制计数器entitycounter_24isport(clock:instd_logic;--计数信号clk_1s:instd_logic;--周期1s的时钟信号putust:instd_logic;clr:instd_logic;--清零信号load:instd_logic;--判定信号s1:outstd_logic_vector(3downto0);--计数器的个位s10:outstd_logic_vector(6downto0));--计数器的十位endcounter_24;architecturefuncofcounter_24issignals1_temp:std_logic_vector(3downto0);signals10_temp:std_logic_vector(1downto0);signalclk:std_logic;beginclk=clockwhenload='0'elseputust;process(clk,clr)beginif(clr='1')thens1_temp=0000;s10_temp=00;elsif(clk'eventandclk='1')thenif(s1_temp=3ands10_temp=2)thens1_temp=0000;s10_temp=00;elsif(s1_temp=9)thens1_temp=0000;s10_temp=s10_temp+1;elses1_temp=s1_temp+1;endif;endif;endprocess;--显示进程process(s10_temp)beginif(clk_1s='1'orload='0')thencases10_tempiswhen00=s10=1111110;when01=s10=0110000;when10=s10=1101101;whenothers=null;endcase;elses10=0000000;endif;endprocess;s1=s1_tempwhen(clk_1s='1'orload='0')else1111;endfunc;四、实验小结:注意当时钟处于被修改状态时,即对时、分、秒的值进行修改时,不应产生进位,产生很多莫名其妙的错误,如修改后有进位(分钟为00)时,或者自行到整点响铃后,再次给脉冲会进位的情况。最终修改了很多语句,实际就是在修改给脉冲时强制使进位信号为0.注意计数器60,,2进制的实现,加入响铃后需要把进位信号放到计数过程中才能使响铃正常。调整非秒针时,秒针依旧走动,通过1s计数器实现闪烁,符合实际情况。此次试验模块多且杂,需要更加细化的了解程序实质,也对代码的执行方式和顺序有了更加深刻的认识