数字逻辑课程设计报告数字逻辑课程设计多功能数字钟班级:学号:课程设计人:指导老师:课题:完成时间:一、设计目的:学会应用数字系统设计方法进行电路设计,熟练地运用汇编语言。
二、设计任务及要求:1.记时、记分、记秒2.校时、校分、秒清03.整点报时4.时间正常显示5.闹时功能三、设计思路:将整个闹钟分为以下几个模块,每个模块中都有详细的各部分的设计思路,源代码及仿真图像,生成的器件。
1.计时模块计小时:24进制计数器计分、计秒:60进制计数器计时间过程:计秒:1HZ计数脉冲,0~59循环计数,计数至59时产生进位信号。
计分:以秒计数器进位信号作为分计数脉冲,0~59循环计数,59时产生进位。
计时:以分计数器进位信号作为时计数脉冲,0~23循环计数,23时清0。
二十四进制计数器代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt24 isport (clk:in std_logic;qh,ql:out std_logic_vector(3 downto 0));end cnt24;architecture behave of cnt24 issignal q1,q0:std_logic_vector(3 downto 0);beginprocess(clk)beginif(clk'event and clk='1')thenif(q1="0010" and q0="0011")thenq1<="0000";q0<="0000";elsif(q0="1001")thenq0<="0000";q1<=q1+'1';elseq0<=q0+'1';end if;end if;qh<=q1;ql<=q0;end behave;仿真结果:图一、cnt24仿真图像六十进制计数器代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt60 isport (clk:in std_logic;clr:in std_logic;ql,qh:out std_logic_vector(3 downto 0);c:out std_logic);end cnt60;architecture cnt of cnt60 issignal q1,q0:std_logic_vector(3 downto 0);beginprocess(clk,clr)beginif(clr='1')thenq1<="0000";q0<="0000";c<='0';elseif(clk'event and clk='1')thenif(q1="0101" and q0="1001")then-----到59 q1<="0000";q0<="0000";c<='1';elsif(q1<"0101" and q0="1001")thenq0<="0000";q1<=q1+'1';c<='0';elsif(q0<"1001") thenq0<=q0+'1';end if;end if;end if;qh<=q1;ql<=q0;end cnt;仿真结果:图二、cnt60仿真图像clk qh[3..0]ql[3..0] cnt24instclkclrql[3..0]qh[3..0]c cnt60inst1图三、生成的计数器符号2.校时模块:思路:按下校时键,时位迅速递增,满23清0按下校分键,分位迅速递增,满59清0注意:此时应屏蔽分进位。
按清0键,秒清0。
脉冲按键S1~S8、拨动开关K1~K12任选三个。
两个问题:(1)如何实现校对时间时,计数器快速递增?按键校对时间时,将一个频率较高的计数脉冲信号作用于计数器,屏蔽正常计时的计数脉冲信号。
(2)如何消除“抖动”?电路抖动:一次按键的弹跳现象,电路产生多个计数脉冲,导致一次按键,多次计数的误动作。
抖动产生的原因:物理原因。
消除的简易方法:D触发器,同步按键脉冲。
3.整点报时模块:从59分50秒开始,每2秒一次低音报时;当达到整点时,进行一次高音报时。
低音:频率可定为500HZ;高音:频率可定为1KHZ。
报时效果:报时脉冲接扬声器输入,引脚号:N6。
整点报时器件代码use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity alert_31 isport(m1,m0,s1,s0:in std_logic_vector(3 downto 0);siga,sigb:out std_logic);end alert_31;architecture alert of alert_31 isbeginsiga<='1'when(m1="0101" and m0="1001" and s1="0101" and (s0="0000" or s0="0010" or s0="0100" or s0="0110" or s0="1000"))else'0';sigb<='1'when(m1="0000" and m0="0000" and s1="0000" and s0="0000")else'0';end alert;仿真结果:图四、整点报时模块,低频率报时mh[3..0] ml[3..0] sh[3..0] sl[3..0]sig500 sig1kzdbsinst7图五、整点报时器件符号4、分频模块:设计一个进制较大的计数器,分频产生各种频率的脉冲信号。
代码:use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity freq_divider isport (clk:in std_logic;hz512,hz64,hz4,hz1:out std_logic);End freq_divider;architecture beh of freq_divider issignal cc: std_logic_vector(9 downto 0);beginprocess(clk)beginif(clk'event and clk='1') thenif(cc="1111111111")thencc<="0000000000";elsecc<=cc+1;end if;end if;end process;hz512<=cc(0);hz64<=cc(3);hz4<=cc(7);hz1<=cc(9);end beh;仿真结果:f req_div iderclk hz1hz4hz64hz512inst图六、分频器仿真及生成器件符号5.动态扫描显示模块:动态模式下,8个数码管连接同个七段码,需要进行分时控制的动态扫描显示。
七段译码器代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY dtsm isport(clk:in std_logic;h:in std_logic_vector(7 downto 0);m:in std_logic_vector(7 downto 0);s:in std_logic_vector(7 downto 0);seg7out:out std_logic_vector(6 downto 0);sel:buffer std_logic_vector(2 downto 0));END dtsm;ARCHITECTURE beha of dtsm issignal key:std_logic_vector(3 downto 0);BEGINPROCESS(clk)variable dount:std_logic_vector(2 downto 0):="000";BEGINIF(rising_edge(clk))thenIF dount="101" thendount:="000";ELSEdount:=dount+1;END IF;END IF;sel<=dount;end process;PROCESS(sel)BEGINCASE sel ISwhen "000"=>key<=h(7 downto 4);when "001"=>key<=h(3 downto 0);when "010"=>key<=m(7 downto 4);when "011"=>key<=m(3 downto 0);when "100"=>key<=s(7 downto 4);when "101"=>key<=s(3 downto 0);when others=>null;END CASE;END PROCESS;PROCESS (key)BEGINcase key iswhen"0000"=>seg7out<="0111111";when"0001"=>seg7out<="0000110";when"0010"=>seg7out<="1011011";when"0011"=>seg7out<="1001111";when"0100"=>seg7out<="1100110";when"0101"=>seg7out<="1101101";when"0110"=>seg7out<="1111101";when"0111"=>seg7out<="0000111";when"1000"=>seg7out<="1111111";when"1001"=>seg7out<="1101111";when"1010"=>seg7out<="1110111";when others=>null;END CASE;END PROCESS;END beha;器件生成:图七、动态扫描器件6.闹时模块:多路选择器源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity alarmset isport(sel:in std_logic;hclo,mclo,sclo,halr,malr,salr: in std_logic_vector(7 downto 0);h,s,m:out std_logic_vector(7 downto 0));end alarmset;architecture beh of alarmset isbeginprocess(sel)beginif(sel='0')then h<=hclo;m<=mclo;s<=sclo;else h<=halr;m<=malr;s<=salr;end if;end process;end beh;数值比较器代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity alarmcmp isport( h,m,halr,malr: in std_logic_vector(7 downto 0); stop:in std_logic;sig:out std_logic);end alarmcmp;architecture beh of alarmcmp isbeginprocess(h,m,halr,malr,stop)beginif stop='1'thensig<='0';end if;if h=halr and m=malr and stop='0' thensig<='1';else sig<='0';end if;end process;end beh;器件生成:selhclo[7..0]mclo[7..0]sclo[7..0]halr[7..0]malr[7..0]salr[7..0]h[7..0]s[7..0]m[7..0]alarmsetinsth[7..0]m[7..0]halr[7..0]malr[7..0]stopsigalarmcmpinst2图八、多路选择器和数值比较器四、顶层图:图九、顶层图六、设计中遇到的问题及解决方法:问题1、第一次下载仿真时,秒不动,按下清零键自动计时,松开又自动清零。