脉冲按键电话显示器 2.docx
《脉冲按键电话显示器 2.docx》由会员分享,可在线阅读,更多相关《脉冲按键电话显示器 2.docx(16页珍藏版)》请在冰豆网上搜索。
脉冲按键电话显示器2
东北石油大学
课程设计
课程EDA技术课程设计
题目脉冲按键电话显示器
院系电子科学学院
专业班级电子信息工程
学生姓名
学生学号07
指导教师
2011年3月11日
东北石油大学课程设计任务书
课程EDA技术课程设计
题目脉冲按键电话显示器
专业电子信息工程姓名学号0709
主要内容、基本要求、主要参考资料等
主要内容:
设计一个准确地反映按键数字具有8位显示的电话按键显示器,该电话显示器要求具有重拨的功能,当按下重拨键时,能够显示最后一次输入的电话号码。
基本要求:
1、设计一个具有8位显示的电话按键显示器;
2、能准确地反映按键数字;
3、显示器显示从低位向高位前移,逐位显示按键数字,最低位为当前输入位;
4、设置一个“重拨”键,按下此键,能显示最后一次输入的电话号码;
5、挂机2秒后或按熄灭按键,熄灭显示器显示。
主要参考资料:
[1]潘松著.EDA技术实用教程(第二版).北京:
科学出版社,2005.
[2]康华光主编.电子技术基础模拟部分.北京:
高教出版社,2006.
[3]阎石主编.数字电子技术基础.北京:
高教出版社,2003.
完成期限2011.3.11
指导教师
专业负责人
2011年3月7日
一、总体设计思想
1.基本原理
电路设计中,用到的芯片有双向移位寄存器74194(八片),10线-4线优先编码器74147(一片),七段显示译码器7448(八片),LED显示器(八片)。
电话号码移位设计电路是通过按不同的按键来控制电话号码的拨打情况的,是先进的高度集成的结果。
通过一个清零端可以控制(当输入错误号码后,清除当前号码,再重新输入一组新的号码时)电话号码的输入,这样可以自如的输入和更改电话号码。
电话号码显示器主要由一片编码器和八片移位寄存器组成。
十进制号码经按键输出后由一片74147编成4位二进制BCD码并行输入到移位寄存器74194,再利用移位寄存器的并行输出功能把右边4位BCD码移向左边同时输出给译码显示器显示出来。
我们利用74194的置数功能(S0=S1=1),同时清零端要接高电平,在这个之间用一个开关控制,能使其自身有清零的功能。
由于本人的能力有限,只能是当输入一个数字后给一个脉冲,使第一个显示数字,第二个则显示前一个数字这就是它的置数功能。
如此类推,当输入完8个数字后就可以按下控制计时器的开关,给计时器一个高电平,使计时器开始工作。
当结束电话时同时断开两个电路的的高电平,使其停止工作。
2.设计框图
我们设计的脉冲电话显示器由四个模块组成:
按键电路、译码器、、移位寄存、锁存器和数码管显示电路,其中移位寄存、锁存器和数码管译码显示电路为系统的主要组成部分。
其总体设计框图如下:
译码显示电路
数字键入处
控制电路2
移位寄存器器
控制电路1
计时电路
脉冲产生电路
译码显示电路
电话按键显示器的总体参考方案框图
二、设计步骤和调试过程
1、总体设计电路
2、模块设计和相应模块程序
(1)74147集成块
下图是74147的集成块外线引脚图
下图是74147的功能表:
INPUTS
OUTPUTS
1
2
3
4
5
6
7
8
9
D
C
B
A
1
1
1
1
1
1
1
1
1
1
1
1
1
x
x
x
x
x
x
x
x
0
0
1
1
0
x
x
x
x
x
x
x
0
1
0
1
1
1
x
x
x
x
x
x
0
1
1
1
0
0
0
x
x
x
x
x
0
1
1
1
1
0
0
1
x
x
x
x
0
1
1
1
1
1
0
1
0
x
x
x
0
1
1
1
1
1
1
0
1
1
x
x
0
1
1
1
1
1
1
1
1
0
0
x
0
1
1
1
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
1
1
1
1
1
0
74147是10线——4线优先编码器,由上表不难看出,在S`=0电路正常工作状态下,允许I0~I9当中同时有几个输入端为低电平,即有编码输入信号。
I9优先权最高,I1的优先权最低。
当I9=0时,无论其它输入端有无输入信号(表中以X表示),输出端只给出I9的编码,即DCBA=0000。
当I9=1、I8=0时,无论其余输入端有无信号,只对I8编码,输出DCBA=0001。
其余的输入状态依次类推。
(2)、74LS48集成块
下图是74LS48的集成块:
我们选用的74LS48是BCD码七段译码器兼驱动器。
其外引线排列图见上图所示。
74LS48具有以下特点:
(1)消隐(灭灯)输入BI`低电平有效。
当BI`=0时,不论其余输入状态如何,所有输出为零,数码管七段全暗,无任何显示。
可用来使显示的数码闪烁,或与某一信号同时显示。
译码时,BI`=1。
(2)灯测试(试灯)输入LT`低电平有效。
当LT`=0(BI`/RBO`=1)
时,无论其余输入为何状态,所有输出为1,数码管七段全亮,显示数字为8。
可用来检查数码管、译码器有无故。
译码时,LT=1。
(3)脉冲消隐(动态灭灯)输入RBI`=1时,对译码无影响;当BI`=LT`=1时,若RBI`=0,输入数码是十进制零时,七段全暗,不显示,输入数码不为零,则照常显示。
在实际使用中有些零是不显示的,如004.50中的百位的零可以不显示;若百位为零且不显示,则十位的零也可不显示;小数点后第二位的零,不考虑有效位时也可不显示。
这些可不显示的零称为冗余零。
脉冲消隐输入RBI`=0,可使冗余零消隐。
(4)脉冲消隐(动态灭灯)输出RBI`与消隐输入BI`共用一个管脚4,当它作输出端时,与RBI`配合,共同使冗余零消隐。
以三位十进制数为例。
十位的零是否要显示,取决于百位是否为零,有否显示,这就要用RBO`进行判断,在RBI`和A3~A0全为零时,RBO`=0,否则为1。
百位为零,且RBI`=0(百位被消隐),则百位RBO`和十位RBI`=0,使十位的零被消隐,其余数码照常显示。
若百位不为零,或未使零消隐,则百位的RBO`和十位的RBI`全为1,使十位的零不具备消隐条件,而与其它数码一起照常显示。
(3)、74LS194集成块
下图是74LS194集成块外线引脚图:
移位寄存器74LS194,它是4位双向移位寄存器,最高时钟频率为36MHZ。
它具有并行输入、并行输出,左移和右移的功能。
这些功能均能通过模式控制端M0、M1来控制。
详见下表:
M0
M1
功能
0
0
保持
0
1
右移
1
0
左移
1
1
并行置数
在ABCD端送入4位二进制数,并使M0=M1=1时,该4位二进制数同时并行输入至寄存器。
当CP到来后,在CP上升沿的作用下,4位二进制数并行输出;若M1=0,M0=1时,则该4位二进制数被串行送入到右移数据输入端D,在CP上升沿作用下,同步右移;若M=1,M=0,数据同步左移;若M=M=0,寄存器保持。
下图是74LS194集成块的功能表:
输入
输出
功能
CR
M1
M2
CP
DSL
DSR
D0
D1
D2
D3
Q0
Q1
Q2
Q3
0
X
X
X
X
X
X
X
X
X
0
0
0
0
清零
1
X
X
0
X
X
X
X
X
X
Q00
Q10
Q20
Q30
保持
1
1
1
X
X
d0
d1
d2
d3
d0
d1
D2
D3
送数
1
0
1
X
1
X
X
X
X
1
Q0n
Q1n
Q2n
右移
1
0
1
X
0
X
X
X
X
0
Q0n
Q1n
Q2n
右移
1
1
0
1
X
X
X
X
X
Q1n
Q2n
Q3n
1
左移
1
1
0
0
X
X
X
X
X
Q1n
Q2n
Q3n
0
左移
1
0
0
X
X
X
X
X
X
X
Q00
Q10
Q20
Q30
保持
d0~d3——D0~D3端的稳态输入电平
Q00、Q10、Q20、Q30——规定稳态输入条件建立前Q0、Q1、Q2、Q3的电平
Q0n、Q1n、Q2n、Q3n——时钟上升沿前Q0.Q1.Q2.Q3的电平
3、仿真及仿真结果分析
输入8位数字以后显示结果如图所示:
数码管显示结果
仿真结果如预期所想,实现了预期的电话号码移位设计电路是通过按不同的按键来控制电话号码的拨打情况,是先进的高度集成的结果。
通过一个清零端可以控制(当输入错误号码后,清除当前号码,再重新输入一组新的号码时)电话号码的输入,这样可以自如的输入和更改电话号码。
4、实验调试结果
起初,由于资源不够,只能实现四位数字的移动显示,并且没有设置删除键,只有一个清除键。
后来经过修改实验电路,终于实现8为数字的移动显示,也就基本讲课提要求完成了。
三、结论及心得体会
在这次的课程设计中,使我对于书上的知识有了进一步的了解,使我的动手能力有了很大的提高。
在查找资料的时候,我觉得好象还是蛮简单的,但在一实际动手后,才发现并没有想象中的简单。
我们不光只是掌握课堂上学过的东西,还得学会灵活应用才可以。
这次课程设计主要还是让我们活学活用自己的数电知识,使我更加熟悉了数字电路,对同步十进制计时器74160、双向移位寄存器74194、10线-4线优先编码器74147、七段显示译码器7448等有了一定的了解。
对于集成电路也有了进一步了解,不比在我刚拿到设计任务书的时候那种无从下手的感觉,后来经过同学们之间相互交流与学习使自己学到了很多更好的思维方法。
对于设计这种课题如何进行分析,如何进行改进,有了比较全面的认识。
1顶层文件程序
LIBRARYIEEE;--库定义
USEIEEE.STD_LOGIC_1164.ALL;--包定义
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYPLUSE_KEYIS--定义实体名、端口
PORT(DIN1:
INSTD_LOGIC_VECTOR(9DOWNTO0);--定义0~9数字输入
CLK1,CLEAR,DIAL,RE_DIAL:
INSTD_LOGIC;
KEYOUT:
OUTSTD_LOGIC;--定义可输入脉冲指示灯
SEG71:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);--定义七位段码
SEG8:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));--8个数码管
ENDENTITY;
ARCHITECTUREONEOFPLUSE_KEYIS--定义结构体
COMPONENTSET_NUMIS--调用SET_NUM底层文件
PORT(DIN:
INSTD_LOGIC_VECTOR(9DOWNTO0);
CLK,CLEAR,DIAL,RE_DIAL:
INSTD_LOGIC;
KEYOUT:
OUTSTD_LOGIC;
SET:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
SEG8:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENT;
COMPONENTDISPLAYIS--调用DISPLAY底层文件
PORT(BCD1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
SEG7:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDCOMPONENT;
SIGNALSET_1:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN--各端口的连接
U1:
SET_NUMPORTMAP(DIN1,CLK1,CLEAR,DIAL,RE_DIAL,KEYOUT,SET_1,SEG8);
U2:
DISPLAYPORTMAP(SET_1,SEG71);
ENDART;
2BCD译码子程序(DISPLAY.VHD)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDISPLAYIS
PORT(
BCD1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
SEG7:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITY;
ARCHITECTUREONEOFDISPLAYIS
BEGIN
PROCESS(BCD1)IS
BEGIN
CASEBCD1IS
WHEN"0000"=>SEG7<="0111111";--显示0
WHEN"0001"=>SEG7<="0000110";--显示1
WHEN"0010"=>SEG7<="1011011";--显示2
WHEN"0011"=>SEG7<="1001111";--显示3
WHEN"0100"=>SEG7<="1100110";--显示4
WHEN"0101"=>SEG7<="1101101";--显示5
WHEN"0110"=>SEG7<="1111101";--显示6
WHEN"0111"=>SEG7<="0000111";--显示7
WHEN"1000"=>SEG7<="1111111";--显示8
WHEN"1001"=>SEG7<="1101111";--显示9
WHENOTHERS=>SEG7<="0000000";--其他情况下数码管熄灭
ENDCASE;
ENDPROCESS;
ENDARCHITECTURE;
3键值显示子程序(SET_NUM.VHD)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSET_NUMIS
PORT(DIN:
INSTD_LOGIC_VECTOR(9DOWNTO0);
CLK,CLEAR,DIAL,RE_DIAL:
INSTD_LOGIC;
KEYOUT:
OUTSTD_LOGIC;
SET:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
SEG8:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDENTITY;
ARCHITECTUREONEOFSET_NUMIS
SUBTYPETENISSTD_LOGIC_VECTOR(3DOWNTO0);
SIGNALBCD:
TEN;
TYPENUMBER1ISARRAY(7DOWNTO0)OFSTD_LOGIC_VECTOR(3DOWNTO0);
SIGNALNUMBER:
NUMBER1;
SIGNALKEY,KEY1,CLK1,DIAL1,RE_DIAL1:
STD_LOGIC;
SIGNALCOUNT:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALCOUNT1:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALCOUNT2:
STD_LOGIC_VECTOR(2DOWNTO0);
SIGNALDIN1:
STD_LOGIC_VECTOR(9DOWNTO0);
SIGNALLOCK:
STD_LOGIC_VECTOR(31DOWNTO0);
BEGIN
----------------------------------------------------
PROCESS(CLK)IS
BEGIN
IFRISING_EDGE(CLK)THEN
COUNT1<=COUNT1+1;
ENDIF;
ENDPROCESS;
CLK1<='0'WHENCOUNT1<"1100"ELSE'1';
PROCESS(CLK1)IS
BEGIN
IFRISING_EDGE(CLK1)THEN
DIN1(9DOWNTO0)<=DIN(9DOWNTO0);
DIAL1<=DIAL;
RE_DIAL1<=RE_DIAL;
ENDIF;
ENDPROCESS;
KEY<=(DIN1(0)ORDIN1
(1)ORDIN1
(2)ORDIN1(3)ORDIN1(4)ORDIN1(5)ORDIN(6)ORDIN1(7)ORDIN1(8)ORDIN1(9));
PROCESS(CLK1)IS
BEGIN
IFFALLING_EDGE(CLK1)THEN
IFCOUNT2="100"THEN
IFCLEAR='0'ANDRE_DIAL='0'THEN
KEY1<=KEY;
ELSIFCLEAR='1'ANDRE_DIAL='0'THEN
KEY1<=CLK;
ELSEKEY1<=RE_DIAL1;
ENDIF;
COUNT2<="000";
ELSE
COUNT2<=COUNT2+1;
ENDIF;
ENDIF;
ENDPROCESS;
--------------------------------------
PROCESS(DIN1)IS
BEGIN
IFDIN1(6)='1'THENBCD<="0110";
ELSIFDIN1
(1)='1'THENBCD<="0001";
ELSIFDIN1
(2)='1'THENBCD<="0010";
ELSIFDIN1(3)='1'THENBCD<="0011";
ELSIFDIN1(4)='1'THENBCD<="0100";
ELSIFDIN1(5)='1'THENBCD<="0101";
ELSIFDIN1(0)='1'THENBCD<="0000";
ELSIFDIN1(7)='1'THENBCD<="0111";
ELSIFDIN1(8)='1'THENBCD<="1000";
ELSIFDIN1(9)='1'THENBCD<="1001";
ELSEBCD<="0000";
ENDIF;
ENDPROCESS;
------------------------------------------------------
KEYOUT<=KEY1;
PROCESS(KEY1)IS
BEGIN
IFRISING_EDGE(KEY1)THEN
IFCLEAR='0'ANDRE_DIAL1='0'THEN--输入数字,实现数字从低位向高位移动
NUMBER(7)<=NUMBER(6);
NUMBER(6)<=NUMBER(5);
NUMBER(5)<=NUMBER(4);
NUMBER(4)<=NUMBER(3);
NUMBER(3)<=NUMBER
(2);
NUMBER
(2)<=NUMBER
(1);
NUMBER
(1)<=NUMBER(0);
NUMBER(0)<=BCD;
ELSIFCLEAR='1'ANDRE_DIAL1='0'THEN--按下删除键,数字从高位向低位移动
NUMBER(0)<=NUMBER
(1);
NUMBER
(1)<=NUMBER
(2);
NUMBER
(2)<=NUMBER(3);
NUMBER(3)<=NUMBER(4);
NUMBER(4)<=NUMBER(5);
NUMBER(5)<=NUMBER(6);
NUMBER(6)<=NUMBER(7);
NUMBER(7)<="1111";
ELSE--将已输入数字锁存
NUMBER(7)<=LOCK(31DOWNTO28);
NUMBER(6)<=LOCK(27DOWNTO24);
NUMBER(5)<=LOCK(23DOWNTO20);
NUMBER(4)<=LOCK(19DOWNTO16);
NUMBER(3)<=LOCK(15DOWNTO12);
NUMBER
(2)<=LOCK(11DOWNTO8);
NUMBER
(1)<=LOCK(7DOWNTO4);
NUMBER(0)<=LOCK(3DOWNTO0);
ENDIF;
ENDIF;
ENDPROCESS;
---------------------------------------------------------
PROCESS(CLK)IS
BEGIN
IFRISING_EDGE(CLK)THEN
COUNT<=COUNT+1;
ENDIF;
ENDPROCESS;
---------------------------------------------------------
PROCESS(COUNT)IS
BEGIN
CASECOUNTIS--片选,选择数码管
WHEN"0001"=>SET<=NUMBER(7);SEG8<="00000001";
WHEN"0011"=>SET<=NUMBER(6);SEG8<="00000010";
WHEN"0101"=>SET<=NUMBER(5);SEG8<="00000100";
WHEN"0111"=>SET<=NUMBER(4);SEG8<="00001000";
WHEN"1001"=>SET<=NUMBER(3);SEG8<="00010000";
WHEN"1011"=>SET<=NUMBER
(2);SEG8<="00100000";
WHEN"1101"=>SET<=NUMBER
(1);SEG8<="01000000";
WHEN"1111"=>SET<=NUMBER(4);SEG8<="10000000";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
----------------------------------------------------------
PROCESS(DIAL1)IS
BEGIN--在重拨键以后,显示已拨号码