Você está na página 1de 10

Curso VHDL Sumador/Restador con

operadores aritmticos
Se nota que me gustan los sumadores verdad? En las anteriores entregas hemos armado
sumadores a base de compuertas que se unieron para crear medios sumadores y a partir de
estos sumadores completos. Posteriormente armamos un sumador de un bit a partir de su
ecuacin booleana, que utilizamos para armar un sumador de cuatro bits. En esta entrega
veremos un circuito de suma ms (que tambin resta), pero en esta ocasin haremos uso de
los operadores aritmticos que VHDL pone a nuestra disposicin. Sin ms introduccin,
empecemos con nuestro proyecto.
Creamos un nuevo proyecto en ISE Project Navigator, lo nombramos SumaRestaVHDL,
el mdulo principal ser de tipo HDL.

Ahora, agregamos un nuevo fuente, ya sea con el botn a la izquierda de la ventana Design
o mediante el men que aparece tras hacer clic derecho sobre el nombre de nuestro
proyecto, el mdulo ser de tipo VHDL y por nombre le pondremos SumaResta:

Nuestro sumador/restador ser de 4 bits, por lo que tiene dos entradas de 4 bits y una salida
tambin de 4 bits, en VHDL podemos declarar puertos de varios bits a los que se
denominan buses, el asistente para agregar un nuevo archivo fuente nos permite indicar los
puertos que son buses de esta forma:

Marcamos la casilla en la columna Bus para indicar que el puerto es un bus, adems, el
nmero de bits del bus lo indicamos mediante un par de nmeros en las columnas MSB
(Most Significant Bit bit ms significativo) y LSB (Least Significant Bit bit menos
significativo), esto es, el nmero de bit que corresponde a los bits ms y menos
significativos. Recordemos, en electrnica digital los buses, registros o dems elementos
compuestos por ms de un bit generalmente se numeran del bit ms a la derecha (el menos
significativo) hacia la izquierda iniciando en cero, por ejemplo, un elemento de cuatro bits
podra ser:
# bit
Valor

3
X

2
X

1
X

0
X

El bit menos significativo es el 0, mientras que el ms signicativo es el bit 3, que son los
que indicamos en el asistente para nuestro nuevo mdulo. En cuanto terminemos de agregar
el mdulo usando el asistente veremos cmo se declara un bus en cdigo VHDL.

Quiz alguien se haya preguntado para qu se utilizar la entrada denominada Sel.


Recordemos que nuestro mdulo debe sumar y restar, pero solo puede realizar una
operacin a la vez (solo tiene una salida), as que cmo le indicamos si debe sumar o restar
las entradas? La entrada Sel nos permitir seleccionar la operacin a realizar, si su valor es
1, la salida corresponder a la resta (A B), mientras que, cuando Sel tenga un valor de 0,
la salida corresponder a la suma (A + B), una vez aclarada la funcin de la entrada Sel
finalicemos con el asistente y pongamos atencin a la sintaxis para declarar un bus en
VHDL:
A : in std_logic_vector( 3 downto 0 );

La diferencia contra las declaraciones que hasta el momento habamos utilizado (puertos de
1 bit), es la utilizacin del tipo STD_LOGIC_VECTOR en lugar de STD_LOGIC,
seguido de la indicacin de los bits ms y menos significativos indicados entre parntesis
(separados por la instruccin downto. VHDL nos permite numerar los bits de un bus del
modo que nosotros deseemos, ya sea empezando por el menos significativo y aumentando
hacia el ms significativo o al revs, que el ms significativo sea el bit 0 por ejemplo y el
menos significativo el bit nmero 3 (para el caso de un bus de cuatro bits), para lo que se
usara la instruccin to en lugar de downto, o incluso empezar a numerar de un valor
mayor a 0, a continuacin pondremos algunos ejemplos de declaraciones de un puerto de
cuatro bits:
puerto1
puerto2
puerto3
puerto4

:
:
:
:

in
in
in
in

std_logic_vector(
std_logic_vector(
std_logic_vector(
std_logic_vector(

3 downto 0 );
0 to 3 );
1 to 4 );
10 downto 7 );

Todas las instrucciones anteriores declaran puertos de entrada de cuatro bits, la diferencia
estriba en la manera en la que podremos acceder a los bits individuales de cada uno de
ellos, por ejemplo, para acceder al bit ms significativo de puerto1 usaramos:
puerto1(3);

mientras que para acceder al bit ms significativo de puerto3 tendramos que usar:
puerto3(1);

Pero como mencionamos, en electrnica digital generalmente se numera a partir de cero y


empezando por el bit menos significativo, as que esa ser la forma como trabajaremos las
declaraciones de buses en este curso.
Continuemos ahora con el cdigo de nuestro mdulo SumaResta, tenemos que cuando la
entrada Sel tenga un valor de 0 a la salida enviaremos el resultado de la suma de las
entradas A y B, y cuando valga 1 enviaremos el resultado de la resta A B. En los lenguajes
de programacin de PC podemos ejecutar una u otra porcin de cdigo dependiendo del
resultado de la evaluacin de una expresin empleando la sentencia if, en VHDL tambin
existe dicha instruccin, pero solo puede utilizarse dentro de un bloque de proceso, los

cuales veremos hasta la prxima entrega, as que por ahora no los usaremos ;). VHDL nos
proporciona otra instruccin que consigue un efecto similar y que puede emplearse fuera de
un proceso, se trata de la sentencia when-else, cuya sintaxis es la siguiente:
SALIDA <= (RESULTADO) when selector=VALOR else (OTRORESULTADO);

RESULTADO se encuentra entre parntesis porque peude ser un valor constante o el


resultado de una operacin. Utilizando la sentencia when-else para asignar a la salida de
nuestro mdulo la suma o resta de las entradas A y B segn el valor de la entrada Sel
tendramos lo siguiente en nuestro cdigo:
Salida <= ( A - B ) when Sel = '1' else ( A + B );

Esto es, asigna a Salida el resultado de la operacin (A B) cuando Sel valga 1 (ntese
que un valor de un bit va entre comillas simples), para otros valores de Sel asigna a la
salida el resultado de la operacin (A + B).
El cdigo completo quedara similar a este:
---------------------------------------------------------------------------------- Mdulo sumador y restador de 4 bits
-- Mexchip - Tutorial VHDL
-- Diciembre 2011
--------------------------------------------------------------------------------library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity SumaResta is
port (
A : in STD_LOGIC_VECTOR (3 downto 0);
B : in STD_LOGIC_VECTOR (3 downto 0);
Sel : in STD_LOGIC;
Salida : out STD_LOGIC_VECTOR (3 downto 0)
);
end SumaResta;
architecture Behavioral of SumaResta is
begin
Salida <= ( A - B ) when Sel = '1' else ( A + B );
end Behavioral;

Ahora si, guardemos el mdulo, revisamos sintaxis y Error!

Qu ocurri? Veamos los mensajes de error que nos arroj Project Navigator:

ERROR:HDLParsers:808 - "E:/.../SumaResta.vhd" Line 22. - can not have


such operands in this context.
ERROR:HDLParsers:808 - "E:/.../SumaResta.vhd" Line 22. + can not have
such operands in this context.

Nos indica que ambos problemas se encuentran en la lnea 22, indicando que no podemos
tener operadores o + en tal contexto, la lnea 22 de nuestro cdigo:
Salida <= ( A - B ) when Sel = '1' else ( A + B );

Peri si seguimos la sintaxis indicada para la sentencia when-else, cul es el problema? El


problema es que los operadores de suma y resta no se encuentran definidos por defecto en
VHDL, sino que son parte de una biblioteca adicional, la biblioteca
STD_LOGIC_UNSIGNED (para valores sin signo, tambin existe la biblioteca
STD_LOGIC_SIGNED que utiliza valores con signo), la cual debemos incluir para poder
utilizar estos operadores, entonces, incluymosla:
---------------------------------------------------------------------------------- Mdulo sumador y restador de 4 bits
-- Mexchip - Tutorial VHDL
-- Diciembre 2011
--------------------------------------------------------------------------------library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity SumaResta is
port (
A : in STD_LOGIC_VECTOR (3 downto 0);
B : in STD_LOGIC_VECTOR (3 downto 0);
Sel : in STD_LOGIC;
Salida : out STD_LOGIC_VECTOR (3 downto 0)
);
end SumaResta;
architecture Behavioral of SumaResta is
begin
Salida <= ( A - B ) when Sel = '1' else ( A + B );
end Behavioral;

Revisamos sintaxis y en esta ocasin todo est correcto.

Muy bien, entonces procedamos a simular nuestro diseo, vamos a la vista Simulation en
la ventana Design y hacemos doble clic sobre el proceso Simulate Behavioral Model:

Ahora tendremos abierto ISim:

Si observamos, los puertos que son buses en nuestro diseo tienen entre corchetes los
nmeros de los bits MSB y LSB, adems, a la izquierda tienen una flecha, si hacemos clic
sobre ella podremos ver desplegados en la ventana de formas de onda cada uno de los bits
que componen el bus:

Ejecutemos ahora una primera simulacin, sumaremos los valores 5 (entrada A) y 3


(entrada B), habr tambin que indicar un valor de 0 para la entrada Sel. Utilizaremos la
funcin Force Constant, primero haremos clic derecho sobre el nombre de la seal
a[3:0] y seleccionaremos Force Constant del men desplegable:

En la ventana que aparece indicaremos el valor en el campo Force to Value:, debemos


indicar un valor que corresponda al formato indicada en el campo Value Radix, que en este
caso es Binary, que nos indica valores binarios:

Pero tambin podemos indicar valores en formato decimal si cambiamos el campo Value
Radix a Unsigned Decimal (tambin existe la opcin Signed Decimal):

Repitamos la operacin para las entradas B (0011 3) y Sel (0):

Ahora si, hacemos clic en el botn Run for the time specified on the toolbar y tendremos:

Como podemos observar, la salida tiene el valor binario 1000 que corresponde con la suma
que esperbamos (5+3), tambin podemos cambiar el formato con el que se visualizan los
valores en la ventana de formas de onda haciendo clic derecho sobre el nombre del puerto
que deseamos modificar, luego vamos al men Radix y seleccionamos el deseado, por
ejemplo Unsigned Decimal:

As, si modificamos el formato para los tres buses (A, B y Salida) a Unsigned Decimal
nuestra ventana de simulacin se vera as:

Ahora puede ser ms fcil observar los resultados (sobre todo cuando los buses sean de ms
bits).
Muy bien, hagamos otra simulacin, ahora modifiquemos el valor de la entrada Sel a 1:

Con lo que esperaramos que ahora el resultado fuera la resta de A B:

Al parecer, nuestro mdulo funciona correctamente, como ejercicio pueden realizar algunas
otras operaciones para asegurarse de que as sea, aqu nosotros continuaremos con la
implementacin en una tarjeta Nexys 2, la asignacin de pines la hemos hecho de esta
forma:
# Pines de la tarjeta Nexys 2
# para sumador/restador de 4 bits
NET "Sel" LOC = H13;
NET "A<3>" LOC = R17;
NET "A<2>" LOC = N17;
NET "A<1>" LOC = L13;
NET "A<0>" LOC = L14;
NET "B<3>" LOC = K17;
NET "B<2>" LOC = K18;
NET "B<1>" LOC = H18;
NET "B<0>" LOC = G18;
NET "Salida<3>" LOC = K14;
NET "Salida<2>" LOC = K15;
NET "Salida<1>" LOC = J15;
NET "Salida<0>" LOC = J14;

Y este es un breve video con unas pruebas (5 +/- 3) y ( 8 +/- 1) para observar el
funcionamiento:

Você também pode gostar