Trabajo Práctico N 3 Aritmética de Computadoras: Universidad Nacional de San Luis
Trabajo Práctico N 3 Aritmética de Computadoras: Universidad Nacional de San Luis
Trabajo Práctico N 3 Aritmética de Computadoras: Universidad Nacional de San Luis
Arquitectura de computadoras
Trabajo Práctico No 3
Aritmética de Computadoras
Alumno
Cortez Médici Emanuel
Profesores Responsables
Ing. Andrés Airabella
Ing. Astrid Andrada
29 de mayo de 2021
1. Realice las siguientes operaciones en binario. Exprese los
resultados obtenidos en formato decimal, asumiendo una
representación en complemento a dos.
1.a. A−B
Desarrollo de la actividad
Para poder realizar la resta, se pasa B a un complemento a 2. Para ello, se cambian
los unos por ceros y viceversa y al resultado se le suma 1.
11101010
+ 10100101
1 10001111
Se observa que se produce overflow, es decir necesito más bits para poder representar el
número del resultado, el cual es en este caso es 110001111. El número en formato decimal
es −28 + 27 + 23 + 22 + 21 + 20 = −113
1.b. A∗B
Desarrollo de la actividad
Primero debo obtener el valor absoluto de la multiplicación, y luego en el resultado
final decidir el signo correspondiente. Para ello, transformo A en un número positivo.
A = 11101010 → 00010101 → 00010110
Debido a que A presenta más ceros y A ∗ B = B ∗ A, se presenta la multiplicación de
B ∗ A, permitiendo una resolución más corta.
0 1 0 1 1 0 1 1
* 0 0 0 1 0 1 1 0
0 0 0 0 0 0 0 0
0 1 0 1 1 0 1 1
0 1 0 1 1 0 1 1
0 0 0 0 0 0 0 0
0 1 0 1 1 0 1 1
0 1 1 1 1 1 0 1 0 0 1 0
1
A = 11101010
B = 01011011
Finalmente los números en binarios según la norma IEE 754 quedan conformados de
la siguiente manera:
2
N° a convertir Binario Exponente
0,0254 0
0,051 0 0
N° a convertir Binario Exponente
0,102 0 0
0,500047 0
0,203 0 0
9,4E-05 1 1
0,406 0 0
0,000188 0 0
0,813 0 0
0,000376 0 0
0,626 1 6
0,000752 0 0
0,251 1 0
0,001504 0 0
0,502 0 0
0,003008 0 0
0,005 1 0
0,006016 0 0
0,010 0 0
0,012032 0 0
0,019 0 0
0,024064 0 0
0,038 0 0
0,048128 0 0
0,077 0 0
0,096256 0 0
0,154 0 0
0,192512 0 0
0,307 0 0
0,385024 0 0
0,614 0 0
0,770048 0 0
0,229 1 0
0,540096 1 0
0,458 0 0
0,080192 1 0
0,915 0 0
0,160384 0 0
0,830 1 0
0,320768 0 0
0,661 1 0
0,641536 0 0
0,322 1 0
0,283072 1 0
0,643 0 0
0,566144 0 0
0,286 1 0
0,132288 1 0
0,573 0 0
0,264576 0 0
0,146 1 0
0,529152 0 0
0,291 0 0
Mantisa 00000000000001100010100
0,582 0 0
0,165 1 0
Mantisa 10100000001001110101001
Cuadro 1: Cálculo de la mantisa y obtención del exponente.
3
3. Convertir los siguientes números escritos en binario de
punto flotante a decimal.
10101111 01011101 11011100 00000000
00001111 11011000 10110000 00011000
Desarrollo de la actividad
Se procede a identificar las partes de los números previamente mencionados. Esto se
muestra en la tabla
La mantisa se obtiene sumando cada dígito del número ponderado desde 2−1 hasta
2−23 . Se obtiene así los valores:
B = −0, 97123
4
4.a. A/B
Se analiza primeramente el exponente de ambos números para obtener el exponente
que tendrá el resultado. Se obtiene que el exponente del resultado será igual a 10.
01111110 → 10000010
10001000 + 10000010 = 00001010
00001010 → 10
M antisaA 100011001001011011111001
= = 0100011001001011011111001
M antisaB 111110001010001010000111
Con dicha mantisa se define una nueva mantisa para el resultado, junto con un despla-
zamiento del exponente. Esto es:
MN = 1,000110010010110111110010
expN = 127 + 10 + (−1) = 136 → 10001000
El signo se determina haciendo un xor entre los signos de los dividendos. En este caso
el signo es 1. Luego el resultado de la división queda conformado en la tabla 3
4.b. A−B
Debido a que B es de signo negativo, en realidad se puede realizar una suma entre las
mantisas. Se tiene que el resultado tendrá un exponente de 10, esto se averigua al realizar
la resta entre los exponentes de ambos números como se hizo previamente. Se procede a
normalizar la mantisa de menor valor para poder realizar una suma entre los números.
Teniendo en cuenta que B es diez veces menor que A, se corre B 10 lugares, y se toman
los bits más significativos.
A = 100011001001011011111001
B = 000000000011111000101000 | 1010000111
Resultado = 100011001101010100100001
5
Número Signo Exponente Mantisa
A 562,359 0 10001000 00011001001011011111001
B −0,97123 1 01111110 11110001010001010000111
Resultado 563,33023 0 10001000 00011001101010100100001
Cuadro 4: Resultado de la resta
4.c. A∗B
Se realiza la suma entre los exponentes, restando el bias correspondiente para obtener
el exponente del resultado:
ExponenteA − 127 + ExponenteB − 127 = 9 + (−1) = 8
Por lo tanto, el exponente con bias será: 8 + 127 = 135
Se multiplican las mantisas, obteniendo así el resultado.
MA ∗ MB = 0100010001000101110000010 = 1,00010001000101110000010 + 21
expN = 8 + 1 + 127 = 136 → 10001000
6
l i b r a r y IEEE ;
use IEEE .STD_LOGIC_1164.ALL;
use IEEE .NUMERIC_STD.ALL;
entity m u l t i p l i c a d o r i s
Port (
m u l t i p l i c a n d o : in STD_LOGIC_VECTOR ( 7 downto 0 ) ;
m u l t i p l i c a d o : in STD_LOGIC_VECTOR ( 7 downto 0 ) ;
s a l i d a : out STD_LOGIC_VECTOR ( 1 5 downto 0 )
);
end m u l t i p l i c a d o r ;
architecture B e h a v i o r a l of m u l t i p l i c a d o r i s
begin
process ( m u l t i p l i c a d o , m u l t i p l i c a n d o )
variable i : integer range 0 to 7 ;
variable A: STD_LOGIC_VECTOR ( 1 5 downto 0 ) ;
variable B : STD_LOGIC_VECTOR ( 7 downto 0 ) ;
variable aux : STD_LOGIC_VECTOR ( 1 5 downto 0 ) ;
begin
A( 7 downto 0 ) := STD_LOGIC_VECTOR( signed ( m u l t i p l i c a n d o ) ) ;
A( 1 5 downto 8 ) := " 00000000 " ;
B := STD_LOGIC_VECTOR( signed ( m u l t i p l i c a d o ) ) ;
aux := " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " ;
i f (A( 7 )=' 1 ' ) then
f o r i in 0 to 7 loop
i f (A( i )=' 1 ' ) then
A( i ) := ' 0 ' ;
else
A( i ) := ' 1 ' ;
end i f ;
end loop ;
A := STD_LOGIC_VECTOR( signed (A) +1) ;
end i f ;
i f (B( 7 )=' 1 ' ) then
f o r i in 0 to 7 loop
i f (B( i )=' 1 ' ) then
B( i ) := ' 0 ' ;
else
B( i ) := ' 1 ' ;
end i f ;
end loop ;
B := STD_LOGIC_VECTOR( signed (B) +1) ;
end i f ;
f o r i in 0 to 7 loop
i f (B( 0 ) = ' 1 ' ) then
aux := STD_LOGIC_VECTOR( signed (A)+signed ( aux ) ) ;
A := STD_LOGIC_VECTOR( s h i f t _ l e f t ( signed (A) , 1 ) ) ;
else
A := STD_LOGIC_VECTOR( s h i f t _ l e f t ( signed (A) , 1 ) ) ;
end i f ;
B :=STD_LOGIC_VECTOR( s h i f t _ r i g h t ( signed (B) , 1 ) ) ;
end loop ;
i f ( ( m u l t i p l i c a n d o ( 7 ) xor m u l t i p l i c a d o ( 7 ) ) = ' 1 ' ) then
f o r i in 0 to 15 loop
i f ( aux ( i )=' 1 ' ) then
aux ( i ) := ' 0 ' ;
else
aux ( i ) := ' 1 ' ;
end i f ;
end loop ;
end i f ;
aux := STD_LOGIC_VECTOR( signed ( aux ) +1) ;
s a l i d a <= STD_LOGIC_VECTOR( signed ( aux ) ) ;
end process ;
end B e h a v i o r a l ;
7
5.a. Verificar el funcionamiento de cada multiplicador mediante la ope-
ración del punto 1.b
Se procede a realizar el siguiente testbench en VHDL.
LIBRARY i e e e ;
USE i e e e . std_logic_1164 .ALL;
USE i e e e . numeric_std .ALL;
ENTITY t e s t B IS
END t e s t B ;
ARCHITECTURE b e h a v i o r OF t e s t B IS
COMPONENT m u l t i p l i c a d o r
PORT(
m u l t i p l i c a n d o : IN std_logic_vector ( 7 downto 0 ) ;
m u l t i p l i c a d o : IN std_logic_vector ( 7 downto 0 ) ;
s a l i d a : OUT std_logic_vector ( 1 5 downto 0 )
);
END COMPONENT;
−−I n p u t s
s i g n a l m u l t i p l i c a n d o : std_logic_vector ( 7 downto 0 ) := ( others => ' 0 ' ) ;
s i g n a l m u l t i p l i c a d o : std_logic_vector ( 7 downto 0 ) := ( others => ' 0 ' ) ;
−−Outputs
s i g n a l s a l i d a : std_logic_vector ( 1 5 downto 0 ) ;
−− Clock p e r i o d d e f i n i t i o n s
constant c l k _ p e r i o d : time := 10 ns ;
BEGIN
);
−− S t i m u l u s p r o c e s s
stim_proc : process
begin
multiplicando<= " 11101010 " ;
mult iplicad o<= " 01011011 " ;
wait f o r 50 ns ;
wait ;
end process ;
END;
8
Figura 1: Resultado del testbench para el sistema combinacional.
9
para poder asi estimar el tiempo de ejecución.
10