Vous êtes sur la page 1sur 18

Electrnica Industrial

Diseo de Sistemas Combinacionales con VHDL

Diseo de Sistemas Combinacionales Con VHDL


Andres.Iborra@upct.es Juan.Suardiaz@upct.es Enero 2006

TEMARIO

Electrnica Industrial

Diseo de Sistemas Combinacionales con VHDL

Electrnica Industrial

Diseo de Sistemas Combinacionales con VHDL

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.

2 DISEO BASADO EN ELEMENTOS MSI


Un circuito combinacional prctico puede tener docenas de entradas y salidas y puede requerir cientos, miles, e incluso millones de trminos para describir como una suma de productos, y miles y miles de millones de renglones para describir en una tabla de verdad. De este modo, la mayora de los problemas de diseo lgico combinacional reales son demasiado grandes para resolverse mediante la aplicacin de la fuerza bruta de tcnicas tericas. La clave del desarrollo de estos sistemas es el pensamiento estructurado. Un circuito o sistema complejo se concibe como una coleccin de subsistemas ms pequeos, cada uno de los cuales tiene una descripcin ms sencilla. Estos bloques combinacionales de construccin constituyen los ladrillos con los que se edifican los sistemas combinacionales. Uno de los bloques electrnicos ms importantes de este tipo lo constituyen los denominados elementos MSI (Medium Scale of Integration) combinacionales estudiados en la asignatura de Electrnica Digital: multiplexores, decodificadores, comparadores, sumadores y dems. Las estructuras ms importantes se describen en esta unidad desde una perspectiva de los lenguajes de descripcin de hardware, en concreto usando el lenguaje VHDL.

Electrnica Industrial

Diseo de Sistemas Combinacionales con VHDL

3 DESCRIPCIN VHDL DE LGICA COMBINACIONAL


Para describir circuitos combinacionales utilizaremos sentencias de asignacin concurrentes y procesos. Sentencias de asignacin concurrentes. Las sentencias de asignacin concurrentes van fuera de proceso. Esto se debe a que en una declaracin concurrente no importa el orden en que se escriban las seales, ya que el resultado para una determinada funcin sera el mismo. Se utilizarn tres tipos de sentencias de asignacin concurrentes: Sentencias de asignacin simples, por ejemplo: Y <= A and B; Sentencias de asignacin condicionales, por ejemplo: Z <= B when S = 1 else A; Sentencias de seleccin, por ejemplo: with S select C <= 1 when 00; 0 when others; Siempre hay que evitar la realimentacin combinacional, ya que esto modela elementos de memoria asncronos. Es decir, hay que evitar que una misma seal aparezca en el lado izquierdo y en el lado derecho de la sentencia de asignacin: -- Evitar sentencias de este tipo: Y <= Y nand X; Procesos. Se debe respetar las siguientes reglas: Si una seal es leda en el interior de un proceso (aparece en el lado derecho de una sentencia de asignacin o en una condicin), debe aparecer en su lista de sensibilidad. Si a una seal se le asigna un valor de forma condicional (con sentencias if o case) nos debemos asegurar que no existen condiciones para las cuales el valor de la seal no se ha definido en el cdigo. En VHDL las seales mantienen su valor hasta que se les asigna uno nuevo; por lo tanto, si para una seal dada el valor de una seal est indefinido, el compilador sintetiza un latch (biestable) que almacena la seal.
4

Electrnica Industrial

Diseo de Sistemas Combinacionales con VHDL

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

Diseo de Sistemas Combinacionales con VHDL

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

Diseo de Sistemas Combinacionales con VHDL

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

Diseo de Sistemas Combinacionales con VHDL

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

Diseo de Sistemas Combinacionales con VHDL

Ej_5: Decodificador BCD a display de 7 segmentos (nodo Comn).


a A B C D a b c d e f g f b g c d

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

Diseo de Sistemas Combinacionales con VHDL

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

Diseo de Sistemas Combinacionales con VHDL

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

Diseo de Sistemas Combinacionales con VHDL

6.3.4 DISPOSITIVOS TRIESTADO


Los dispositivos triestado bsicamente consisten en componentes bsicos combinacionales que presentan una seal adicional que permite controlar la salida, de forma que sta presente un funcionamiento en condiciones normales o pase a un estado adicional de alta impedancia Z, de forma que no interfiera elctricamente con otros elementos que podran compartir la ruta de datos conectada a su salida. Ej_8: Buffer Triestado. (chip select) Los registros de tres estados (buffers Entrada Salida tri-estado) tienen diversas aplicaciones, ya sea como salida de sistemas (modo buffer) o como parte integral de un circuito. En VHDL estos dispositivos son definidos a travs de los valores que manejan (0, 1 y alta impedancia Z) mediante el uso del tipo std_logic para seales individuales o std_logic_vector en el caso de buses de datos.
Enable

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

Diseo de Sistemas Combinacionales con VHDL

Ej_9: Buffer Triestado activo a nivel bajo.


Enable (chip select) Entrada Salida

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

Diseo de Sistemas Combinacionales con VHDL

6.3.5 GENERADORES DE PARIDAD


Los generadores de paridad aceptan M entradas y generan una salida que toma un valor lgico de 1 o 0 de forma que el nmero total de 1s del conjunto entrada y salida sea un nmero par (generador de paridad par) o impar (generador de paridad impar). Por Electrnica Digital se sabe que es posible construir este tipo de circuitos conectando en cascadas o en rbol puertas de tipo XOR (recomendndose la estructura balanceada en rbol). Por ejemplo, el comportamiento de un generador de paridad par de 3 bits quedara reflejado en la tabla de verdad adjunta: E2 0 0 0 0 1 1 1 1 E1 0 0 1 1 0 0 1 1 E0 0 1 0 1 0 1 0 1 S 0 1 1 0 1 0 0 1

Generador de Paridad. Estructura en cascada.

Generador de Paridad. Estructura en rbol.

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

Diseo de Sistemas Combinacionales con VHDL

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

Diseo de Sistemas Combinacionales con VHDL

2) Fichero Ej_6_11_Paridad3bIns.vhd de instanciacin


G1

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

Diseo de Sistemas Combinacionales con VHDL

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

Diseo de Sistemas Electrnicos-DB4

Unidad 6. Diseo de Sistemas Combinacionales

Ej_13: Comparador de ancho de palabra configurable.


A0 AN-1 B0 BN-1 MAYOR

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

Vous aimerez peut-être aussi