vhdl combinacional

18
Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL 1 Diseño de Sistemas Combinacionales Con VHDL [email protected] [email protected] Enero 2006

Upload: jose-emmanuel-sainz

Post on 23-Nov-2014

187 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅1⋅

TEMARIO

Diseño de Sistemas

Combinacionales Con VHDL

[email protected] [email protected]

Enero 2006

Page 2: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅2⋅

Page 3: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅3⋅

1 INTRODUCCIÓN La lógica combinacional es probablemente la más fácil de diseñar, ya que en cada momento las salidas de un circuito combinacional sólo dependen del estado actual de sus entradas (el circuito no tiene memoria). En esta unidad se modelarán los circuitos combinacionales más utilizados en el diseño lógico mediante el lenguaje de descripción de hardware VHDL.

2 DISEÑO BASADO EN ELEMENTOS MSI Un circuito combinacional práctico puede tener docenas de entradas y salidas y puede requerir cientos, miles, e incluso millones de términos 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 mayoría de los problemas de diseño lógico combinacional reales son demasiado grandes para resolverse mediante la aplicación de la “fuerza bruta” de técnicas teóricas. La clave del desarrollo de estos sistemas es el pensamiento estructurado. Un circuito o sistema complejo se concibe como una colección de subsistemas más pequeños, cada uno de los cuales tiene una descripción más sencilla. Estos bloques combinacionales de construcción constituyen los ladrillos con los que se edifican los sistemas combinacionales. Uno de los bloques electrónicos más importantes de este tipo lo constituyen los denominados elementos MSI (Medium Scale of Integration) combinacionales estudiados en la asignatura de Electrónica Digital: multiplexores, decodificadores, comparadores, sumadores y demás. Las estructuras más importantes se describen en esta unidad desde una perspectiva de los lenguajes de descripción de hardware, en concreto usando el lenguaje VHDL.

Page 4: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅4⋅

3 DESCRIPCIÓN VHDL DE LÓGICA COMBINACIONAL

Para describir circuitos combinacionales utilizaremos sentencias de asignación concurrentes y procesos. • Sentencias de asignación concurrentes.

Las sentencias de asignación concurrentes van fuera de proceso. Esto se debe a que en una declaración concurrente no importa el orden en que se escriban las señales, ya que el resultado para una determinada función sería el mismo. Se utilizarán tres tipos de sentencias de asignación concurrentes:

⋅ Sentencias de asignación simples, por ejemplo: Y <= A and B;

⋅ Sentencias de asignación condicionales, por ejemplo: Z <= B when S = ‘1’ else A;

⋅ Sentencias de selección, por ejemplo: with S select

C <= ‘1’ when “00”; ‘0’ when others;

Siempre hay que evitar la realimentación combinacional, ya que esto modela elementos de memoria asíncronos. Es decir, hay que evitar que una misma señal aparezca en el lado izquierdo y en el lado derecho de la sentencia de asignación:

-- Evitar sentencias de este tipo: Y <= Y nand X;

• Procesos.

Se debe respetar las siguientes reglas: ⋅ Si una señal es leída en el interior de un proceso (aparece en el lado

derecho de una sentencia de asignación o en una condición), debe aparecer en su lista de sensibilidad.

⋅ Si a una señal 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 señal no se ha definido en el código. En VHDL las señales mantienen su valor hasta que se les asigna uno nuevo; por lo tanto, si para una señal dada el valor de una señal está indefinido, el compilador sintetiza un latch (biestable) que almacena la señal.

Page 5: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅5⋅

6.3.1 MULTIPLEXORES

Un circuito multiplexor acepta N entradas y presenta una salida en la que aparecerá el valor lógico asociado a una de estas entradas. La selección de cuál de esas entradas es la que aparece en la salida se determina por un conjunto de M señales de control, cumpliéndose que N = 2M . La salida presentará aquella entrada cuyo índice concuerda con el número codificado en binario en las líneas de control (o selección). • 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;

Page 6: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅6⋅

6.3.2 DECODIFICADORES

Un decodificador es un circuito lógico con N entradas y 2N salidas que funciona de forma tal que en cada instante se encuentra activa la salida correspondiente con la codificación binaria codificada en la entrada. • Ej_2: Decodificador 3 a 8 con salida activa a nivel alto.

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;

E0

E1

E2

S0 S1 S2 S3 S4 S5 S6 S7

Page 7: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅7⋅

• Ej_3: Decodificador 3 a 8 con salida activa a nivel alto y con señal de

enable (Versión Concurrente).

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 --Señal auxiliar para una asignación concurrente intermedia. signal svAux: std_logic_vector(7 DOWNTO 0); BEGIN --Asignación 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; --Asignación a la salida en función de la señal de ENABLE. svSalida <= svAux WHEN sEnableH = '1' ELSE "00000000"; END Decodificador3a8EnArch;

E0

E1

E2

S0 S1 S2 S3 S4 S5 S6 S7

ENABLE

Page 8: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅8⋅

• Ej_4: Decodificador 3 a 8 con salida activa a nivel alto y con señal de

enable (Versión Secuencial).

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 -- Definición 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;

E0

E1

E2

S0 S1 S2 S3 S4 S5 S6 S7

ENABLE

Page 9: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅9⋅

• Ej_5: Decodificador BCD a display de 7 segmentos (Ánodo Común).

Ánodo común ⇒ Cada segmento se enciende con ‘0’. Cátodo común ⇒ 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;

A

B

C

a b c d e f g D

a

b

c

d

e

f g

Page 10: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅10⋅

6.3.3 CODIFICADORES

Un codificador es un circuito lógico con 2N entradas y N salidas que funciona de forma tal que en cada instante se encuentra codificado en binario en la salida el número 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.

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;

ENTITY Codificador8a3 IS -- El uso de un rango clarifica el código. 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 codificación. 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;

S0

S1

S2

E0 E1 E2 E3 E4 E5 E6 E7

Page 11: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅11⋅

• Ej_7: Codificador 8 a 3. Uso de la macro NULL.

VHDL’93 soporta la macro NULL, la cual permite dar aún más claridad a la descripción 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 código. 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 decodificación. 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 podrían originar comportamientos extraños. END IF; END PROCESS; END Codificador8a3Arch;

S0

S1

S2

E0 E1 E2 E3 E4 E5 E6 E7

Page 12: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅12⋅

6.3.4 DISPOSITIVOS TRIESTADO

Los dispositivos triestado básicamente consisten en componentes básicos combinacionales que presentan una señal 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 eléctricamente con otros elementos que podrían compartir la ruta de datos conectada a su salida. • Ej_8: Buffer Triestado.

Los registros de tres estados (buffers 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 través de los valores que manejan (‘0’, ‘1’ y alta impedancia ‘Z’) mediante el uso del tipo std_logic para señales individuales o std_logic_vector en el caso de buses de datos.

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;

Salida Entrada

Enable (chip select)

Page 13: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅13⋅

• Ej_9: Buffer Triestado activo a nivel bajo.

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 optimización del diseño hay que considerar la arquitectura subyacente a la FPGA. En el caso de Xilinx BufferTriestadoL ocupa menos área que BufferTriestadoH.

Salida Entrada

Enable (chip select)

Page 14: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅14⋅

6.3.5 GENERADORES DE PARIDAD

Los generadores de paridad aceptan M entradas y generan una salida que toma un valor lógico de ‘1’ o ‘0’ de forma que el número total de 1’s del conjunto entrada y salida sea un número par (generador de paridad par) o impar (generador de paridad impar). Por Electrónica Digital se sabe que es posible construir este tipo de circuitos conectando en cascadas o en árbol puertas de tipo XOR (recomendándose la estructura balanceada en árbol). Por ejemplo, el comportamiento de un generador de paridad par de 3 bits quedaría reflejado en la tabla de verdad adjunta: E2 E1 E0 S 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1

Como se puede observar en los esquemas anteriores, una estructura en árbol ocupa más área, pero permite un equilibrio en retardos, lo que es aconsejable en diseños que deban trabajar a elevada velocidad. Es el diseñador el que debe seleccionar la estructura que mejor se adapte a sus necesidades.

Generador de Paridad. Estructura en cascada.

Generador de Paridad. Estructura en árbol.

Page 15: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅15⋅

La mejor forma de describir este tipo de dispositivos es mediante el uso de las ecuaciones booleanas o mediante la instanciación 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 paréntesis para optimizar -- el proceso de síntesis. sSalida <= (svEntrada(0) xor svEntrada(1)) xor (svEntrada(2) xor '0'); END GeneradorParidadPar3bArch;

• Ej_11: Generador de paridad. Estructura en árbol (Instanciación).

1) Fichero Ej_6_11_XOR2.vhd de generación 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;

Page 16: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅16⋅

2) Fichero Ej_6_11_Paridad3bIns.vhd de instanciación

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --======================================================= -- Declaración 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 GeneradorParidadPar3bInst 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 señales 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;

X1

X2 G2

G1

G3

Page 17: VHDL Combinacional

Electrónica Industrial Diseño de Sistemas Combinacionales con VHDL

⋅17⋅

6.3.6 COMPARADORES

La comparación de la igualdad de dos palabras binarias es una operación comúnmente utilizada en sistemas de cómputo e interfaces de dispositivos. A un circuito que compara dos palabras binarias e indica si son iguales se le conoce como comparador. Algunos comparadores también indican una relación aritmética (mayor, menor o igual) entre las palabras. Estos dispositivos se denominan comparadores de magnitud. • Ej_12: Comparador de 4 bits.

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 --Comparación de Igualdad. IF (svE1 = svE2) THEN sIgual <= '1';

ELSE sIgual <= '0'; END IF; --Comparación de Mayor (svE1>svE2). IF (svE1 > svE2) THEN sMayor <= '1'; ELSE sMayor <= '0'; END IF; --Comparación de Menor (svE1<svE2). IF (svE1 < svE2) THEN sMenor <= '1'; ELSE sMenor <= '0'; END IF; END PROCESS Compara; END Comparador3bArch;

MAYOR

IGUAL

MENOR

A0 ······ A3

B0 ······ B3

Page 18: VHDL Combinacional

Diseño de Sistemas Electrónicos-DB4 Unidad 6. Diseño de Sistemas Combinacionales

⋅18⋅

• Ej_13: Comparador de ancho de palabra configurable.

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 --Comparación de Igualdad. IF (svE1 = svE2) THEN sIgual <= '1'; ELSE sIgual <= '0'; END IF; --Comparación de Mayor (svE1>svE2). IF (svE1 > svE2) THEN sMayor <= '1'; ELSE sMayor <= '0'; END IF; --Comparación de Menor (svE1<svE2). IF (svE1 < svE2) THEN sMenor <= '1'; ELSE sMenor <= '0'; END IF; END PROCESS Compara; END Comparador3bArch;

MAYOR

IGUAL

MENOR

A0 ······

AN-1

B0 ······

BN-1