数字电路设计实验报告
引言
本课程是面向智能车制作的课程,但是主要讲述的是一些关于智能车制作的一些最基本的基础知识。比如说一些单片机的知识和一些相应数字电路的知识。故我在这里利用一些所学的知识来设计一个数字时钟。该电路系统由秒信号发生器、“时、分、秒”计数器、显示器组成。秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,这里用多谐振荡器来实现。将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计时器,可实现对一天24小时的累计。译码显示电路将“时”、“分”、“秒”计数器的输出状态送到七段显示译码器进行译码,通过六个七段数码管显示出来。
本作品的主要设计目的是熟练使用555定时器构成多谐振荡器的方法,掌握使用74LS160构成60进制计数器的方法以及使用74LS160构成24进制计数器的方法,理解在实际的设计电路中电压电流关系对整个电路功能的实现所具有的重要性。
关键词:数字电子钟;555定时器;60进制计数器;24进制计数器;共阳极七段数码管;74LS47译码器;
第一章:设计方案的选择
数字电子技术的复杂性和灵活性决定了数字电子钟的设计方案有多种,以下是本设计的方案选择。
1、信号源的选择
多谐振荡器,信号发生器,脉冲芯片以及石英晶体振荡器等方式都可以作为脉冲信号源,但是石英晶振产生的频率较高,需要用到分频器来对它进行分频处理,故在此我选择的是用555定时器制作的多谐振荡器,主要考虑的是它的易于制作和很好的稳定性。
2、计数器的选择
时分秒计数器的选择在74系列里同样有多种,74LS160和 74LS161,74HC161,74LS191等等也都可以,考虑到其简单易用,在此我选择的是74LS160。
3、译码器的选择
译码器的选择就只有两大类,一类是驱动共阳极的数码管,一类是驱动共阴极的数码管。在74系列里也有好几种,在这里我选用74LS47来驱动共阳极数码管。
4、元器件清单
74LS160(十进制计数器)——6个,74LS47(译码器)——6个;74LS00(2输入与非门)——3个;BCD数码管——6个;NE555芯片一个,电阻,电容,滑动变阻器。
第二章、设计原理描述
1、数字计时器的设计思想
要想构成数字钟,首先应选择一个脉冲源——能自动地产生稳定的标准时间脉冲信号。而脉冲源产生的脉冲信号地频率较高,因此,需要进行分频,使得高频脉冲信号变成适合于计时的低频脉冲信号,即“秒脉冲信号”(频率为1Hz)。经过分频器输出的秒脉冲信号到计数器中进行计数。由于计时的规律是:60秒=1分,60分=1小时,24小时=1天,就需要分别设计60进制,24进制计数器,并发出驱动信号。各计数器输出信号经译码器、驱动器到数字显示器,使“时”、“分”、“秒”得以数字显示出来。我设计的数字时钟就是用来计时的,厄并没有增加那个什么其它的报时、校对的功能。
2、设计框图:
电子钟在逻辑功能上是有秒脉冲发生器、秒计数器、分计数器、时计数器、译码器、显示器等组成。其原理框图如下所示:
秒脉冲计数器——>>秒计数器——>>分计数器——>>时计数器——>>译码器——>>显示器
3、时钟信号的产生:
用NE555芯片和两个电阻以及两个电容组成一个时钟振荡电路,用来产生时钟信号的。电阻R1、R2和电容C1构成定时电路。定时电容C1上的电压UC作为高触发端TH(6脚)和低触发端TL(2脚)的外触发电压。放电端D(7脚)接在R1和R2之间。电压控制端K(5脚)不外接控制电压而接入高频干扰旁路电容C2(0.01uF)。直接复位端R(4脚)接高电平,使NE555处于非复位状态,3脚用于输出时钟信号。
由555定时器组成的多谐振荡器如图(C)所示,其中R1、R2和电容C为外接元件。其工作波如图(D)所示。
图2-3 555定时器组成的多谐振荡器及其工作波形图
设电容的初始电压=0,t=0时接通电源,由于电容电压不能突变,所以高、低触发端==0<VCC,比较器A1输出为高电平,A2输出为低电平,即,(1表示高电位,0表示低电位),触发器置1,定时器输出此时,定时器内部放电三极管截止,电源经,向电容C充电,逐渐升高。当上升到时,输出由0翻转为1,这时,触发顺保持状态不变。所以0<t<期间,定时器输出为高电平1。
时刻,上升到,比较器的输出由1变为0,这时,,触发器复0,定时器输出。
期间,,放电三极管T导通,电容C通过放电。按指数规律下降,当时比较器输出由0变为1,R-S触发器的,Q的状态不变,的状态仍为低电平。
时刻,下降到,比较器输出由1变为0,R---S触发器的1,0,触发器处于1,定时器输出。此时电源再次向电容C放电,重复上述过程。
通过上述分析可知,电容充电时,定时器输出,电容放电时,0,电容不断地进行充、放电,输出端便获得矩形波。多谐振荡器无外部信号输入,却能输出矩形波,其实质是将直流形式的电能变为矩形波形式的电能。
多谐振荡器的放电时间常数分别为
tPH≈0.7×(R1+R2)×C1
tPL≈0.7×R2×C1
振荡周期T和振荡频率f分别为
T=tPH+tPL≈0.7×(R1+2R2)×C1
f=1/T≈1/[0.7×(R1+2R2)×C1]
根据以上两个式子就可以根据所需要的频率来确定电阻和电容的参数,但是为了频率可调一般会在电路4和7中间接入一个滑动变阻器。
4、用两个74LS160组成一个60进制的计数器原理:
74LS160本来是十进制的计数器,那么如何用两个十进制的计数器使它成为一个60进制的计数器呢?不过仅仅用这两个芯片是不可能的,还需要借助一个叫做74LS00的与非门芯片。
74LS160的工作要满足的条件有两个:它的MR,PE,CEP,CET这四个端口要为高电平才可以为计数状态;另一个条件就是CP端要有上升沿信号的输入,才会进入计数的状态。当MR为低电平的时候,无论74LS160的状态如何,都会把数据进行清零。那么在了解了这三个关于74LS160的基本的知识之后,那么就可以开始设计60进制的计数器了。原理图如下:
首先第一个160芯片的CP端接入到信号发生的那个端口上,其它的PE,CER,CET,MR都接到高电平上。在160的四个输出端,把四个输出端按照高低位的顺序接入到74LS47的输入端上。再把第一个芯片的TC(进位输出端)接到第二个芯片的CP端。接到第二个芯片的CP端是为了产生时钟计数信号(也即秒钟的个位计数信号)。第二个芯片的接法也是它的PE,CER,CET都接到高电平上,在160的四个输出端上,一方面把13和12两端的线接到第一个74LS00的输入端,另一方面把四个输出端按照高低位的顺序接入到74LS47的输入端上。再把74LS00的输出端接到第二个芯片的MR端和第三个芯片的CP端。接到第二个芯片的MR端是为了对第二个芯片的计数进行清零处理;而接到第三个芯片的CP端是为了产生时钟计数信号(也即分钟的个位计数信号)。
那么下面解释一下为什么是这么接线的:160是一个四位的计数器,从低位到高位的依次顺序是(14、13、12、11)。当74LS00的输入信号全是高电平时,其输出信号为低电平(但两个输入信号不全为高电平的时候,其输出端一直为高电平),把第一个芯片的TC端接到第二个芯片的CP端,是因为160具有自动进位的功能,每当160从9变到0的时候,就会在TC端产生一个高电平脉冲信号,从而产生了一个上升沿,使得第二个芯片开始计数。对于第二个芯片我们只要其当计数到6就可以,但是又不能出现6,所以第二个芯片的输出端的接法是把13、12两个端口接到74LS00的输入端,但第二个芯片从5变到6时(CP端会受到第一个芯片的影响,从而触发第二个芯片从5变到6),此时端口输出可表示为(0110),从而和第一个芯片引发类似的数据清零处理。
在这个数字电路中是需要两个60进制的计数器的,但是分钟的计数器和秒钟是差不多的。
5、用两个74LS160组成24进制计数器的原理:
电路图如下图所示:
组成24进制的计数器的方法用点不同于60进制计数器的连接方法。因为时钟只能从0计时到24,但是有因为时钟的个位数不是一个循环的计数,第二次计数时只要计到4变5的时候就要清零,而时钟的十位数只要计到2变3的时候就要清零了,因此连接方法也就不同于之前的。
第五个芯片的CP端也是接到第二个74LS00的输出端口上,它的PE,CER,CET都接到高电平上。在160的四个输出端上,一方面把12端(0010)的线接到第三个74LS00的输入端,另一方面把四个输出端按照高低位的顺序接入到74LS47的输入端上。而对于第六个芯片的输出端中的13端(0100)接到第三个74LS00的输入端,对于74LS00的输出端分别接到第五个和第六个的MR端,这样就可以实现时钟的清零了,不会出现24了。因为当第五个芯片从3变成4的一瞬间,MR也在差不多同时进行清零了。对于第五个的计数是一方面利用160自身的从9变0的功能。
6、显示电路:
在设计我用74LS47译码器来驱动共阳极的一位数码管,电路图如下:
第三章:数字电路的仿真设计
在multisim中画完电路之后,在进行仿真,以用来检验电路的正确性。完整的电路图如下,在仿真的时候没有接入ne555电路,而是用的函数发生器来充当信号源。但是效果是一样的。
仿真的结果分析:经测试,电路可以实现设计要求,可以实现数字钟的基本功能,秒脉冲信号及60、24进制计数器均可正常工作。所以,基于仿真结果可以认定,此次数字钟的设计是成功的。
第四章:心得体会
通过这次对数字电子钟的课程设计,把课本上学到的知识与实践相结合。从中对学到的知识有了更进一步的理解,而且更进一步的熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法。也锻炼了自己独立思考问题的能力和通过查看相关资料来解决问题的习惯。厄,在一开始的时候我查阅了智能车队的里上传的关于74系列的资料,在认真阅读完相应的芯片的资料后,发现不是很懂。只知道74LS160是十进制的计数器,但是怎样才能组成60进制和24进制的计数器呢,不得已只能上网查阅资料,但是一查却发现许多是基于单片机的电子钟设计,而不是纯数字电路,后来找到一些资料和图,却发现不是很好理解。最后按照一个查到的关于60进制的计数器,在软件上连了,却发现没用第二个数码管根本不会计数,也即没有上升沿的输入。最后看了半天和百度,才发现那个电路图是有问题的了。74LS160虽然是十进制的计数器,但是它便不会计到10,而是在9以后就变为0了,所以把160的13和11两端的线接到与非门上,根本就不会输出低电平,一直保持的高电平输出。最后在研究了一下160的几个端口的功能之后,发现我完全可以把第一个160的TC端接到第二个芯片的CP端以用来产生时钟信号。按照这种思路来设计电路的话,就可以只要用到三个74LS00与非门了,比一些用五个的就要更简便一些了。从这个查阅资料的过程中,我发现了有问题可以找百度,但是却不能依赖于百度,有时看书才是王道那。
其实设计本身并不是有很重要的意义,而是在于我们对待问题时的态度和处理事情的能力。各个芯片能够完成什么样的功能,使用芯片时应该注意那些要点。同一个电路可以用那些芯片实现,各个芯片实现同一个功能的区别。
另外,我还渐渐熟悉了multisim这个仿真软件的各个功能,让我体会到了其中的乐趣,而在用这个软件的时候,还要学会如何去接线和安排这些元器件,用实现电路的简洁和直观,尽量要少的线交叉在一起。熟练掌握了Multisim仿真软件的使用,最重要的是提高了自己的动手实践能力,话说熟练的掌握了这个软件的一些基本的用法,比如说找元器件那和设置参数那,那么以后我们也就可以按照自己的思路去设计一些电路,并进行仿真,以证实自己的想法并且进行改进。具体来说:
一、学会了如何使用Multisim 10软件。
二、在实践中了解了多种元件的功能和参数。
三、从仿真实践中不仅学会了如何去分析问题和解决问题,也体会到了成功的喜悦和失败的忧郁。
四、提高了自己的读图和分析图还有设计图的能力。
五、掌握了设计不同进制的计数器的方法。
六、学会了用555定时器来产生一定频率的脉冲的方法。
总之,这次课程设计让我学到了好多东西,也掌握了一些74系列芯片的使用。
实验一秒表计数器的设计
一、实验目的:
本实验通过设计四种频率可选的数字时钟系统,以达到熟悉VHDL语言编程语法、设计思路和熟练掌握Quartus II 开发软件的目的。
二、实验内容:
该数字时钟的显示格式如下所示:HH:MM:SS,其中HH表示时计数的两位,MM表示分计数的两位,SS表示秒计数的两位。本系统输入信号分别为复位信号rst(高有效)、sel(两位信号,分别可以选择2分频、4分频8分频和16分频)、clk_in(时钟信号)、8位时输出、8位分输出、8位秒输出(其中高4为表示对应的高半字节、低4位表示的低半字节,譬如当时间为08:59:30时,时输出为”0000_1000”,分输出为”0101_1001”,秒输出为”0011_0000”)。该时钟系统可以通过Sel信号时钟运行的快慢。
三、实验流程:
通过对实验内容的分析:可以考虑时钟系统的可由三部分组成:
1、分频器:
分频器为时序电路并且通过《数字电路》理论课程的学习可知由计数器来实现,同学可以回想一下实验1中是如何实现计数器电路的设计),该模块主要产生2、4、8、16分频的时钟信号;
2、多路选择器:
在VHDL中多路选择器为组合逻辑,可以有多种实现方法,在这里主要选用了case语句来实现。该模块的作用是从分频器中根据Sel信号选择适当的时钟信号;
3、时钟控制器:
该模块比较复杂,主要实现功能是实现一个24小时的计时。当时间为00:00:59的时候下一个时钟到来时状态的跳变为00:01:00,计时中多数计数为加1操作,有几个特殊状态需要重点考虑:当时间产生分进数时,譬如上例。当时间产生时进数时,譬如00:01:59时刻的下一个状态为00:02:00;当时间产生时进数时,譬如00:59:59是个的下一个状态为01:00:00。当时间产生天进数时,譬如23:59:59的下一个状态为00:00:00。
四、仿真要求:
本次试验的结果全部采用功能仿真分析:
1、在结果图中能够看到让复位信号rst为有效的情况下,所有的输出为00:00:00;
2、当频率选择输出分别为”00”、”01”、”10”、”11”时秒为的进数分别包含2、4、8、16倍clk_in的时钟周期;
3、可以看到完整的计时周期00:00:00->23:59:59->00:00:00。
五、实验代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity fpga is
port(
clk_in : in std_logic;
rst : in std_logic;
sel : in std_logic_vector(1 downto 0);
hour_high_out : out std_logic_vector(3 downto 0);
hour_low_out : out std_logic_vector(3 downto 0);
minute_high_out : out std_logic_vector(3 downto 0);
minute_low_out : out std_logic_vector(3 downto 0);
second_high_out : out std_logic_vector(3 downto 0);
second_low_out : out std_logic_vector(3 downto 0)
);
end fpga;
architecture beha of fpga is
signal clk : std_logic;
signal clk_cnt : std_logic_vector(3 downto 0);
signal hour_high : std_logic_vector(3 downto 0);
signal hour_low : std_logic_vector(3 downto 0);
signal minute_high : std_logic_vector(3 downto 0);
signal minute_low : std_logic_vector(3 downto 0);
signal second_high : std_logic_vector(3 downto 0);
signal second_low : std_logic_vector(3 downto 0);
begin
process(rst,clk_in)
begin
if(rst='1')then
clk_cnt<="0000";
elsif(rising_edge(clk_in))then
clk_cnt<=clk_cnt+1;
end if;
end process;
process(sel)
begin
case sel is
when "00"=>clk<=clk_cnt(0);
when "01"=>clk<=clk_cnt(1);
when "10"=>clk<=clk_cnt(2);
when "11"=>clk<=clk_cnt(3);
when others=>clk<='0';
end case;
end process;
process(clk, rst)
begin
if (rst ='1')then
hour_high<="0000";
hour_low<="0000";
minute_high<="0000";
minute_low<="0000";
second_high<="0000";
second_low<="0000";
elsif(rising_edge(clk))then
if(second_low/="1001")then
second_low<=second_low+1;
else
if(second_high/="0101")then
second_high<=second_high+1;
else
second_high<="0000";
if(minute_low/="1001")then
minute_low<=minute_low+1;
else
if(minute_high/="0101")then
minute_high<=minute_high+1;
else
minute_high<="0000";
if((hour_low/="0011") and ((hour_high /="0010") or (hour_low/="1001")))then
hour_low<=hour_low+1;
else
hour_low<="0000";
if(hour_high ="0010" and hour_low ="0011" )then
hour_high<="0000";
else
hour_high<=hour_high+1;
end if;
end if;
end if;
minute_low<="0000";
end if;
end if;
second_low<="0000";
end if;
end if;
end process;
process(clk)
begin
hour_high_out<=hour_high;
hour_low_out<=hour_low;
minute_high_out<=minute_high;
minute_low_out<=minute_low;
second_high_out<=second_high;
second_low_out<=second_low;
end process;
end beha;
1、 六、实验结果分析:在结果图中能够看到让复位信号rst为有效的情况下,所有的输出为00:00:00;
2、 当频率选择输出分别为”00”、”01”、”10”、”11”时秒为的进数分别包含2、4、8、16倍clk_in的时钟周期;
二分频图
四分频图
八分频图
十六分频图
3、可以看到完整的计时周期00:00:00->23:59:59->00:00:00。
七、实验心得
通过上一节课的学习,了解实验软件Quartus II基本的操作方法后,这次的实验就娴熟了很多,实验的设计想法不是很复杂,因为这次要求是实现偶数分频以及计数功能。这次实验老师给定了代码的模板,给我们的编写和设计提供了很大的帮助,认真思考原理过后,对以后的更难一些的实验一定会有很大帮助。
实验二 奇数分频的模十状态机的设计
一、实验目的:
通过设计频率可选的模十状态机以达到进一步掌握VHDL硬件描述语言的目的。
二、实验流程:
本设计有分频器、多路选择器、状态机。
1. 时钟输入作为分频器的输入,输出时钟分别为3分频和5分频;
2. 分频器输出由2选1的多路选择器选择其中之一作为状态机的时钟输入;
3. 使用选中的时钟频率作为输入时钟驱动状态机按照以下的次序输出:0->A->5->6->1->F->4->8->E->3->0的顺序输出。
三、实验代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity counter is
port (clk: in std_logic;
rst: in std_logic;
clk_div: out std_logic;
sel:in std_logic_vector(0 downto 0);
out1:out std_logic_vector(3 downto 0));
end counter;
architecture Behavioral of counter is
signal shangsheng:std_logic_vector(2 downto 0);
signal count1:std_logic_vector(2 downto 0);
signal count2:std_logic_vector(2 downto 0);
signal level_div3:std_logic;
signal now_state : std_logic_vector(3 downto 0);
signal next_state : std_logic_vector(3 downto 0);
begin
process(sel)
begin
case sel is
when "0" => shangsheng<= "010";
when "1" => shangsheng<= "100";
end case;
end process;
p1:process(clk)
begin
if(clk'event and clk='1')then
if(count2=shangsheng)then
count2<="000";
else
count2<=count2+1;
end if;
end if;
end process p1;
p2:process(clk)
begin
if(clk'event and clk='0')then
if(count1=shangsheng)then
count1<="000";
else
count1<=count1+1;
end if;
end if;
end process p2;
level_div3<=count1(1) or count2(1);
clk_div<=level_div3;
Process(rst,clk)
begin
if( rst = '1') then
now_state<="0000";
elsif( level_div3'event and level_div3 ='1')then
now_state<=next_state;
end if;
end process;
process(now_state)
begin
case now_state is
when "0000"=>next_state<="1010";
when "1010"=>next_state<="0101";
when "0101"=>next_state<="0110";
when "0110"=>next_state<="0001";
when "0001"=>next_state<="1111";
when "1111"=>next_state<="0100";
when "0100"=>next_state<="1000";
when "1000"=>next_state<="1110";
when "1110"=>next_state<="0011";
when "0011"=>next_state<="0000";
when others=> next_state<="0000";
end case;
end process;
out1<=now_state;
end Behavioral;
四、实验结果分析:
1、通过实验结果,rst有效时,所有的状态为零。
三分频
五、实验心得
这次实验做的是模十的状态机,利用奇数数分频,这个代码编写起来比较麻烦,不过有了上次编写偶数分频的经验,就容易多了,实现奇数分频需要将两个偶数分频相或,有了这样的思路,编写起来就简单了很多。通过这3次的实验,让我对数字电路这门课程的理解更加透彻了,也熟悉了Quartus II,相信对我以后的学习会有很大帮助。
组合逻辑电路的设计与调试一、实验目的1、掌握用门电路设计组合逻辑电路的方法。2、掌握组合逻辑电路的调试方法。二、实验器材数字电路实…
实验一门电路逻辑功能及测试一实验目的1熟悉门电路逻辑功能2熟悉数字电路学习机及示波器使用方法二实验仪器及材料1双踪示波器2器件74…
数字电路技术实验报告学号130704002130704010姓名曹兴运丁玉祥组号B8日期20xx1012一实验目的1掌握中规模集成…
暨南大学本科实验报告专用纸课程名称数字逻辑电路实验成绩评定实验项目名称三态门特性研究和典型应用指导教师实验项目编号08060038…
暨南大学本科实验报告专用纸课程名称数字逻辑电路实验成绩评定实验项目名称中规模集成电路功能测试及应用指导教师实验项目编号080600…
数字电路与逻辑设计实验实验报告题目学院信息工程学院系电子信息工程专业班级学号学生姓名同组同学指导教师递交日期23页第1页共南昌大学…
数字电子技术课程设设计题目班级学号学生姓名指导教师时间计报告数字钟的设计20xx年12月27日20xx年1月2日数字电子技术课程设…
数字系统设计综合实验报告实验名称1加法器设计2编码器设计3译码器设计4数据选择器设计5计数器设计6累加器设计7交通灯控制器设计班级…
数字电路课程设计报告课题数字电压表0目录一摘要2二设计任务及要求2三设计总体方案2四单元电路的设计3五调试过程及结果分析6六心得感…
实验报告多功能数字钟设计姓名学号班级一实验目标1掌握可编程逻辑器件的应用开发技术设计输入编译仿真和器件编程2熟悉EDA软件使用3掌…
暨南大学本科实验报告专用纸课程名称数字逻辑电路实验成绩评定实验项目名称三态门特性研究和典型应用指导教师实验项目编号08060038…