当前位置:文档之家› 数字逻辑电路实验报告

数字逻辑电路实验报告

数字逻辑电路设计--多功能数字钟学院:计算机科学与通信工程专业:姓名:学号:指导老师:多功能数字钟-、设计任务及要求(1)拥有正常的时、分、秒计时功能。

(2)能利用实验板上的按键实现校时、校分及清零功能。

(3)能利用实验板上的扬声器做整点报时。

(4)闹钟功能(5)在MAXPLUS中采用层次化设计方法进行设计。

(6)在完成全部电路设计后在实验板上下载,验证设计课题的正确性。

二、多功能数字钟的总体设计和顶层原理图作为根据总体设计框图,可以将整个系统分为六个模块来实现,分别是计时模块、校时模块、整点报时模块、分频模块、动态显示模块及闹钟模块(1)计时模块该模块使用74LS160构成的一个二十四进制和两个六十进制计数器级联,构成数字钟的基本框架。

二十四进制计数器用于计时,六十进制计数器用于计分和秒。

只要给秒计数器一个1HZ的时钟脉冲,则可以进行正常计时分计数器以秒计数器的进位作为计数脉冲。

用两个74160连成24进制的计数器,原图及生成的器件如下:iTr生成的二十四进制计数器注:禾U用使能端,时钟信号,清零以及预置数功能连成24进制。

on C 2 4_@ £> : LH------*LB------ 7 E:[M MB—CL.RUG—GkK ―75 -------------- -HD--------- »-COUT------------ 1用两个74160连成的60进制计数器,原图及生成的器件如下:(2)校时模块校时模块设计要求实现校时,校分以及清零功能。

*按下校时键,小时计数器迅速递增以调至所需要的小时位。

*按下校分键,分计数器迅速递增以调至所需要的分位。

*按下清零键,将秒计数器清零。

注意事项:①在校分时,分计数器的计数不应对小时位产生影响,因而需要屏蔽此时分计数器的进位信号以防止小时计数器计数。

②利用D触发器进行按键抖动的消除,因为D触发器是边沿触发,在除去时钟边沿到来前一瞬间之外的绝大部分时间都不接受输入,可以消除抖动。

③计时采用1HZ的脉冲驱动计数器计数,而校时则需要较高频率的信号驱动以达到快速校时的目的。

因此这两种脉冲信号就需要两路选择器进行选择,条件即为是否按键。

(3) 整点报时模块计时到59分50秒时,每两秒一次低音报时,整点时进行高音报时。

以不 同频率的脉冲信号区分低音和高音报时。

报时的条件是计数器计数至所需 要的时间点,因而需要一个比较模块,将分计数器和秒计数器的输出连至 比较模块输入端完成比较过程。

F1表示计数器分的咼位, F 0表示分的低位;M1表示秒的咼位,M0表 示秒的低位。

当时间为 59分00,02,04,06,08进行低音报时,当为整点时进 行高音报时。

SIGA 为1时低音报时,SIGB 为1时高音报时。

(4 )分频模块在这个系统中需要很多种不同频率的脉冲信号,这些均可以通过一个基准频率分频器生成。

分频器就是一个进制很大的计数器,利用计数器的分频 FJ_ C2 ・-oi.O1 S- I GiHHJ.L3 ・ -01 毎 IM<3C 3* m 01 注: w” J注:D 触发器用于按键的消抖,接更高的频率用于校时和校分,二路选择器用于区分是正常计时还是校时。

ALERT G^功能,从不同的输出位得到所需要的脉冲信号 注: 由于elk 的频率为 1024hz ,所以可以定义一个 std 」ogic_vector(9 downto 0),使它不 停地从 0000000000加到1111111111然后又返回 0000000000,由于最低位在clk 脉冲到来时从0变为1,然后又在下一个脉 冲变回0,因此最低位的时钟周期为 clk 的时钟周期的两倍,它的频率就为 clk 频率的确1/2即512hz 。

同理,次高位的频率就为 clk 频率的1/2 * 1/2 =1/4,用这种方法就可以得到各种能整除 1024的频率,从而实现分频。

(4 )动态显示模块 在6个不同的时间段分别将每组时间经过七段译码后输出到 6个数码管, 当某一组时间的七段码到达时,只点亮对应位置上的数码管,显示相应的 数字,6次一个循环,形成一个扫描序列。

利用人眼的视觉暂留则可以同步 显示6个数字。

注: CLK 为时钟信号,S 为计数器的小时,F 为分,M 为秒,SELOUT 为六路选择器,选择哪个数码管工作,SEGOUT 为七段译码器,使数 码管显示数字。

(6 )闹钟模块注意事项:①设定的闹钟的时间应使用新的计数器进行存储,与正常的计 时互不干扰。

② 与正常计时状态的显示切换。

可以设定一个按键,用于选择 是将计时时间还是将闹钟时间送至动态显示模块。

③ 应实现一个比较模块,当计时到与闹钟时间相等时,则驱动扬声器鸣叫 DrSPLAV-0^ d — 社L .址 - ShE ILCl U-r [ s . t ''S IL 7 - 勺 Oil' !■ 'F E ?, *5-IE 45 IT [ _ ・ — 7・ • 0J 器件 生成的分频器SUI TCM G£>— SE7--• ss- [ …eq n J T ■ . o]■ •尸匚■ «QiJB C7 . ■ OJ— 一・ — ■nri.習』— 41注: S 表示计时器的时,F 表示计时器的分,M 表示计数器的秒; ④ 闹钟响声应限定在一定时间内,且在这段时间内应随时可以 通过按键取消闹时状态。

闹钟调时和分以及正常计时与闹钟定时之间的选择原图及生成的器件如下:21-ux ■: ULLTPLE^PUL 他魯■— "mm注:输入端CLK 为时钟信号,SD 清零,NAOZHONG 是使计 数器正常计时和闹钟定时界面的切换, SE 调闹钟的小时,SD 调闹钟的分,输出端即为闹钟的小时和分。

闹钟界面和正常计时界面的转换器件如下: U 出D 曲匸抽orv l :—-I ----- ';■EftSS 表示闹钟的时,FF 表示闹钟的分;Q 为计时和闹钟两个界面的切换开关, ABC 为输出的时间。

正常计时时间和设定闹钟时间的比较器件如下:COMP.Ot注:S 表示正常计时的小时, F 表示闹钟的分;SS 表示闹钟的小时,FF 表示闹钟的分;Q 为闹钟的开关,D 当Q 为1时, 并且正常计时的时间和闹钟时间 相等时输出为1,否则为0。

三、心得和体会经过一个星期对数字时钟实践的制作,从中学到了很多。

首先是对EDA 的VHDL 语言的更深层次认识,本来觉得 EDA 编程语言比较麻烦,可是 接触了以后也就觉得它还是有它方便的地方,尤其是和图形编程结合的特 点。

其次,这个实践其实到目前为止应该还不是一个成功的作品,还是有 很多的仿真没有完成,原因可能也是自己的技术不到位。

但是整个制作的 过程中,它促进了同学之间的相互沟通,也让我在自己的专业知识的学习 过程中,更多的,更好的学习一门知识,用于以后的实践应用中,做这个 数字钟的设计中包含了很多不同功能的程序,让我在其中学到了一些程序 的中的思路,特别一步一步去把错误的程序改正确是一种很有成就感的事! 这样让我学到了更多的知识!特别是在做数字时钟闹钟的那个模块时,我 在网上查了好多程序,证实了好多错误的程序并从中更改出正确的程序! 相信,现在只是一个起步,以后,我会更好的努力,学习,对 EDA 孰能生[ ?・ r <5JFF t Ti * 0]附录:用VHDL 语言写的六十进制计数器如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt60_06 isport (clk:in std_logic;clear:in std_logic;c:out std_logic; k1,k0:out std_logic_vector(3 downto 0));end cnt60_06;architecture cnt of cnt60_06 issignal q1,q0:std_logic_vector(3 downto 0);beginprocess(clk,clear)beginif(clear='1')then q1<="0000";q0<="0000";c<='0';else if(clk'event and clk='1')then if(q1="0101" and q0="1001")then 到59q1<="0000";q0<="0000";c<='1';elsif(q1<"0101" and q0="1001")then q0<="0000";q1<=q1+'1';c<='0';elsif(q0<"1001") then q0<=q0+'1';end if;end if;end if;k1<=q1;k0<=q0;end process;end cnt;用VHDL 语言写的报时器源代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity alert_06 isport(f1,f0,m1,m0:in std_logic_vector(3 downto 0); siga,sigb:out std_logic);end alert_06; architecture a of alert_06 is begin siga<='1'when(f1="0101" and f0="1001" and m1="0101" and (m0="0000" or m0="0010" or m0="0100" or m0="0110" or m0="1000"))else'0';sigb<='1'when(f1="0000" and f0="0000" and m1="0000" and m0="0000")else'0'; end a;用VHDL 语言写的分频器的源代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin_06 isport (clk:in std_logic; hz512,hz256,hz64,hz4,hz1:out std_logic);end fenpin_06 ;architecture f of fenpin_06 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);hz256<=cc(1);hz64<=cc(3);hz4<=cc(7);hz1<=cc(9);end f;用VHDL 语言写的动态扫描的源代码如下:library ieee; use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity display_06 isport(clk:in std_logic;s :in std_logic_vector(7 downto 0); f :in std_logic_vector(7 downto 0); m :in std_logic_vector(7downto 0); selout:out std_logic_vector(5 downto 0); segout:out std_logic_vector(6 downto 0) );end display_06 ;architecture a of display_06 is signal number:std_logic_vector(3 downto 0); signal sel :std_logic_vector(5downto 0); signal seg :std_logic_vector(6 downto 0); signal q :std_logic_vector(2 downto 0); begina:process(clk)beginif(clk'event and clk='1')then q<=q+1;end if;end process a;process(q)begincase q is when"000"=>sel<="000001"; when"001"=>sel<="000010"; when"010"=>sel<="000100"; when"011"=>sel<="001000"; when"100"=>sel<="010000"; when"101"=>sel<="100000";when others=>sel<="000000";end case;end process;processbeginif sel ="000001"then number<=m(3 downto 0);elsif sel="000010"thennumber<=m(7 downto 4);elsif sel="000100"then number<=f(3 downto 0);elsif sel="001000"then number<=f(7 downto 4);elsif sel="010000"then number<=s(3 downto 0);elsif sel="100000"then number<=s(7 downto 4);else number<="1111";end if;end process;process(number)begincase number iswhen"0000"=>seg<="0111111"; when"0001"=>seg<="0000110"; when"0010"=>seg<="1011011"; when"0011"=>seg<="1001111"; when"0100"=>seg<="1100110"; when"0101"=>seg<="1101101"; when"0110"=>seg<="1111101"; when"0111"=>seg<="0000111"; when"1000"=>seg<="1111111"; when"1001"=>seg<="1101111"; when others=>seg<="0000000"; end case; end process;selout<=sel;segout<=seg;end a;闹钟界面和正常计时界面之间的切换源代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity switch_06 isport(s:in std_logic_vector(7 downto 0); ss:in std_logic_vector(7 downto 0); f:in std_logic_vector(7 downto 0);ff:in std_logic_vector(7 downto 0);m:i n std_logic_vector(7 dow nto 0);Q:in std_logic;A:out std_logic_vector(7 dow nto 0);B:out std_logic_vector(7 dow nto 0);C:out std_logic_vector(7 dow nto 0));end switch_06;architecture a of switch_06 isbeginprocess(Q,s,ss,f,ff,m)Begi nif(Q='1') the nA<=ss;B<=ff;C<="00000000";elseA<=s;B<=f;C<=m;end if;end process;end a;正常计时时间和设定的闹钟时间之间的比较的源代码如下:library ieee;use ieee.std」o gic_1164.all;use ieee.std_logic_ un sig ned.all;en tity comp_06 is port(s,ss,f,ff:i n std_logic_vector(7 dow nto 0);d:out std_logic;Q:in std_logic);end comp_06;architecture behavior of comp_06 isbeginprocess(Q,s,ss,f,ff)beginif(risi ng_edge(Q))the nif(s=ss and f=ff)the nd<='1';else d<='0';end if;end if;end process;end behavior;。

相关主题