用电器电源自动控制电路的电子自动化实现 左函未Word文档下载推荐.docx
《用电器电源自动控制电路的电子自动化实现 左函未Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《用电器电源自动控制电路的电子自动化实现 左函未Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
3设计思想
首先分析题目要求,我从中得到下面几点内容:
1.用电器可以自动开启30s,然后就会自动关闭30s,如此周而复始,同时要有状态的显示—〉所以这里需要用到一个30进制的计数器,且有一个输出端表示用电器的工作状态。
2.题目要求随时都可以采用自动控制方式对用电器进行控制,即:
通过手动使用器由运行转换到停止或由停止转换到运行—〉因此必须有一个输入端用作开关来对用电器进行工作状态的控制。
3.定时信号的设计,且要有分秒的倒计时显示—〉首先必须得用到减法计数器,用减法计数器来做成”分”和”秒”;
另外很重要的是要用到扫描电路,用以显示倒计时。
此定时信号是用来控制整个电路的工作时间。
4.当然,在这其中不免会用到一些触发器、与非门、或非门、与门、或门、非门等。
5.在设计的时候可以首先把整个电路分成若干个小模块,如果先把小模块设计出来,那么整个电路就不成问题了。
4设计方案
将整个器件设计变为三个模块,即30计数器,计时器和显示模块
计数的设计
(一)30计数器
因为现成的计数器只有十进制计数器74160和十六进制计数器74161,要想做一个30进制的计数器,需要用两片计数器。
这里,我利用两片十进制计数器74160来构成一个30进制计数器。
依据如下:
把第一片74160的四位输出端接成1001(即十进制中的9),另一片接成0010(即十进制中的2),然后把第一片的进位输出端C接到第二片的使能控制端EP和ET上,每当第一片计成9(1001)时C变为1,下一个CP信号到达时第二片为计数工作状态,计入1,而当第一片计成0(0000),它的C端回到低电平;
第一片的EP
和ET接高电平恒为1,始终处于计数工作状态。
这样就构成了30进制计数器。
另外,还要有一个输出端是用来表示用电器工作状态的,我用到了一个JKFF、非门、与门。
具体的逻辑电路如下图所示:
图1
图形说明:
(1)此图是采用整体置数法接成的30进制计数器。
首先需将两片74160接成百进制计数器,然后将电路的29状态译码产生0信号,把此0信号和一个表示开关的输入端相“与”的结果(以下均称为”A”)同时加到两片74160的LD端(即LD非端),当下一个计数脉冲(第30个计数脉冲)到达时,将0000同时置入两片74160中,从而得到30进制计数器。
(2)JKFF在J=K=1时,输出波形不断翻转。
将“A”作为JKFF的CP信号,则输出端会0、1、0、1……这样循环,将此输出连接到某一指示灯上,若出现“灭”与“亮”每隔30秒交替的现象,就说明该用电器的工作状态为:
自动开启30s,然后自动进入关闭状态。
(3)该逻辑图中的CP信号设为CP
该模块的仿真波形图如下所示
图2
图形说明:
(1)KaiGuan一栏表示开关的状态:
0表示关闭,1表示打开。
7表示用电器的状态:
0表示停止,1表示运行。
20表示计数的高位(即十位),一直按照0、1、2……循环。
10表示计数的低位(即个位),一直按照0、1、2、3、4、5、6、
7、8、9、0……循环。
(2)当开关保持状态1不变,20由2变为0时,7会自动改变状态进行翻转。
这说明用电器运行30s和停止30s是自动循环的。
(3)在任意时刻,若手动开关改变其状态,则用电器的状态也会翻转,并且重新开始计时30s。
结论:
通过对逻辑电路进行仿真,从波形图上可以看出,此逻辑电路的设计是正确的,符合题目要求。
定时的设计
题目要求有分秒的定时,且为倒计时,所以必然会用到减法计数器。
74168为十进制同步加减计数器,当U/DN=0时,它可以做减法计数。
不妨把时间定时为5分钟,即数码管上倒计时的时间显示为从5分59秒开始,到0分00秒结束。
这里要用到3片74168。
另外,还须有T触发器、或门、或非门、与门、非门等。
图3
(1)首先,74168做减法计数,U/DN=0,要把它接地。
(2)秒的定时为0~59s需要用到两片74168,因为是倒计时,和一般的情况稍有差别,所以应该把八个输出端用一个或门译成0后加到LD非端,且第一片和第二片的输入端D0~D3应分别译成1001、0101(即十进制中的9、5)。
还要把秒的借位输出作为分的脉冲信号,这样,当秒减够60后,分会自动减1。
依据同样的道理,分的定时只需一片74168即可,同时把四个输出端用或门译成0加到LD非端,输入端D0~D3译成0101(即十进制中的5)。
这样,就把时间的的初始值置为0分00秒,而后马上回到5分59秒,这就开始了倒计时。
(3)为了使倒计时计到0分00秒的时候自动停止而不至于循环,所以这里需要对控制秒的脉冲信号加上一些限制。
用到了或非门、与门、非门,还有T触发器,具体连线见图中所示。
(4)该逻辑图中的CP信号设为CP2。
该模块的仿真波形图如下所示:
图4
(1)b(4~1)表示“分”由5自减到0;
(2)a[8~5]表示“秒”的高位有5自减到0;
Q[4~1]表示“秒”的低位由9自减到0。
(3)从整个图形可以看出:
时间由5分59秒开始,一秒一秒的自减到0分0秒。
结论:
扫描电路的设计
由于只用到3个数码管,所以地址端只需S0、S1即可,体现在试验箱上就是有4个数码管。
用到一片74161,将其接成4进制;
还用到四片74151双8选一数据选择器;
另需一片7449BCD--七段显示译码器。
具体的逻辑电路如下页图所示:
图5
(1)74161的输出端QA、QB分别作为数码管的地址端S0、S1和74151
的地址端A、B。
(2)两片74151的32个输入端分别称为1~32;
74151的四个输出端
分别作为7449的输入端;
7449的输出端OA~OG分别称为a~g。
(3)该逻辑电路的CP信号设为CP3,
图6
有图可知电路的设计是正确的。
将上述三个模块组合到一起,就构成了整个的逻辑电路,如下图所示:
图7
总逻辑电路的仿真模型为
图8
通过对逻辑电路进行仿真,从波形图上可以看出,用电器每隔30秒就会自动改变一下状态,且可以随时由KaiGuan改变状态,数码管上的数字显示是:
5分59秒~0分00秒,此逻辑电路符合题目要求,其设计是正确的。
5底层元器件的生成程序
5.1BCD-7段数码管显示译码器电路
library
ieee;
use
ieee.std_logic_1164.all;
entity
bcd71
is
port(d:
in
std_logic_vector(3
downto
0);
led:
out
std_logic_vector(6
0));
end
bcd71;
architecture
arch
of
begin
led<
=
"
1111110"
when
d="
0000"
else
0110000"
0001"
1101101"
0010"
1111001"
0011"
0110010"
0100"
1011011"
0101"
1011111"
0110"
1110000"
0111"
1111111"
1000"
1111011"
1001"
0000000"
;
arch;
5.2MUX8
ieee.std_logic_signed.all;
ieee.std_logic_unsigned.all;
mux8_12
is
port(d0,d1,d2,d3,d4,d5,d6,d7:
std_logic;
g:
a2,a1,a0:
y:
std_logic);
mux8_12;
one
signala:
std_logic_vector(2
begin
a<
=a2&
a1&
a0;
process(a,g,d0,d1,d2,d3,d4,d5,d6,d7)
if
g='
0'
then
y<
='
else
case
a
when"
000"
=>
=d0;
001"
=d1;
010"
=d2;
011"
=d3;
100"
=d4;
101"
=d5;
110"
=d6;
111"
=d7;
others=>
case;
if;
process;
one;
5.360进制计数器
libraryieee;
--调用ieee库
useieee.std_logic_1164.all;
--使用ieee库中的1164包
useieee.std_logic_unsigned.all;
--使用ieee库中的无符号包
entitycntm60is
port(ci:
instd_logic;
--来至低级的进位
nreset:
--清零端
load:
--置数端
d:
instd_logic_vector(7downto0);
--与置数端对应的数据输入端
clk:
--时钟端
co:
outstd_logic;
--进位输出端
qh:
bufferstd_logic_vector(3downto0);
--计数器的高位输出端
ql:
bufferstd_logic_vector(3downto0));
--计数器的低位输出端
endcntm60;
architecturebehaveofcntm60is
co<
1'
when(qh="
andql="
andci='
)else'
process(clk,nreset)
begin
if(nreset='
)then
qh<
="
ql<
elsif(clk'
eventandclk='
if(load='
=d(7downto4);
=d(3downto0);
elsif(ci='
if(ql=9)then
if(qh=5)then
else
=qh+1;
endif;
=ql+1;
endprocess;
endbehave;
5.4十进制计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcnt10IS
PORT(
CLK:
INSTD_LOGIC;
LOAD,CLR:
--CLR:
清除数据
EN:
--信号使能
DATAIN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
--输入的4位数据
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
--输出的4位数据
CARRY_OUT:
OUTSTD_LOGIC--数据装载
);
ENDcnt10;
ARCHITECTURErtlOFcnt10IS
SIGNALTMP:
STD_LOGIC_VECTOR(3DOWNTO0);
--链接输入输出
BEGIN--数据的信号
PROCESS(CLK,LOAD,CLR,EN)
BEGIN
IFCLR='
THEN--当CLR高电平,数据变为0000
TMP<
="
ELSIFLOAD='
THEN--否则装载输入的数据
=DATAIN;
ELSIFCLK'
EVENTANDCLK='
THEN--上升沿时,执行10进制减法
IFEN='
THEN
IFTMP="
THEN--0跳转到9
ELSE--自动减1
=TMP-'
ENDIF;
THEN
CARRY_OUT<
--COOK<
=CARRY_OUT
ELSE
ENDPROCESS;
Q<
=TMP;
ENDrtl;
5.5JK
cnt16
port(clk,clr,enb,control:
cout:
coh:
cnt16;
process
(clk,clr,enb,control)
variable
co
:
clr='
co:
elsif
rising_edge(clk)
enb='
control
'
15
=co+1;
co>
0
=co-1;
1111"
co=15
cout<
coh<
=co;
architecture;
6硬件实验结果
对总的逻辑电路进行编译下载后,在试验箱上连线,观察到如下现象:
表示用电器工作状态的指示灯每隔30s就会自动“亮”或“灭”,用高低电平当作开关来控制电路,也可以实现用电器状态的自动转换;
数码管上的时间显示为000、559、558……000。
硬件实验的结果完全符合题目要求,说明此逻辑电路的设计是完全正确的。
7心得体会
当我刚刚拿到题目的时候,感觉特别难,一点思路都没有,对此软件
的掌握也不是太熟练,后来,经过自己进一步的仔细琢磨、认真思考以及刻苦练习,慢慢地有了点眉目。
然后我就一点一点的设计电路,最后再进行模块组合,把整个设计思路连接起来成为了一个整体的数字电路。
当然在这其中也有过不少的错误,我仔细查看电路找错误,通过一次又一次的不断修改与仿真,我的电路一步步趋于完善,我也正一步步走向成功,当我波形仿真后,完全符合题目的各个要求,经过老师的验收,我顺利通过了这次为期两周的EDA课程设计。
经过这次课程设计,我发现自己还有很多不足,对数字电路某些内容的掌握不是太熟练,在逻辑电路设计方面欠佳;
同时,在课程设计的过程中,我也学会不少新的知识,扩展了自己的知识面,培养了亲自动手实践的能力,并且也对以前已经学过的知识进行了巩固练习。
我又一次深深体会到了知识的力量,感受到在知识海洋里遨游是一件多么愉快的事情。
从中我也悟出了一些道理:
人是不可以满足的!
我深信,经过刻苦学习,我一定可以掌握更多的科学知识。
在此,我深深地感谢每一位老师!
8参考文献
[1]赵全利.《EDA技术及应用教程》
[2]韩力群.《人工神经网络理论、设计及应用》第二版.化学工业出版社,1990.1
[3]闻新,周露,李翔,张宝伟.《MATLAB神经网络仿真与应用》.科学出版社,2003.7
[4]邹彦.《EDA技术与数字系统设计》.电子工业出版社