1 |
4 |
divadnauj |
-- multiplicador Ripple Carry.
|
2 |
|
|
|
3 |
|
|
Library IEEE;
|
4 |
|
|
use ieee.std_logic_1164.all;
|
5 |
|
|
use ieee.numeric_std.all;
|
6 |
|
|
|
7 |
|
|
entity multFP is
|
8 |
|
|
port(
|
9 |
|
|
entrada_x, entrada_y: in std_logic_vector(31 downto 0);
|
10 |
|
|
salida: out std_logic_vector(31 downto 0);
|
11 |
|
|
underflow, overflow :out std_logic
|
12 |
|
|
);
|
13 |
|
|
end multFP;
|
14 |
|
|
|
15 |
|
|
architecture ar of multFP is
|
16 |
|
|
type desplazar is array(0 to 47) of std_logic_vector(47 downto 0);
|
17 |
|
|
signal mantisa_finalex :desplazar :=(others=>(others=>'0'));
|
18 |
|
|
signal mantisa1_n,mantisa2_n :std_logic_vector(23 downto 0);
|
19 |
|
|
signal mantisa_final :std_logic_vector(47 downto 0);
|
20 |
|
|
signal mantisa_real :std_logic_vector(22 downto 0);
|
21 |
|
|
signal resultado :std_logic_vector(31 downto 0);
|
22 |
|
|
signal exponente_final :std_logic_vector(9 downto 0);
|
23 |
|
|
signal exponentex,exponentey :std_logic_vector(9 downto 0);
|
24 |
|
|
signal sunderflow, soverflow :std_logic;
|
25 |
|
|
begin
|
26 |
|
|
-- Se suman exponentes:
|
27 |
|
|
--exponente_final(7 downto 0) contiene el exponente listo.
|
28 |
|
|
mantisa1_n <= '1' & entrada_x(22 downto 0); -- inclusion de 1 en el bit mas significativo para multiplicacion.
|
29 |
|
|
mantisa2_n <= '1' & entrada_y(22 downto 0);
|
30 |
|
|
exponentex <= "00"& entrada_x(30 downto 23);
|
31 |
|
|
exponentey <= "00"& entrada_y(30 downto 23);
|
32 |
|
|
-- operacion sobre la mantisa.
|
33 |
|
|
mantisa_final<=std_logic_vector(unsigned(mantisa1_n)*unsigned(mantisa2_n));
|
34 |
|
|
|
35 |
|
|
|
36 |
|
|
process(entrada_x,entrada_y,resultado,sunderflow,soverflow)
|
37 |
|
|
begin
|
38 |
|
|
if unsigned(entrada_x) = X"00000000" or unsigned(entrada_y) = X"00000000" or unsigned(entrada_x) = X"80000000" or unsigned(entrada_y) = X"80000000" then -- no se realiza la operacion, uno de los operandos es cero por lo tanto la respuesta es cero.
|
39 |
|
|
salida <= (others=>'0');
|
40 |
|
|
underflow <='0';
|
41 |
|
|
overflow <= '0';
|
42 |
|
|
else -- se realiza la operacion.
|
43 |
|
|
underflow<=sunderflow;
|
44 |
|
|
overflow<= soverflow;
|
45 |
|
|
salida <= resultado;
|
46 |
|
|
salida(31)<= (entrada_x(31) xor entrada_y(31)); -- asignacion de signo al resultado.
|
47 |
|
|
end if;
|
48 |
|
|
end process;
|
49 |
|
|
|
50 |
|
|
process(mantisa_final,exponentex,exponentey)
|
51 |
|
|
begin
|
52 |
|
|
if(mantisa_final(47)='1') then
|
53 |
|
|
exponente_final <= std_logic_vector((unsigned(exponentex) + unsigned(exponentey)) - 126);
|
54 |
|
|
else
|
55 |
|
|
exponente_final <= std_logic_vector((unsigned(exponentex) + unsigned(exponentey)) - 127);
|
56 |
|
|
end if;
|
57 |
|
|
end process;
|
58 |
|
|
|
59 |
|
|
process(exponente_final,mantisa_real)
|
60 |
|
|
begin
|
61 |
|
|
if signed(exponente_final) > 255 then -- finaliza la operacion si hay overflow.
|
62 |
|
|
soverflow<='1';
|
63 |
|
|
sunderflow<='0';
|
64 |
|
|
resultado <= (others=>'0');
|
65 |
|
|
elsif signed(exponente_final) < 0 then -- finaliza la operacion si hay underflow.
|
66 |
|
|
sunderflow<='1';
|
67 |
|
|
soverflow<='0';
|
68 |
|
|
resultado <= (others=>'0');
|
69 |
|
|
else -- continue con la operacion.
|
70 |
|
|
sunderflow<='0';
|
71 |
|
|
soverflow<='0';
|
72 |
|
|
-- asignacion final del resultado.
|
73 |
|
|
resultado(22 downto 0) <= mantisa_real; -- Mantisa.
|
74 |
|
|
resultado(30 downto 23) <= exponente_final(7 downto 0); -- Exponente.
|
75 |
|
|
end if;
|
76 |
|
|
end process;
|
77 |
|
|
|
78 |
|
|
mantisa_finalex(47) <= mantisa_final;
|
79 |
|
|
NX:for i in 46 downto 0 generate
|
80 |
|
|
mantisa_finalex(i) <= mantisa_finalex(i+1)(46 downto 0) & '0';
|
81 |
|
|
end generate;
|
82 |
|
|
|
83 |
|
|
|
84 |
|
|
process(mantisa_final,mantisa_finalex)
|
85 |
|
|
variable var :integer;
|
86 |
|
|
begin
|
87 |
|
|
var:=0;
|
88 |
|
|
for i in 0 to 47 loop
|
89 |
|
|
if(mantisa_final(i)='1') then
|
90 |
|
|
var:=i;
|
91 |
|
|
end if;
|
92 |
|
|
end loop;
|
93 |
|
|
mantisa_real <= mantisa_finalex(var)(46 downto 24);
|
94 |
|
|
end process;
|
95 |
|
|
|
96 |
|
|
end ar;
|