CodificadorPráctica 5: DecodificadorComparador
 
Qué es un decodificadorUn decodificador es un circuito combinacional cuya característica fundamental es que, para cada combinación de las entradas, sólo una de las salidas tiene un nivel lógico diferente a las demás. Este circuito realiza la operación inversa a la de un codificador de datos y es análoga a la de un demultiplexor, pero sin entrada de información.

Pulsa sobre llos botones para elegir una prácticaElige en la lista una práctica para empezar, sin más que pinchar en el botón adecuado. Para volver pulsa el botón que está al lado del título

Comentarios adicionalesLos decodificadores expuestos será una muestra práctica de la versatilidad de VHDL para la implementación de este tipo de circuitos lógicos.

Entidad 1

Decodificador 3 a 8

Arquitectura 1

Decodificador 3 a 8

Entidad 3

Decodificador de BCD a 7 segmentos

Arquitectura 3

Decodificador de BCD a 7 segmentos
Pulsa aquí para simular los ejemplos construidos.

 

 

Entidad 1: Decodificador de 3 a 8 Ir al principio de esta página

Para el diseño de la entidad necesitamos tener una entrada de tres bits, dos entradas de control, y una salida de ocho bits que en este caso serán activas por nivel bajo. El código no requiere mayor explicación, ya que la entidad es muy sencilla:

library ieee;
use ieee.std_logic_1164.all;
entity decoder is
port(
entrada: in  std_logic_vector(2 downto 0);
g1, g2: in  std_logic;
salida: out std_logic_vector(7 downto 0)
);
end decoder;
La entrada de información es entrada, las de control son g1 y g2 y la salida es salida.

 

 

 

 

 

 

 

 

 

Arquitectura 1:  Decodficador de 3 a 8 Ir al principio de esta página

Para crear la arquitectura de este decodificador deberemos saber que operatividad exacta le vamos a proporcionar. En este caso usaremos como modelo del circuito MSI 74138 y traducirla al lenguaje VHDL.

g1 g2 Entrada
(2 a 0)
Salida
(7 a 0)
X H XXX HHHHHHHH
L L XXX HHHHHHHH
H L LLL LHHHHHHH
H L LLH HLHHHHHH
H L LHL HHLHHHHH
H L LHH HHHLHHHH
H L HLL HHHHLHHH
H L HLH HHHHHLHH
H L HHL HHHHHHLH
H L HHH HHHHHHHL

 

1
2
3
4
5
6
7
8 La salida vale '01111111' si la entrada es '000'
9
10
11
12
13
14
15
16
La salida vale '11111111' si la entrada tiene un valor no especificado en las sentencias anteriores
17
18
architecture archidecoder of decoder is
begin
decoder: process (entrada,g1,g2)
begin
if g2='1' then salida<=(others=>'1');
  elsif g2='0' and g1='0' then salida<=(others=>'1');
   elsif g2='0' and g1='1' then

    salida <= "01111111" when entrada="000" else
              "10111111" when entrada="001" else
              "11011111" when entrada="010" else
              "11101111" when entrada="011" else
              "11110111" when entrada="100" else
              "11111011" when entrada="101" else
              "11111101" when entrada="110" else
              "11111110" when entrada="111" else
              "11111111";
end archidecoder;

En este ejemplo introducimos una nueva sentencia, la sentencia when-else que viene a ser como una scesión de sentencias if anidadas. No debemos olvidar al final la sentencia others en la que se contemplan todos los demás posibles valores qu puede tomar la entrada, ya que aunque en un principio parecen estar contempladas, no debemos olvidar queel tipo std_logic puede tener más valores aparte del nivel alto y el nivel bajo, como el de alta impedancia o el don't care (poco importa).

 

Qué debes saber antes de simular Pulsa aquí para ver el código fuente Pulsa aquí para simular el ejemplo anterior

 

 

Entidad 2: Decodificador de BCD a 7 segmentos Ir al principio de esta página

Éste es un ejemplo muy típico de decodificador, en el cual tenemos 4 bits de entrada por los cuales nos llega un número en BCD natural y a la salida tenemos 7 bits de salida los cuales contienen decodificado el número de la entrada para que sea entendido por un display de 7 segmentos. La entidad correspondiente no tiene ningúna complicación, si exceptuamos que usamos el tipo std_logic, para lo cual hay que cargar un paquete de la librería ieee.

library ieee;
use ieee.std_logic_1164.all;
entity convertidor is
port(
bcd: in  bit_vector(3 downto 0);
led: out bit_vector(6 downto 0)
);
end convertidor;
Al igual que antes, para usar el tipo std_logic o alguno de sus derivados (como los vectores), debemos cargar la librería ieee, y, de ésta, el paquete std_logic_1164. La palabra all indica que cargamos TODO el paquete, no una parte.

 

 

 

 

 

 

 

 

Arquitectura 2: Decodificador de BCD a 7 segmentos Ir al principio de esta página

Para crear la arquitectura de este decodificador deberemos conocer cual es la tabla de verdad del mismo (que se puede encontrar en cualquier data-book), y traducirla a lenguaje VHDL. Al ver la tabla y el código, comprobamos la similitud entre ambos. La tabla la siguiente:

Entrada
(BCD)
Salida
(LED)
LLLL HHHHHHL
LLLH HHLLLLL
LLHL HLHHLHH
LLHH HHHLLHH
LHLL HHLLHLH
LHLH LHHLHHH
LHHL LHHHHHH
LHHH HHLLLHL
HLLL HHHHHHH
HLLH HHHLHHH
LLLL LLLLLLL

1
2
3
4
5 Según el valor de "bcd", asignamos a la salida "led" un valor u otro.
6
7
8
9
10
11
12
13
14
15
16
Si la entrada no está especificada en los casos anteriores, es decir, no es código BCD, la salida la ponemos a cero.
17
18
19
architecture archiconv of convertidor is
begin
conv: process (bcd)
begin
case bcd is
  when "0000" => LED <= "1111110";
  when "0001" => LED <= "1100000";
  when "0010" => LED <= "1011011";
  when "0011" => LED <= "1110011";
  when "0100" => LED <= "1100101";
  when "0101" => LED <= "0110111";
  when "0110" => LED <= "0111111";
  when "0111" => LED <= "1100010";
  when "1000" => LED <= "1111111";
  when "1001" => LED <= "1110111";
  when others => LED <= "0000000";
end case;
end process conv;
end archiconv;

Este ejemplo no tiene nada de extraño a estas alturas del tutorial, ya que la sentencia case ha aparecido en muchas ocasiones. Lo único es que hemos puesto un nombre al proceso (conv). Esto es útil para cuando tenemos varios de ellos en el mismo programa y queremos estructurar la programación para hacerla más legible. Al cerrar un proceso con nombre, hay que especificarlo, como aparece en la línea 18.

 

Qué debes saber antes de simular Pulsa aquí para ver el código fuente Pulsa aquí para simular el ejemplo anterior

 

 

Separa01.gif (636 bytes)

ÍndicePráctica anterior: el codificadorPrincipio de la páginaPráctica siguiente: el comparadors