第三章基本逻辑电路设计3.1组合逻辑电路设计一、简单门电路设计例:3输入“与非”门电路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYnand3ISPORT(a,b,c:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDnand3;ARCHITECTUREnand3_1OFnand3ISBEGINy<=NOT(aANDbANDc);ENDnand3_1;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYnand3ISPORT(a,b,c:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDnand3;ARCHITECTUREnand3_2OFnand3ISBEGINt4:PROCESS(a,b,c)VARIABLEcomb:STD_LOGIC_VECTOR(2DOWNTO0);BEGINcomb:=a&b&c;CASEcombISWHEN“000”=>y<=‘1’;WHEN“001”=>y<=‘1’;WHEN“010”=>y<=‘1’;WHEN“011”=>y<=‘1’;WHEN“100”=>y<=‘1’;WHEN“101”=>y<=‘1’;WHEN“110”=>y<=‘1’;WHEN“111”=>y<=‘0’;WHENOTHERS=>y<=‘X’;ENDCASE;ENDPROCESS;ENDnand3_2;二、编码器、译码器、选择器例:地址译码器假设一个微处理器存储空间为从0000H到FFFFH,将其分成5部分,它们的地址分配如下:0000H—DFFFH为动态随机存储器DRAM使用;E000H—E7FFH为I/O设备使用;E800H---EFFFH备用;F000H—F7FFH为第一个只读存储器ROM1使用;F800H—FFFFH为第二个只读存储器ROM2使用;其中选通控制信号DRAM1,IO,ROM1,ROM2均为低电平有效。例:地址全译码LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYad_decoderISPORT(address:INSTD_LOGIC_VECTOR(15downto0);DRAM1,IO,ROM1,ROM2:OUTSTD_LOGIC);ENDad_decoder;ARCHITECTUREaOFad_decoderISBEGINPROCESS(address)BEGINIFaddress=x”dfff”THENDRAM=‘0’;IO=‘1’;ROM1=‘1’;ROM2=‘1’;ELSIFaddress=x”e000”ANDaddress=x”e7ff”THENDRAM=‘1’;IO=‘0’;ROM1=‘1’;ROM2=‘1’;ELSIFaddress=x”f000”ANDaddress=x”f7ff”THENDRAM=‘1’;IO=‘1’;ROM1=‘0’;ROM2=‘1’;ELSIFaddress=x”f800”THENDRAM=‘1’;I/O=‘1’;ROM1=‘1’;ROM2=‘0’;ENDIF;EndPROCESS;ENDa;例:地址部分译码LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYad_decoderISPORT(A15,A14,A13,A12,A11:INSTD_LOGIC;DRAM1,IO,ROM1,ROM2:OUTSTD_LOGIC);ENDad_decoder;ARCHITECTUREaOFad_decoderISBEGINPROCESS(A15,A14,A13,A12,A11)BEGINIF(A15ANDA14ANDA13)=‘0’THENDRAM=‘0’;IO=‘1’;ROM1=‘1’;ROM2=‘1’;ELSIFA12=‘0’ANDA11=‘0’THENDRAM=‘1’;IO=‘0’;ROM1=‘1’;ROM2=‘1’;ELSIFA12=‘1’ANDA11=‘0’THENDRAM=‘1’;IO=‘1’;ROM1=‘0’;ROM2=‘1’;ELSIFA12=‘1’ANDA11=‘1’THENDRAM=‘1’;IO=‘1’;ROM1=‘1’;ROM2=‘0’;ENDIF;ENDPROCESS;ENDa;三、加法器、求补器例:半加器真值表二进制输入和输出进位输出basco0011010101100001例:8位二进制数的求补电路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYhalf_adderISPORT(a,b:INSTD_LOGIC;s,co:OUTSTD_LOGIC);ENDhalf_adder;ARCHITECTUREhalf1OFhalf_adderISBEGINPROCESS(a,b)BEGINs<=aXORb;co<=aANDb;ENDhalf1;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_Arith.ALL;ENTITYhosuuISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);b:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDhosuu;ARCHITECTURErtlOFhosuuISBEGINPROCESS(a)BEGINIF(a(7)=’1’)THENb<=NOTa+‘1’;ELSEb=a;ENDIF;ENDPROCESS;ENDrtl;四、三态门及总线缓冲器例:三态门电路三态门真值表LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtri_gateISPORT(din,en:INSTD_LOGIC;dout:OUTSTD_LOGIC);ENDtri_gate;ARCHITECTUREzasOFtri_gateISBEGINtri_gate1:PROCESS(din,en)BEGINIF(en=‘1’)THENdout<=din;ELSEdout<=‘Z’;ENDIF;ENDPROCESS;ENDzas;例:单向总线缓冲器在微型计算机的总线驱动中经常要用单向总线缓冲器,它通常由多个三态门组成,用来驱动地址总线和控制总线。一个8位的单向总线缓冲器如图所示。8位的单向总线缓冲器由8个三态门组成,具有8个输入和8个输出端。所有三态门的控制端连在一起,由一个控制输入端en控制。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtri_buf8ISPORT(din:INSTD_LOGIC_VECTOR(7DOWNTO0);dout:OUTSTD_LOGIC_VECTOR(7DOWNTO0);en:INSTD_LOGIC);ENDtri_buf8;ARCHITECTUREzasOFtri_buf8ISBEGINtri_buff:PROCESS(en,din)BEGINIF(en=‘1’)THENdout<=din;ELSEdout<=“ZZZZZZZZ”;ENDIF;ENDPROCESS;ENDzas;例:双向总线缓冲器双向总线缓冲器真值表数据输入控制输入数据输出dinendoutX0Z010111LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtri_bigateISPORT(a,b:INOUTSTD_LOGIC_VECTOR(7DOWNTO0);en:INSTD_LOGIC;dir:INSTD_LOGIC);ENDtri_bigate;ARCHITECTURErtlOFtri_bigateISSIGNALaout,bout:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(a,dir,en)BEGINIF((en=‘0’)AND(dir=‘1’))THENbout<=a;ELSEbout<=“ZZZZZZZZ”;ENDIF;b<=bout;ENDPROCESS;PROCESS(b,dir,en)BEGINIF((en=‘0’)AND(dir=‘0’))THENaout<=b;ELSEaout<=“ZZZZZZZZ”;ENDIF;a<=aout;ENDPROCESS;ENDrtl;3.2时序逻辑电路设计一、时钟信号与复位信号的描述:1、时钟沿在VHDL中的描述方法(第二章)2、复位控制描述复位信号可以分为同步复位和异步复位两种同步复位:就是当复位信号有效且在给定的时钟边沿到来时,系统才被复位;异步复位:是当复位信号有效时,系统就被复位,不用等待时钟边沿信号。两种复位方式的描述将在以下的时序电路的描述中给以应用二、锁存器锁存器根据触发边沿、复位、和预置的方式以及输出端多少的不同也可以有多种不同形式的锁存器。D锁存器。D锁存器真值表数据输入端时钟输入端数据输出端dclkX0不变X1不变0↑01↑1endir功能00a=b01b=a1X三态LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff1ISPORT(clk,d:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDdff1;ARCHITECTURErtlOFdff1ISBEGINPROCESS(clk)BEGINIFrising_edge(clk)THENq<=d;ENDIF;ENDPROCESS;ENDrtl;异步复位的D锁存器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff2ISPORT(clk,d,clr:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDdff2;ARCHITECTURErtlOFdff2ISBEGINPROCESS(clk,clr)BEGINIF(clr=‘0’)THENq<=‘0’;ELSIFrising_edge(clk)THENq<=d;ENDIF;ENDPROCESS;ENDrtl;异步复位/置位的D锁存器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff3ISPORT(clk,d,clr,pset:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDdff3;ARCHITECTURErtlOFdff3ISBEGINPROCESS(clk,pset,clr)BEGINIF(pset=‘0’)THENq<=‘1’;ELSIF(clr=‘0’)THENq<=‘0’;ELSIFrising_edge(clk)THENq<=d;ENDIF;ENDPROCESS;ENDrtl;同步复位的D锁存器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff4ISPORT(clk,clr,d:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDdff4;ARCHITECTURErtlOFdff4ISBEGINPROCESS(clk)BEGINIFrising_edge(clk)THENIF(clr=‘1’)THENq<=‘0’;ELSEq<=d;ENDIF;ENDIF;ENDPROCESS;ENDrtl;三、寄存器串行输入、串行输出移位寄存器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYshift8ISPORT(a,clk:INSTD_LOGIC;b:OUTSTD_LOGIC);ENDshift8;ARCHITECTURErtlOFshift8ISSIGNSLdfo_1,dfo_2,dfo_3,dfo_4,dfo_5,dfo_6,dfo_7,dfo_8:STD_LOGIC;BEGINPROCESS(clk)BEGINIFrising_edge(clk)THE