DecodificadorPráctica 5: ComparadorSumador
 
Qué es un comparadorUn comparador es un dispositivo lógico que recibe dos números a la entrada, A y B, y a la salida indica si el número A es mayor, menor o igual que el número B. La longitud de las palabras de la entrada es indiferente, pero iguales para ambos números. Pueden llevar además entradas en cascada, usadas para utilizar varios comparadores.

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 comparadores van desde el más sencillo hasta el más complejo posible. Se puede ver claramente en este ejemplo, las mejoras  de VHDL frente a los MSI.

Entidad 1

Comparador de dos bits

Arquitectura 1

Comparador de dos bits

Entidad 2

Comparador de cuatro bits con entrada en cascada

Arquitectura 2

Comparador de cuatro bits con entrada en cascada
Pulsa aquí para simular los ejemplos construidos.

 

 

 

Entidad 1: Comparador de dos bits Ir al principio de esta página

Este comparador de dos bits es realmente uno de los más sencillos de crear, ya que sólo necesitamos dos entradas para los dos números (de dos bits cada uno) y tres salidas, que se activarán según el resultado de la activación. Como ya dijimos en la práctica del codificador, usaremos el tipo std_logic_vector, que es el más usado y el que más juego nos da.

library ieee;
use ieee.std_logic_1164.all;
entity compara is port(
a,b: in std_logic_vector(1 downto 0);
mayor: out std_logic;
menor: out std_logic;
igual: out std_logic
);
end
compara;
Necesitamos dos entradas de dos bits (a y b) y tres salidas de un bit cada uno (mayor, menor e igual).

 

 

 

 

 

 

 

 

Arquitectura 1: Comparador de dos bits Ir al principio de esta página

Para hacer la comparación de dos números con VHDL podemos usar varias formas o métodos. A continuación describimos algunos de ellas.

Este primer método es un ejemplo de qué no debemos hacer, no porque esté incorrecto, sino porque no aprovecha la potencia de VHDL, es complicado de entender y seguir, y por ser un programa demasiado largo para solamente indicar si el número a es mayor, menor o igual que el b.

1
2
3
4
5 Si los dos bits coinciden entonces "igual" vale '1' y las demás salidas valen '0'.
6
7
8 Si no se cumple lo anterior y si el primer bit de a es '1' y el de b es '0', entonces mayor vale '1' y las demás salidas valen '0'.
9
10
11Si no se cumple lo anterior y si el primer bit de b es '1' y el de a es '0', entonces menor vale '1' y las demás salidas valen '0'.
12
13
14
Si no se cumple lo anterior y si el segundo bit de a es '1' y el de b es '0', entonces mayor vale '1' y las demás salidas valen '0'.
15
16
17
Si no se cumple lo anterior y si el segundo bit de b es '1' y el de a es '0', entonces menor vale '1' y las demás salidas valen '0'.
18
19
20
21
22
architecture archicompara of compara is
begin
process (a,b)
begin
if (a(1) = b(1)) and (a(0) = b(0)) then mayor <= '0';
                                       menor <= '0';
                                       igual <= '1';
elsif (a(1) = '1') and (b(1) = '0') then mayor <= '1';
                                        menor <= '0';
                                        igual <= '0';
elsif (a(1) = '0') and (b(1) = '1') then mayor <= '0';
                                        menor <= '1';
                                        igual <= '0';
elsif (a(0) = '1') and (b(0) = '0') then mayor <= '1';
                                        menor <= '0';
                                        igual <= '0';
elsif (a(0) = '0') and (b(0) = '1') then mayor <= '0';
                                        menor <= '1';
                                        igual <= '0';
end if;
end process;
end
archicompara;

 

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

 

El siguiente diseño ya es mucho más aceptable y utiliza toda la potencia de VHDL para dar un resultado preciso. Para esto utiliza la librería ieee (que la utilizaremos siempre que haya que usar una función especial), la cual contiene al paquete std_arith que nos permite hacer operaciones tales como comparaciones o sumas, restas, ... Ya que hay que cargar este paquete, escribiremos de nuevo la entidad con la llamada al mismo.

library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
entity compara is port(
a,b: in std_logic_vector(1 downto 0);
mayor: out std_logic;
menor: out std_logic;
igual: out std_logic
);
end
compara;

Y esta sería la arquitectura correspondiente:

1
2
3
4
5 Si a es mayor que b, entonces mayor vale '1' y el resto vale '0'. Esto se puede hacer por haber cargado el paquete std_arith
6
7
8 Si a es menor que b, entonces menor vale '1' y el resto vale '0'. Esto se puede hacer por haber cargado el paquete std_arith
9
10
11Si a es igual a b, entonces igual vale '1' y el resto vale '0'. Esto se puede hacer por haber cargado el paquete std_arith
12
13
14
15
16
architecture archicompara of compara is
begin
process (a,b)
begin
if a > b then mayor <= '1';
              menor <= '0';
              igual <= '0';
elsif a < b then mayor <= '0';
                 menor <= '1';
                 igual <= '0';
elsif a = b then mayor <= '0';
                 menor <= '0';
                 igual <= '1';
end if;
end process;
end
archicompara;

Esta estrucuta es mucho más sencilla de crear y de comprender en un posterior análisis por una persona distinta a la que escribió el código.

 

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

 

 

Entidad 2: Comparador de cuatro bits con entrada en cascada Ir al principio de esta página

Este comparador de cuatro bits se corresponde con el 74LS85 de la familia TTL, ya que cuenta con entrada en cascada, que se usa para comparar números de más de cuatro bits. Esto está anticuado con VHDL ya que cambiando cuatro parámetros en el programa, un comparador de cuatro se convierte en un comparador de ocho o de 16 bits. Necesitamos dos entradas para los números de cuatro bits cada una y tres para la cascada de entrada, y tres de salida para la cascada de salida. Usaremos otra vez el paquete std_arith por lo que la declararemos adecuadamente en la entidad.

library ieee;
use ieee.std_logic_1164.all;
entity compara is port(
a,b: in std_logic_vector(1 downto 0);
antes_mayor: in std_logic;
antes_menor: in std_logic;
antes_igual: in std_logic
mayor: out std_logic;
menor: out std_logic;
igual: out std_logic
);
end
compara;
Necesitamos dos entradas de cuatro bits (a y b), tres entradas de un bit para la entrada en cascada (antes_mayor, antes_menor y antes_igual) y tres salidas de un bit cada uno (mayor, menor e igual).

 

 

 

 

 

Arquitectura 1: Comparador de cuatro bits con entrada en cascada Ir al principio de esta página

Ahora para realizar esta arquitectura tendremos que tener en cuenta que debemos dar prioridad a la entrada en cascada, ya que proviene siempre de un módulo que compara bits de mayor peso, por lo que sólo deberemos comparar realmente cuando la entrada en cascada antes_igual esté activada.

1
2
3
4
5 Si el comaprador anterior nos dice que ya ha decidido y que el número no es igual, entonces, las salidas de cascada se corresponden con las entradas en cascada.
6
7
8 Si el bloque anterior nos dice que es igual, entonces comparamos los números igual que en el ejemplo anterior.
9 Este if lleva anidado otro if
10
11
12
13
14
15
16
17
18
Cerramos primero el último if abierto
19
Después cerramos el primer if abierto
20
21
architecture archicompara of compara is
begin
process (a,b,antes_igual,antes_mayor,antes_menor)
begin
if antes_igual = '0' then igual <= antes_igual;
                          mayor <= antes_mayor;
                          menor <= antes_menor;
elsif antes_igual = '1' then
  if a > b then mayor <= '1';
                menor <= '0';
                igual <= '0';
  elsif a < b then mayor <= '0';
                   menor <= '1';
                   igual <= '0';
  elsif a = b then mayor <= '0';
                   menor <= '0';
                   igual <= '1';
  end if;
end if;
end process;
end
archicompara;

En esta ocasión hemos usado parte del código del ejemplo anterior para comparar cuatro bits en cascada. Esta es otra de las ventajas de VHDL; su modularidad permite el usar otras aplicaciones ya creadas.

 

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 decodificadorPrincipio de ésta páginaPráctica siguiente: el cuádruple sumador total