Laboratorio 2: Lógica combinacional: comparador.
Este laboratorio explora diferentes alternativas para la implementaciónd de lógica combinacional con recurso de VHDL.
Introducción
Este laboratorio es una introducción a la descripción de lógica combinacional en VHDL. Se realizarán diferentes alternativas de descripción de un circuito combinacional simple en VHDL, y se sintetizará y configurará la FPGA del laboratorio remoto de FPGA para verificar su funcionamiento.
Objetivos
Desarrollar una descripción de un circuito combinacional comparador de 4 señales de entrada y una señal de salida.
Requisitos
Software Quartus Prime Lite versión 18.0 instalado y configurado para la conexión al Laboratorio remoto de FPGA.
Diseño
Implementar un circuito comparador de cuatro señales de entrada (IN_WEB[3], IN_WEB[2], IN_WEB[1] y IN_WEB[0]), y 1 salida (OUT_WEB[0]).
Cada una de las entradas puede tener un valor de ‘0’ o ‘1’. Al ser cuatro entradas, existen 16 combinaciones posibles. A cada una de estas combinaciones se le asocia un código de 0 a 16. La salida se activará (pondrá en ‘1’) si el código de la combinación de la entrada es menor o igual a 1. La tabla de verdad 1 muestra el valor de la salida para cada una de las combinaciones de entradas y el código asociado a cada una de estas combinaciones.
Tabla de verdad 1.
Desarrollo
El laboratorio consistirá en:
- realizar un proyecto en Quartus Prime Lite que describa el circuito comparador descripto,
- configurar los pines del dispositivo ejecutando el archivo correspondiente de la placa del laboratorio remoto de FPGA,
- transferir el hardware sintetizado a la placa del laboratorio remoto de FPGA,
- comprobar que cada una de las combinaciones de entrada produce las salidas correctas en la interface web del laboratorio remoto de FPGA.
Descripción
Existen diversas maneras de describir el circuito propuesto. En esta sección, veremos algunas de ellas, y en próximas unidades podremos ver algunas otras que nos facilitarán la descripción.
Descripción mediante función lógica suma de productos
De manera similar a la realizada en la descripción del decodificar 3×8 del Laboratorio 1, la salida de este circuito combinacional puede ser descripta como la función lógica que implementa sobre las entradas.
En este circuito comparador, y leyendo la tabla de verdad 1, la salida OUT_WEB[0] tendrá el valor uno si:
(IN_WEB[3] = 0 y IN_WEB[2] = 0 y IN_WEB[1] = 0 y IN_WEB[0] = 0) o
(IN_WEB[3] = 0 y IN_WEB[2] = 0 y IN_WEB[1] = 0 y IN_WEB[0] = 1) o
(IN_WEB[3] = 0 y IN_WEB[2] = 0 y IN_WEB[1] = 1 y IN_WEB[0] = 0) o
(IN_WEB[3] = 0 y IN_WEB[2] = 0 y IN_WEB[1] = 1 y IN_WEB[0] = 1) o
(IN_WEB[3] = 0 y IN_WEB[2] = 1 y IN_WEB[1] = 0 y IN_WEB[0] = 0) o
(IN_WEB[3] = 0 y IN_WEB[2] = 1 y IN_WEB[1] = 0 y IN_WEB[0] = 1) o
Esto es, la salida será igual a 1, si las entradas tienen la combinación con código 0 (IN_WEB[3] = 0 y IN_WEB[2] = 0 y IN_WEB[1] = 0 y IN_WEB[0] = 0), o si las entradas tienen la combinación con código 1 (IN_WEB[3] = 0 y IN_WEB[2] = 0 y IN_WEB[1] = 0 y IN_WEB[0] = 1), o si las entradas tienen la combinación con código 2 (IN_WEB[3] = 0 y IN_WEB[2] = 0 y IN_WEB[1] = 1 y IN_WEB[0] = 0), o si las entradas tienen la combinación con código 3 (IN_WEB[3] = 0 y IN_WEB[2] = 0 y IN_WEB[1] = 1 y IN_WEB[0] = 1)), o si las entradas tienen la combinación con código 4 (IN_WEB[3] = 0 y IN_WEB[2] = 1 y IN_WEB[1] = 0 y IN_WEB[0] = 0)), o si las entradas tienen la combinación con código 5 (IN_WEB[3] = 0 y IN_WEB[2] = 1 y IN_WEB[1] = 0 y IN_WEB[0] = 0).
Expresando esta condición como suma de minitérminos en lenguaje VHDL, el código podría ser de la siguiente manera:
library IEEE;
use ieee.std_logic_1164.all;
entity comparator is
port (
IN_WEB : in std_logic_vector(3 downto 0);
OUT_WEB : out std_logic_vector(7 downto 0)
);
end entity comparator;
architecture A1 of comparator is
begin
OUT_WEB(0) <= (not(IN_WEB(3)) and not(IN_WEB(2)) and not(IN_WEB(1)) and not(IN_WEB(0))) or
(not(IN_WEB(3)) and not(IN_WEB(2)) and not(IN_WEB(1)) and IN_WEB(0) ) or
(not(IN_WEB(3)) and not(IN_WEB(2)) and IN_WEB(1) and not(IN_WEB(0)) ) or
(not(IN_WEB(3)) and not(IN_WEB(2)) and IN_WEB(1) and IN_WEB(0) ) or
(not(IN_WEB(3)) and IN_WEB(2) and not(IN_WEB(1)) and not(IN_WEB(0)) ) or
(not(IN_WEB(3)) and IN_WEB(2) and not(IN_WEB(1)) and IN_WEB(0) );
end architecture A1 ;A nivel descriptivo, el código especifica una suma (implementada por una compuerta lógica “or”) de términos producto (implementados por compuertas lógicas “and”). Esquemáticamente, es la descripción de:
Descripción mediante función reducida
De la tabla de verdad 1 podemos observar que la salida será cero si IN_WEB[3] = 1 o si IN_WEB[2] y IN_WEB[1] son igual a uno. Puede observarse que esta expresión de la función de la tabla de verdad 1 es más reducida. Debido a que describe la condición en que la función toma el valor cero, debe expresarse como producto de sumas, quedando el código como:
library IEEE;
use ieee.std_logic_1164.all;
entity comparator is
port (
IN_WEB : in std_logic_vector(3 downto 0);
OUT_WEB : out std_logic_vector(7 downto 0)
);
end entity comparator;
architecture A1 of comparator is
begin
OUT_WEB(0) <= not(IN_WEB(3)) and (not(IN_WEB(2)) or not(IN_WEB(1)));
end architecture A1 ;A nivel descriptivo, el código especifica el siguiente esquemático:
Descripción mediante if concurrente de VHDL
Ambas implementaciones anteriores describen la misma función (especificada en la tabla de verdad 1) de diferentes maneras a nivel de compuertas. El lenguaje de descripción de hardware, al igual que ocurre con el lenguaje Verilog HDL, permite la descripción a un nivel de mayor abstracción, denominado RTL (Register Transfer Level). Este nivel lo explicaremos más adelante en el curso, pero en esta oportunidad utilizaremos la sentencia if concurrente, que tiene la siguiente estructura:
a <= b when c=’1’ else d;
Esta sentencia, a nivel RTL, describe un multiplexor, el cual es representado de la siguiente manera:
Una manera de describir la función de la tabla de verdad 1 mediante la sentencia if concurrente podría ser la del siguiente código:
library IEEE;
use ieee.std_logic_1164.all;
entity comparator is
port (
IN_WEB : in std_logic_vector(3 downto 0);
OUT_WEB : out std_logic_vector(7 downto 0)
);
end entity comparator;
architecture A1 of comparator is
begin
OUT_WEB(0) <= '0' when IN_WEB(3) = '1' else
'0' when IN_WEB(2) = '1' and IN_WEB(1) = '1' else
'1';
end architecture A1 ;Descripción mediante comparación en representación binaria
De la tabla de verdad 1, puede observarse que la salida será igual a uno, si el código de la combinación es menor o igual a 5. El código de la combinación es el valor de las señales si se considera en representación binaria.
Se entrará en detalle más adelante, pero un std_logic_vector puede considerarse como un expresión en representación binaria si se considera como un tipo de dato UNSIGNED. Este tipo de dato está definido en la librería IEEE.numeric_std, por lo que debe incorporase al código. De esta manera, la salida es igual a 1 si UNSIGNED(IN_WEB(3 downto 0) <= 5.
El código que describe el circuito de la tabla de verdad 1, podría realizarse de la siguiente manera:
library IEEE;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity comparator is
port (
IN_WEB : in std_logic_vector(3 downto 0);
OUT_WEB : out std_logic_vector(7 downto 0)
);
end entity comparator;
architecture A1 of comparator is
begin
OUT_WEB(0) <= '1' when UNSIGNED(IN_WEB(3 downto 0)) <= 5 else
'0';
end architecture A1 ;Puede observarse que la realización de un comparador de esta manera es muy fácil de modificar si se desea comparar con otro número como 4, 6, 7. Sin embargo, si la función es uno para valores que no están en un rango específico de sus código, entonces podría resultar más simple alguna de las alternativas anteriores.
Conclusión
En este laboratorio se propusieron algunas de las alternativas para la descripción del circuito combinacional de la tabla de verdad 1. Puede observarse que, si bien todas las alternativas implementan la misma función (la de la tabla de verdad 1), alguna puede resultar más conveniente al momento de modificar o de comprender su código.
Es importante comprender que existen diversas maneras de describir un hardware en VHDL y que el sintetizador (Quartus Prime en nuestro caso), implementará el mismo hardware en el dispositivo FPGA luego de aplicar criterios para la implementación más eficiente. Queda en el diseñador determinar la descripción que resulte más conveniente por motivos de documentación y mantenimiento del código.