您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > (七)基本逻辑电路设计
•常用的预定义的程序包有四种。1)STD_LOGIC_1164程序包它是IEEE库中最常用的程序包,是IEEE的标准程序包。其中包含了一些数据类型、子类型和函数的定义,这些定义将VHDL扩展为一个能描述多值逻辑(即除具有“0”和“1”以外还有其他的逻辑量,如高阻态“Z”、不定态“X”等)的硬件描述语言,很好地满足了实际数字系统的设计需求。2)STD_LOGIC_ARITH程序包它预先编译在IEEE库中,是Synopsys公司的程序包。此程序包在STD_LOGIC_1164程序包的基础上扩展了三个数据类型:UNSIGNED、SIGNED和SMALL_INT,并为其定义了相关的算术运算符和转换函数。3)STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED程序包这两个程序包都是Synopsys公司的程序包,都预先编译在IEEE库中。这些程序包重载了可用于INTEGER型及STD_LOGIC和STD_LOGIC_VECTOR型混合运算的运算符,并定义了一个由STD_LOGIC_VECTOR型到INTEGER型的转换函数。4)STANDARD和TEXTIO程序包这两个程序包是STD库中的预编译程序包。STANDARD程序包中定义了许多基本的数据类型、子类型和函数。第七章基本逻辑电路设计7.1组合逻辑电路设计所谓组合电路,就是由门电路构成的其输出只与当前输入值有关的那一类电路,如简单门电路、加法器、编译器、选择器、等。下面以常用数字器件中的几个主要组合电路器件为例作一对应设计。1.编码器和译码器1)编码器在这里仅给出两种编码器的例子,一种是键控8421BCD码编码器;一种是优先级编码器。(1)键控8421BCD码编码器。键控8421BCD码编码器的真值表如表7-1所示。表7-18421BCD码编码器真值表输入输出s9s8s7s6s5s4s3s2s1s0abcds111111111100000111111111000001111111110100011111111101100101111111011100111111110111101001111101111101011111011111101101110111111101111101111111110001011111111110011【例7-1】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYenco_bcdISPORT(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9:INSTD_LOGIC;a,b,c,d,s:OUTSTD_LOGIC);ENDenco_bcd;ARCHITECTURErtlOFdebcdISSIGNALtmp_in:STD_LOGIC_VECTOR(9DOWNTO0);SIGNALtmp_out:STD_LOGIC_VECTOR(4DOWNTO0);BEGINTmp_in=s9&s8&s7&s6&s5&s4&s3&s2&s1&s0;PROCESS(tmp_in)BEGINCASEtmp_inISWHEN1111111111=tmp_out=00000;WHEN1111111110=tmp_out=00001;WHEN1111111101=tmp_out=00011;WHEN1111111011=tmp_out=00101;WHEN1111110111=tmp_out=00111;WHEN1111101111=tmp_out=01001;WHEN1111011111=tmp_out=01011;WHEN1110111111=tmp_out=01101;WHEN1101111111=tmp_out=01111;WHEN1011111111=tmp_out=10001;WHEN0111111111=tmp_out=10011;WHENOTHERS=tmp_out=00000;ENDCASE;s=tmp_out(0);d=tmp_out(1);c=tmp_out(2);b=tmp_out(3);a=tmp_out(4);ENDPROCESS;ENDrtl;必须注意,CASE语句中通常WHENOTHERS项是不可少的,否则会出现语法错误。(2)优先级编码器。优先级编码器常用于中断的优先级控制等电路,例如,74LS148是一个8位输入,3位二进制输出的优先级编码器。当其某一个输入有效时,就可以输出一个与之对应的3位二进制编码。另外,当同时有几个输入有效时,将输出优先级最高的那个输入所对应的二进制编码。74LS148编码器的真值表如表7-2所示。其中有8个输入端in0~in7,一个输入使能端e1,一个3位的编码输出端a2~a0,cs为码群输出选通端,e0为码群输出有效信号。表7-274LS148编码器真值表输入输出e1in0in1in2in3in4in5in6in7a2a1a0cse01ФФФФФФФФ11111011111111111100ФФФФФФФ0000010ФФФФФФ01001010ФФФФФ011010010ФФФФ0111011010ФФФ01111100010ФФ011111101010Ф01111111100100111111111101如前所述,CASE语句和IF语句都可以描述编码器。但是,由于CASE语句中的WHEN项是无顺序的,因此不能描述优先级编码器。IF语句是自上而下执行的,因此第一个判别项优先级最高,最后判别项优先级最低。这样,用IF语句描述的74LS148优先级编码器如例7-2所示。【例7-2】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYp_encoderPORT(e1,in0,in1,in2,in3,in4,in5,in6,in7:INSTD_LOGIC;e0,cs,a0,a1,a2:OUTSTD_LOGIC);ENDp_encoder;ARCHITECTURErtlofp_encoderISSIGNALtmp_in:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALtmp_out:STD_LOGIC_VECTOR(4DOWNTO0);BEGINTmp_in=in7&in6&in5&in4&in3&in2&in1&in0;Tmp_out=a2&a1&a0&cs&e0;PROCESS(e1,tmp_in)BEGINIF(e1='0')THENIF(tmp_in=11111111)THENTmp_out=11110;ELSIF(tmp_in(7)='0')THENTmp_out=00001;ELSIF(tmp_in(6)='0')THENTmp_out=00101;ELSIF(tmp_in(5)='0')THENTmp_out=01001;ELSIF(tmp_in(4)='0')THENTmp_out=01101;ELSIF(tmp_in(3)='0')THENTmp_out=10001;ELSIF(tmp_in(2)='0')THENTmp_out=10101;ELSIF(tmp_in(1)='0')THENTmp_out=11001;ELSIF(tmp_in(0)='0')THENTmp_out=11101;ENDIF;ELSETmp_out=11111;ENDIF;e0=tmp_out(0);cs=tmp_out(1);a0=tmp_out(2);a1=tmp_out(3);a2=tmp_out(4);ENDPROCESS;ENDrtl;例7-2中也定义了两个位矢量信号tmp_in和tmp_out,它们分别对应8位优先级编码输入和编码器的5位输出。描述体由两条IF语句嵌套构成。外层IF语句是选择语句,选择条件是e1的状态。内层IF语句是多选择语句,选择条件是编码输入的不同状态。由于in(7)='0'作为第一个输入为“0”的判别条件,故in(7)的优先级最高,in(6)次之,in(0)优先级最低。这样就满足了优先级编码器的真值表。2)译码器译码器的功能与编码器相反,将二进制码组翻译成对应的输出状态,如二-四译码器、三-八译码器和二-十进制7段译码器等。(1)二-四译码器。二-四译码器的真值表如表7-3所示。这里,e为选片信号,低电平有效;a1、a0为两位二进制码输入;q3~q0为4位译码输出信号。二-四译码器的VHDL语言描述如例7-3所示。表7-32-4译码器真值表输入输出ea1a0q0q1q2q31ФФ11110001110110111011010111110【例7-3】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYenco_2_4ISPORT(e,a0,a1:INSTD_LOGIC;q0,q1,q2,q3:OUTSTD_LOGIC);ENDenco_2_4ISARCHITECTURErtlOFenco_2_4ISSIGNALtmp_in:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALtmp_out:STD_LOGIC_VECTOR(3DOWNTO0);BEGINTmp_in=a1&a0;PROCESS(tmp_in,e)BEGINIF(e='0')THENCASEtmp_inISWHEN00=tmp_out=1110;WHEN01=tmp_out=1101;WHEN10=tmp_out=1011;WHEN11=tmp_out=0111;WHENOTHERS=tmp_out=1111;ENDCASE;ELSETmp_out=1111;ENDIF;q0=tmp_out(0);q1=tmp_out(1);q2=tmp_out(2);q3=tmp_out(3);ENDPROCESS;ENDrtl;(2)3-8译码器下面我们分别以4种方法描述一个3-8译码器。【例7-4】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED_ALL;ENTITYDECODERISPORT(INP:INSTD_LOGIC_VECTOR(2DOWNTO0);OUTP:OUTBIT_VECTOR(7DOWNTO0));ENDDECODER;方法1:使用SLL移位运算符ARCHITECTUREART1OFDECODERISBEGINOUTP=00000001SLL(CONV_INTEGER(INP));ENDART1;方法2:使用PROCESS语句ARCHITECTUREART2OFDECODERISBEGINPROCESS(INP)BEGINOUTP=(OTHERS=‘0’)OUTP(COVN_INTEGER(INP))=‘1’ENDPROCESS;ENDART2;方法3:使用WHENELSE语句ARCHITECTUREART3OFDECODERISBEGINOUTP(0)=‘1’WHENINP=000ELSE0;OUTP(1)=‘1’WHENINP=001ELSE0;OUTP(2)=‘1’WHENINP=010ELSE0;OUTP(3)=‘1’WHENINP=011ELSE0;OUTP(4)=‘1’WHENINP=100ELSE0;OUTP(5)=‘1’WHENINP=101ELSE0;OUTP(6)=‘1’WHENINP=110ELSE0;OUTP(7)=‘1’WHENINP=111ELSE0;ENDART3;方法4:使用CASE_WHEN语句ARCHITECTUREART4OFDECODERISBEGINCASEINPISWHEN000=OUTP=00000001;WHEN001=OUTP=00000010;WHEN010=OUTP=00000100;WHEN011=OUTP=00001000;WHEN100=O
本文标题:(七)基本逻辑电路设计
链接地址:https://www.777doc.com/doc-3219059 .html