Académique Documents
Professionnel Documents
Culture Documents
TEMARIO
Electrnica Industrial
Electrnica Industrial
1 INTRODUCCIN
La lgica combinacional es probablemente la ms fcil de disear, ya que en cada momento las salidas de un circuito combinacional slo dependen del estado actual de sus entradas (el circuito no tiene memoria). En esta unidad se modelarn los circuitos combinacionales ms utilizados en el diseo lgico mediante el lenguaje de descripcin de hardware VHDL.
Electrnica Industrial
Electrnica Industrial
6.3.1 MULTIPLEXORES
Un circuito multiplexor acepta N entradas y presenta una salida en la que aparecer el valor lgico asociado a una de estas entradas. La seleccin de cul de esas entradas es la que aparece en la salida se determina por un conjunto de M seales de control, cumplindose que N = 2M . La salida presentar aquella entrada cuyo ndice concuerda con el nmero codificado en binario en las lneas de control (o seleccin). Ej_1: Multiplexor 4 a 1.
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Multiplexor4a1 IS PORT ( svEntrada: IN std_logic_vector(3 DOWNTO 0); sSalida: OUT std_logic; svSeleccion: IN std_logic_vector(1 DOWNTO 0)); END Multiplexor4a1; ARCHITECTURE Multiplexor4a1Arch OF Multiplexor4a1 IS BEGIN WITH svSeleccion SELECT sSalida <= svEntrada(0) WHEN "00", svEntrada(1) WHEN "01", svEntrada(2) WHEN "10", svEntrada(3) WHEN OTHERS; -- Importante. No olvidar. END Multiplexor4a1Arch;
Electrnica Industrial
6.3.2 DECODIFICADORES
Un decodificador es un circuito lgico con N entradas y 2N salidas que funciona de forma tal que en cada instante se encuentra activa la salida correspondiente con la codificacin binaria codificada en la entrada. Ej_2: Decodificador 3 a 8 con salida activa a nivel alto.
E0 E1 E2 S0 S1 S2 S3 S4 S5 S6 S7
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Decodificador3a8 IS PORT ( svEntrada: IN std_logic_vector(2 DOWNTO 0); svSalida: OUT std_logic_vector(7 DOWNTO 0)); END Decodificador3a8; ARCHITECTURE Decodificador3a8Arch OF Decodificador3a8 IS BEGIN WITH svEntrada SELECT -- Orden salidas: "76543210" svSalida <= "00000001" WHEN "000", "00000010" WHEN "001", "00000100" WHEN "010", "00001000" WHEN "011", "00010000" WHEN "100", "00100000" WHEN "101", "01000000" WHEN "110", "10000000" WHEN OTHERS; END Decodificador3a8Arch;
Electrnica Industrial
Ej_3: Decodificador 3 a 8 con salida activa a nivel alto y con seal de enable (Versin Concurrente).
S0 S1 S2 S3 S4 S5 S6 S7
E0 E1 E2
ENABLE
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Decodificador3a8En IS PORT ( svEntrada: IN std_logic_vector(2 DOWNTO 0); svSalida: OUT std_logic_vector(7 DOWNTO 0); sEnableH: IN std_logic); END Decodificador3a8En; ARCHITECTURE Decodificador3a8EnArch OF Decodificador3a8En IS --Seal auxiliar para una asignacin concurrente intermedia. signal svAux: std_logic_vector(7 DOWNTO 0); BEGIN --Asignacin del valor temporal WITH svEntrada SELECT -"76543210" svAux <= "00000001" WHEN "000", "00000010" WHEN "001", "00000100" WHEN "010", "00001000" WHEN "011", "00010000" WHEN "100", "00100000" WHEN "101", "01000000" WHEN "110", "10000000" WHEN OTHERS; --Asignacin a la salida en funcin de la seal de ENABLE. svSalida <= svAux WHEN sEnableH = '1' ELSE "00000000"; END Decodificador3a8EnArch;
Electrnica Industrial
Ej_4: Decodificador 3 a 8 con salida activa a nivel alto y con seal de enable (Versin Secuencial).
E0 E1 E2 S0 S1 S2 S3 S4 S5 S6 S7
ENABLE
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Decodificador3a8En IS PORT ( svEntrada: IN std_logic_vector(2 DOWNTO 0); svSalida: OUT std_logic_vector(7 DOWNTO 0); sEnableH: IN std_logic); END Decodificador3a8En; ARCHITECTURE Decodificador3a8EnArch2 OF Decodificador3a8En IS BEGIN DecEnable: PROCESS (svEntrada, sEnableH) BEGIN -- Definicin del proceso de forma secuencial (estructura IF..ELSE). IF (sEnableH='1') THEN CASE svEntrada IS WHEN "000" => svSalida <= "00000001"; WHEN "001" => svSalida <= "00000010"; WHEN "010" => svSalida <= "00000100"; WHEN "011" => svSalida <= "00001000"; WHEN "100" => svSalida <= "00010000"; WHEN "101" => svSalida <= "00100000"; WHEN "110" => svSalida <= "01000000"; WHEN OTHERS => svSalida <= "10000000"; END CASE; ELSE svSalida <= "00000000"; END IF; END PROCESS DecEnable; END Decodificador3a8EnArch2;
Electrnica Industrial
nodo comn Cada segmento se enciende con 0. Ctodo comn Cada segmento se enciende con 1.
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DecodificadorBCD7seg IS PORT ( svEntrada: IN std_logic_vector(3 DOWNTO 0); svSalida: OUT std_logic_vector(6 DOWNTO 0)); END DecodificadorBCD7seg; ARCHITECTURE DecodificadorBCD7segArch OF DecodificadorBCD7seg IS BEGIN Dec7seg: PROCESS (svEntrada) BEGIN CASE svEntrada IS -- Orden de las salidas (segmentos) abcdefg WHEN "0000" => svSalida <= "0000001"; WHEN "0001" => svSalida <= "1001111"; WHEN "0010" => svSalida <= "0010010"; WHEN "0011" => svSalida <= "0000110"; WHEN "0100" => svSalida <= "1001100"; WHEN "0101" => svSalida <= "0100100"; WHEN "0110" => svSalida <= "0100000"; WHEN "0111" => svSalida <= "0001110"; WHEN "1000" => svSalida <= "0000000"; WHEN "1001" => svSalida <= "0000100"; WHEN OTHERS => svSalida <= "1111111"; END CASE; END PROCESS Dec7seg; END DecodificadorBCD7segArch;
Electrnica Industrial
6.3.3 CODIFICADORES
Un codificador es un circuito lgico con 2N entradas y N salidas que funciona de forma tal que en cada instante se encuentra codificado en binario en la salida el nmero decimal correspondiente a la entrada activa. Es necesario establecer una prioridad para los casos en los que sean varias las entradas activas en un momento determinado. Ej_6: Codificador 8 a 3.
E0 E1 E2 E3 E4 E5 E6 E7 S0 S1 S2
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Codificador8a3 IS -- El uso de un rango clarifica el cdigo. PORT ( iEntrada: IN INTEGER RANGE 0 TO 7; svSalida: OUT std_logic_vector(2 DOWNTO 0)); END Codificador8a3; ARCHITECTURE Codificador8a3Arch OF Codificador8a3 IS BEGIN Codif: PROCESS (iEntrada) BEGIN -- El uso de una estructura tipo IF_THEN_ELSE -- permite establecer de forma clara la prioridad -- del proceso de codificacin. IF iEntrada = 0 THEN svSalida <= "000"; ELSIF iEntrada = 1 THEN svSalida <= "001"; ELSIF iEntrada = 2 THEN svSalida <= "010"; ELSIF iEntrada = 3 THEN svSalida <= "011"; ELSIF iEntrada = 4 THEN svSalida <= "100"; ELSIF iEntrada = 5 THEN svSalida <= "101"; ELSIF iEntrada = 6 THEN svSalida <= "110"; ELSE svSalida <= "111"; END IF; END PROCESS; END Codificador8a3Arch;
10
Electrnica Industrial
Ej_7: Codificador 8 a 3. Uso de la macro NULL. VHDL93 soporta la macro NULL, la cual permite dar an ms claridad a la descripcin de funcionamiento de los elementos modelados en VHDL.
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Codificador8a3 IS -- El uso de un rango clarifica el cdigo. PORT ( iEntrada: IN INTEGER RANGE 0 TO 7; svSalida: OUT std_logic_vector(2 DOWNTO 0)); END Codificador8a3; ARCHITECTURE Codificador8a3Arch OF Codificador8a3 IS BEGIN Codif: PROCESS (iEntrada) BEGIN -- El uso de una estructura tipo IF_THEN_ELSE -- permite establecer de forma clara la prioridad -- del proceso de decodificacin. IF iEntrada = 0 THEN svSalida <= "000"; ELSIF iEntrada = 1 THEN svSalida <= "001"; ELSIF iEntrada = 2 THEN svSalida <= "010"; ELSIF iEntrada = 3 THEN svSalida <= "011"; ELSIF iEntrada = 4 THEN svSalida <= "100"; ELSIF iEntrada = 5 THEN svSalida <= "101"; ELSIF iEntrada = 6 THEN svSalida <= "110"; ELSIF iEntrada = 7 THEN svSalida <= "111"; ELSE NULL; -- La sentencia ELSE NULL; indica de forma clara que ante otras posibles -- valores no controlados asociados a la entrada, el circuito no har nada. -- Suele ser muy til con el tipo std_logic, donde valores como Z, H, L, U -- contemplados por este tipo podran originar comportamientos extraos. END IF; END PROCESS; END Codificador8a3Arch;
E0 E1 E2 E3 E4 E5 E6 E7 S0 S1 S2
11
Electrnica Industrial
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY BufferTriestadoH IS PORT ( sEntrada, sEnableH: IN std_logic; sSalida: OUT std_logic); END BufferTriestadoH; ARCHITECTURE BufferTriestadoHArch OF BufferTriestadoH IS BEGIN PROCESS (sEntrada, sEnableH) BEGIN IF sEnableH = '0' THEN sSalida <= 'Z'; -- Salida triestado ELSE sSalida <= sEntrada; -- Salida Normal END IF; END PROCESS; END BufferTriestadoHArch;
12
Electrnica Industrial
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY BufferTriestadoL IS PORT ( sEntrada, sEnableL: IN std_logic; sSalida: OUT std_logic); END BufferTriestadoL; ARCHITECTURE BufferTriestadoLArch OF BufferTriestadoL IS BEGIN PROCESS (sEntrada, sEnableL) BEGIN IF sEnableL = '1' THEN sSalida <= 'Z'; ELSE sSalida <= sEntrada; END IF; END PROCESS; END BufferTriestadoLArch;
Desde el punto de vista de optimizacin del diseo hay que considerar la arquitectura subyacente a la FPGA. En el caso de Xilinx BufferTriestadoL ocupa menos rea que BufferTriestadoH.
13
Electrnica Industrial
Como se puede observar en los esquemas anteriores, una estructura en rbol ocupa ms rea, pero permite un equilibrio en retardos, lo que es aconsejable en diseos que deban trabajar a elevada velocidad. Es el diseador el que debe seleccionar la estructura que mejor se adapte a sus necesidades.
14
Electrnica Industrial
La mejor forma de describir este tipo de dispositivos es mediante el uso de las ecuaciones booleanas o mediante la instanciacin de componentes. Ej_10: Generador de paridad. Estructura en rbol (Ecuaciones booleanas).
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY GeneradorParidadPar3b IS PORT ( svEntrada: IN std_logic_vector(2 DOWNTO 0); sSalida: OUT std_logic); END GeneradorParidadPar3b; ARCHITECTURE GeneradorParidadPar3bArch OF GeneradorParidadPar3b IS BEGIN -- Importante el uso de parntesis para optimizar -- el proceso de sntesis. sSalida <= (svEntrada(0) xor svEntrada(1)) xor (svEntrada(2) xor '0'); END GeneradorParidadPar3bArch;
Ej_11: Generador de paridad. Estructura en rbol (Instanciacin). 1) Fichero Ej_6_11_XOR2.vhd de generacin del componente XOR2
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY XOR2 IS PORT ( sE1, sE2: IN std_logic; sS: OUT std_logic); END XOR2; ARCHITECTURE XOR2 Arch OF XOR2 IS BEGIN sS <= sE1 xor sE2; END XOR2 bArch;
15
Electrnica Industrial
X1 G3
G2
X2
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --======================================================= -- Declaracin de la entidad y arquitectura del generador. --======================================================= ENTITY GeneradorParidadPar3bInst IS PORT ( svEntrada: IN std_logic_vector(2 DOWNTO 0); sSalida: OUT std_logic); END GeneradorParidadPar3bInst; ARCHITECTURE GeneradorParidadPar3bArch2 OF GeneradorParidadPar3bIn st IS -- Se declara el uso de componentes tipo XOR2. COMPONENT XOR2 --Se indica los puertos que tiene el componente. PORT( sE1, sE2: IN std_logic; sS: OUT std_logic); END COMPONENT; -- Se declaran seales adicionales de trabajo. SIGNAL sX1, sX2: std_logic; BEGIN --Comienzo de la arquitectura. G1: XOR2 PORT MAP(sE1=>svEntrada(0), sE2=>svEntrada(1), sS=>sX1); G2: XOR2 PORT MAP(sE1=>svEntrada(2), sE2=>'0', sS=>sX2); G3: XOR2 PORT MAP(sE1=>sX1, sE2=>sX2, sS=>sSalida); END GeneradorParidadPar3bArch2;
16
Electrnica Industrial
6.3.6 COMPARADORES
La comparacin de la igualdad de dos palabras binarias es una operacin comnmente utilizada en sistemas de cmputo e interfaces de dispositivos. A un circuito que compara dos palabras binarias e indica si son iguales se le conoce como comparador. Algunos comparadores tambin indican una relacin aritmtica (mayor, menor o igual) entre las palabras. Estos dispositivos se denominan comparadores de magnitud. Ej_12: Comparador de 4 bits.
A0 A3 B0 B3 MAYOR
IGUAL
MENOR
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Comparador3b IS PORT ( svE1, svE2: IN std_logic_vector(3 DOWNTO 0); sIgual, sMayor, sMenor: OUT std_logic); END Comparador3b; ARCHITECTURE Comparador3bArch OF Comparador3b IS BEGIN Compara:PROCESS(svE1, svE2) BEGIN --Comparacin de Igualdad. IF (svE1 = svE2) THEN sIgual <= '1';
ELSE sIgual <= '0'; END IF; --Comparacin de Mayor (svE1>svE2). IF (svE1 > svE2) THEN sMayor <= '1'; ELSE sMayor <= '0'; END IF; --Comparacin de Menor (svE1<svE2). IF (svE1 < svE2) THEN sMenor <= '1'; ELSE sMenor <= '0'; END IF; END PROCESS Compara; END Comparador3bArch;
17
IGUAL
MENOR
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Comparador3b IS GENERIC(iNEntradas: Integer :=4); PORT ( svE1, svE2: IN std_logic_vector(iNEntradas-1 DOWNTO 0); sIgual, sMayor, sMenor: OUT std_logic); END Comparador3b; ARCHITECTURE Comparador3bArch OF Comparador3b IS BEGIN Compara:PROCESS(svE1, svE2) BEGIN --Comparacin de Igualdad. IF (svE1 = svE2) THEN sIgual <= '1'; ELSE sIgual <= '0'; END IF; --Comparacin de Mayor (svE1>svE2). IF (svE1 > svE2) THEN sMayor <= '1'; ELSE sMayor <= '0'; END IF; --Comparacin de Menor (svE1<svE2). IF (svE1 < svE2) THEN sMenor <= '1'; ELSE sMenor <= '0'; END IF; END PROCESS Compara; END Comparador3bArch;
18