Debemos encontrar dada una entrada de 4 bits si un número es primo o no proporcionando una única salida que valga 1 si el número es primo o 0 en el caso contrario.
Resolver este problema es mucho más sencillo que el sumador realizado en el capítulo pasado, ya que ya sabemos lo fácil que puede ser integrar circuitos complejos simplemente describiendo como queremos que funcione en un HDL. Pero por última vez antes de llegar al código me gustaría explicar la expresión booleana que le daría solución en sus 8 diferentes formas de representación y a su vez ver como los mapas de Karnaugh dan soluciones simplificadas sin mucho esfuerzo.
Podemos comenzar dibujando la tabla de verdad del circuito que deseamos.
Con esto hecho podemos determinar la expresión canónica de la suma de productos de esta tabla incluyendo todos los términos donde la salida sea igual a 1.
Es obvio que esta expresión se puede simplificar y entonces nos quedamos con:
En el esquemático de este circuito nos damos cuenta que se compone de una primer estapa de AND's y una segunda de OR's, a esta simplificación se le llama "AND-OR" y es solo una de las 8 diferentes formas de representar una misma ecuación lógica con dos etapas de compuertas.
Podemos encontrar otra forma de representar esta expresión si la negamos dos veces ya que como sabemos negar dos veces una expresión booleana nos da la expresión booleana original.
Aplicando la ley de De Morgan podemos obtener una equivalencia usando solo compuertas NAND, a esta forma de simplificar expresiones se le llama "NAND-NAND".
Esta expresión se puede visualizar en el siguiente circuito.
Si volvemos a aplicar la ley de De Morgan a cada término llegamos a la siguiente expresión, a esta se le conoce como "OR-NAND".
Su esquemático se vería como sigue:
Si repetimos el proceso una vez más llegamos a la expresión "NOR-OR" y al esquemático de la figura 11.
Si volvemos a aplicar la ley de De Morgan volvemos a la expresión original, de esa forma a partir de una suma de productos (AND OR) podemos obtener tres diferentes formas más.
Podemos hacer lo mismo partiendo de un producto de sumas que se consigue regresando a la tabla de verdad y generar términos en base a los resultados que son iguales a 0, la expresión que nos queda se le conoce como "OR AND" y su esquemático se puede ver en la figura 13.
De la misma forma que llegamos a las 3 ecuaciones derivadas de la suma de productos podemos encontrar otras 3 derivadas del producto de sumas, a continuación se mostrarán todas las ecuaciones y su esquemático correspondiente.
Tener que generar y simplificar ecuaciones booleanas no es una tarea muy agradable y es muy propensa a errores humanos, por ello existe otro método que nos permite identificar grupos de bits que solo varían en 1 bit y comparten una variable en común para encontrar de forma muy sencilla una expresión simplificada que satisfaga los requerimentos de una tabla de verdad, a estas entidades se les llama "mapas de Karnaugh" y consisten en usar el código gray para reordenar los elementos de una tabla de verdad en un espacio bidimensional e identificar grupos de 2 a la n números que pueden ser expresados por pocas variables.
A continuación se presenta la obtención de una suma de productos y un producto de sumas simplificados usando mapas de Karnaugh.
Es evidente que con los mapas de Karnaugh podemos obtener ecuaciones simplificadas sin mucho problema en cualquiera de sus dos formas (POS y SOP), pero aún existe una forma más sencilla de reproducir la detección de números primos y es usando Lenguajes Descriptores de Hardware, a continuación se presentan ejemplos del diseño de este circuito en programación por comportamiento en 3 de los lenguajes más populares de la industria.
Implementación de Detector de Primos en AHDL.
SUBDESIGN Primos(
A[3..0] : INPUT;
Z : OUTPUT;
)
BEGIN
IF (A[] == 2)#(A[] == 3)#(A[] == 5)#(A[] == 7)#(A[] == 11)#(A[] == 13) THEN
Z = VCC;
ELSE
Z = GND;
END IF;
END;
Implementación de Detector de Primos en VHDL.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY Primos IS
PORT(A : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
Z : OUT STD_LOGIC);
END Primos;
ARCHITECTURE Detector OF Primos IS
BEGIN
PROCESS(A)
BEGIN
IF (A = 2)OR(A = 3)OR(A = 5)OR(A = 7)OR(A = 11)OR(A = 13) THEN
Z <= '1';
ELSE
Z <= '0';
END IF;
END PROCESS;
END Detector;
Implementación de Detector de Primos en Verilog.
module Primos(A, Z);
input [3:0] A;
output reg Z;
always @(A)
begin
if ((A == 2)||(A == 3)||(A == 5)||(A == 7)||(A == 11)||(A == 13))
Z = 1;
else
Z = 0;
end
endmodule