Line 77... |
Line 77... |
signal sparaminput : vectorblock12;
|
signal sparaminput : vectorblock12;
|
--!TBXSTART:FACTORS_N_ADDENDS
|
--!TBXSTART:FACTORS_N_ADDENDS
|
signal sfactor : vectorblock12;
|
signal sfactor : vectorblock12;
|
signal ssumando : vectorblock08;
|
signal ssumando : vectorblock08;
|
--!TBXEND
|
--!TBXEND
|
|
|
|
|
|
--!TBXSTART:ARITHMETIC_RESULTS
|
signal sresult : vectorblock08;
|
signal sresult : vectorblock08;
|
signal sprd32blk : vectorblock06;
|
signal sprd32blk : vectorblock06;
|
signal sadd32blk : vectorblock04;
|
signal sadd32blk : vectorblock04;
|
|
signal ssqr32blk,sinv32blk : xfloat32;
|
|
--!TBXEND
|
|
|
signal snormfifo_q,snormfifo_d : vectorblock03;
|
signal snormfifo_q,snormfifo_d : vectorblock03;
|
signal sdpfifo_q : vectorblock02;
|
signal sdpfifo_q : vectorblock02;
|
signal ssqr32blk,sinv32blk : std_logic_vector(floatwidth-1 downto 0);
|
|
|
|
--!TBXSTART:SYNC_CHAIN
|
--!TBXSTART:SYNC_CHAIN
|
signal ssync_chain : std_logic_vector(28 downto 0);
|
signal ssync_chain : std_logic_vector(28 downto 1);
|
signal ssync_chain_d : std_logic;
|
|
--!TBXEND
|
--!TBXEND
|
signal sres567w,sres123w,sres2w : std_logic;
|
signal sres567w,sres123w,sres2w : std_logic;
|
signal sres0w,sres4w : std_logic;
|
signal sres0w,sres4w : std_logic;
|
signal sres567f,sres123f : std_logic; --! Entradas de la señal de full de las colas de resultados.
|
|
|
--! Entradas de la señal de full de las colas de resultados.
|
|
signal sres567f,sres123f : std_logic;
|
signal sres24f,sres0f : std_logic;
|
signal sres24f,sres0f : std_logic;
|
|
|
|
|
|
|
|
|
begin
|
begin
|
|
|
--! Cadena de sincronización: 29 posiciones.
|
--! Cadena de sincronización: 29 posiciones.
|
ssync_chain(0) <= sync_chain_0;
|
|
sync_chain_proc:
|
sync_chain_proc:
|
process(clk,rst)
|
process(clk,rst,sync_chain_0)
|
begin
|
begin
|
if rst=rstMasterValue then
|
if rst=rstMasterValue then
|
ssync_chain(28 downto 1) <= (others => '0');
|
ssync_chain(28 downto 1) <= (others => '0');
|
elsif clk'event and clk='1' then
|
elsif clk'event and clk='1' then
|
for i in 28 downto 1 loop
|
for i in 28 downto 2 loop
|
ssync_chain(i) <= ssync_chain(i-1);
|
ssync_chain(i) <= ssync_chain(i-1);
|
end loop;
|
end loop;
|
|
ssync_chain(1) <= sync_chain_0;
|
end if;
|
end if;
|
end process sync_chain_proc;
|
end process sync_chain_proc;
|
|
|
--! Escritura en las colas de resultados y escritura/lectura en las colas intermedias mediante cadena de resultados.
|
--! Escritura en las colas de resultados y escritura/lectura en las colas intermedias mediante cadena de resultados.
|
fifo32x09_w <= ssync_chain(5);
|
fifo32x09_w <= ssync_chain(5);
|
fifo32x23_w <= ssync_chain(1);
|
fifo32x23_w <= ssync_chain(1);
|
fifo32x09_r <= ssync_chain(13);
|
fifo32x09_r <= ssync_chain(13);
|
fifo32x23_r <= ssync_chain(24);
|
fifo32x23_r <= ssync_chain(24);
|
sres0w <= ssync_chain(23);
|
|
sres4w <= ssync_chain(22);
|
|
resw <= sres567w&sres4w&sres123w&sres2w&sres0w;
|
resw <= sres567w&sres4w&sres123w&sres2w&sres0w;
|
sync_chain_comb:
|
sync_chain_comb:
|
process (ssync_chain,addsub,crossprod,unary)
|
process (ssync_chain,addsub,crossprod,unary)
|
begin
|
begin
|
if unary='1' then
|
if unary='1' then
|
sres567w <= ssync_chain(28);
|
|
else
|
|
sres567w <= ssync_chain(4);
|
|
end if;
|
|
|
|
if addsub='1' then
|
--!Desconectar los canales de Suma, Resta, Producto Punto y Producto Cruz
|
|
sres123w <= '0';
|
|
sres2w <= '0';
|
|
sres4w <= '0';
|
|
|
|
--! Producto Escalar, Normalización o Magnitusd
|
|
sres567w <= ssync_chain(4) and crossprod and addsub;
|
|
sres0w <= ssync_chain(23) and not(addsub) and not(crossprod);
|
|
|
|
elsif addsub='1' then
|
|
|
|
--! Desconectar los canales de Normalización, Producto Escalar, Producto Punto C.D y Magnitud
|
|
sres567w <= '0';
|
|
sres0w <= '0';
|
|
sres4w <= '0';
|
|
|
|
|
|
--! Suma o Resta.
|
sres123w <= ssync_chain(9);
|
sres123w <= ssync_chain(9);
|
sres2w <= ssync_chain(9);
|
sres2w <= ssync_chain(9);
|
|
|
else
|
else
|
sres123w <= ssync_chain(13);
|
|
if crossprod='1' then
|
--! Desconectar la escritura en los canales de Normalización, Producto Escalar, Suma, Resta y Magnitud.
|
sres2w <= ssync_chain(13);
|
sres567w <= '0';
|
else
|
sres0w <= '0';
|
sres2w <= ssync_chain(22);
|
|
end if;
|
--! Producto Punto o Cruz.
|
|
sres2w <= (ssync_chain(22) and not(crossprod)) or (ssync_chain(13) and crossprod);
|
|
sres4w <= ssync_chain(22) and not(crossprod);
|
|
sres123w <= ssync_chain(13) and crossprod;
|
|
|
end if;
|
end if;
|
end process sync_chain_comb;
|
end process sync_chain_comb;
|
|
|
|
|
--! El siguiente código sirve para conectar arreglos a señales std_logic_1164, simplemente son abstracciones a nivel de código y no representará cambios en la síntesis.
|
--! El siguiente código sirve para conectar arreglos a señales std_logic_1164, simplemente son abstracciones a nivel de código y no representará cambios en la síntesis.
|
Line 214... |
Line 238... |
|
|
|
|
|
|
--! La entrada al inversor SIEMPRE viene con la salida de la raiz cuadrada
|
--! La entrada al inversor SIEMPRE viene con la salida de la raiz cuadrada
|
inv32blki <= sqr32blko;
|
inv32blki <= sqr32blko;
|
--! La entrada de la ra�z cuadrada SIEMPRE viene con la salida del sumador 1.
|
--! La entrada de la raíz cuadrada SIEMPRE viene con la salida del sumador 1.
|
sqr32blki <= sadd32blk(a1);
|
sqr32blki <= sadd32blk(a1);
|
|
|
|
|
|
|
--! Conectar las entradas del sumador a, a la salida
|
--! Conectar las entradas del sumador a, a la salida
|
Line 232... |
Line 256... |
sres567f <= resf_vector(3);
|
sres567f <= resf_vector(3);
|
fullQ:process(sres0f,sres123f,sres24f,sres567f,unary,crossprod,addsub,eoi_int)
|
fullQ:process(sres0f,sres123f,sres24f,sres567f,unary,crossprod,addsub,eoi_int)
|
begin
|
begin
|
if unary='0' then
|
if unary='0' then
|
if crossprod='1' or addsub='1' then
|
if crossprod='1' or addsub='1' then
|
|
--! Suma, Resta o Producto Cruz
|
eoi_demuxed_int <= "00"&eoi_int&'0';
|
eoi_demuxed_int <= "00"&eoi_int&'0';
|
resf_event <= sres123f;
|
resf_event <= sres123f;
|
else
|
else
|
|
--! Producto Punto
|
eoi_demuxed_int <= '0'&eoi_int&"00";
|
eoi_demuxed_int <= '0'&eoi_int&"00";
|
resf_event <= sres24f;
|
resf_event <= sres24f;
|
end if;
|
end if;
|
elsif crossprod='1' or addsub='1' then
|
elsif crossprod='1' then
|
|
|
|
--! Normalización o Producto Escalar
|
eoi_demuxed_int <= eoi_int&"000";
|
eoi_demuxed_int <= eoi_int&"000";
|
resf_event <= sres567f;
|
resf_event <= sres567f;
|
else
|
|
|
elsif addsub='0' then
|
|
|
|
--! Magnitud
|
eoi_demuxed_int <= "000"&eoi_int;
|
eoi_demuxed_int <= "000"&eoi_int;
|
resf_event <= sres0f;
|
resf_event <= sres0f;
|
|
|
|
else
|
|
--! Se debería generar una excepción de señal invalida.
|
|
eoi_demuxed_int <= x"F";
|
|
resf_event <= '0';
|
|
|
end if;
|
end if;
|
end process;
|
end process;
|
|
|
--! Decodificación del Datapath.
|
--! Decodificación del Datapath.
|
mul:process(unary,addsub,crossprod,sparaminput,sinv32blk,sprd32blk,sadd32blk,sdpfifo_q,snormfifo_q)
|
mul:process(unary,addsub,crossprod,sparaminput,sinv32blk,sprd32blk,sadd32blk,sdpfifo_q,snormfifo_q)
|
Line 260... |
Line 297... |
sfactor(f1) <= sparaminput(ax);
|
sfactor(f1) <= sparaminput(ax);
|
sfactor(f2) <= sparaminput(ay);
|
sfactor(f2) <= sparaminput(ay);
|
sfactor(f3) <= sparaminput(ay);
|
sfactor(f3) <= sparaminput(ay);
|
|
|
sfactor(f5) <= sparaminput(az);
|
sfactor(f5) <= sparaminput(az);
|
|
|
|
--!Multiplicación escalar.
|
if crossprod='1' and addsub='1' then
|
if crossprod='1' and addsub='1' then
|
sfactor(f6) <= sparaminput(cx);
|
sfactor(f6) <= sparaminput(cx);
|
sfactor(f7) <= sparaminput(dx);
|
sfactor(f7) <= sparaminput(dx);
|
sfactor(f8) <= sparaminput(cy);
|
sfactor(f8) <= sparaminput(cy);
|
sfactor(f9) <= sparaminput(dx);
|
sfactor(f9) <= sparaminput(dx);
|
Line 301... |
Line 340... |
sfactor(f0) <= sparaminput(ax) ;
|
sfactor(f0) <= sparaminput(ax) ;
|
sfactor(f1) <= sparaminput(bx) ;
|
sfactor(f1) <= sparaminput(bx) ;
|
sfactor(f2) <= sparaminput(ay) ;
|
sfactor(f2) <= sparaminput(ay) ;
|
sfactor(f3) <= sparaminput(by) ;
|
sfactor(f3) <= sparaminput(by) ;
|
sfactor(f5) <= sparaminput(bz) ;
|
sfactor(f5) <= sparaminput(bz) ;
|
|
|
sfactor(f6) <= sparaminput(cx) ;
|
sfactor(f6) <= sparaminput(cx) ;
|
sfactor(f7) <= sparaminput(dx) ;
|
sfactor(f7) <= sparaminput(dx) ;
|
sfactor(f8) <= sparaminput(cy) ;
|
sfactor(f8) <= sparaminput(cy) ;
|
sfactor(f9) <= sparaminput(dy) ;
|
sfactor(f9) <= sparaminput(dy) ;
|
sfactor(f10) <= sparaminput(cz) ;
|
sfactor(f10) <= sparaminput(cz) ;
|