| Entidad 1: Decodificador de 3 a 8 |
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 |
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 9 10 11 12 13 14 15 16 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).
| Entidad 2: Decodificador de BCD a 7 segmentos |
É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 |
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 6 7 8 9 10 11 12 13 14 15 16 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.
![]()