Line 23... |
Line 23... |
library ieee;
|
library ieee;
|
use ieee.std_logic_1164.all;
|
use ieee.std_logic_1164.all;
|
use work.arithpack.all;
|
use work.arithpack.all;
|
|
|
entity dpc is
|
entity dpc is
|
generic (
|
|
width : integer := 32
|
|
--!external_readable_widthad : integer := integer(ceil(log(real(external_readable_blocks),2.0))))
|
|
);
|
|
port (
|
port (
|
clk,rst : in std_logic;
|
clk,rst : in std_logic;
|
paraminput : in std_logic_vector ((12*width)-1 downto 0); --! Vectores A,B,C,D
|
paraminput : in std_logic_vector ((12*floatwidth)-1 downto 0); --! Vectores A,B,C,D
|
prd32blko : in std_logic_vector ((06*width)-1 downto 0); --! Salidas de los 6 multiplicadores.
|
prd32blko : in std_logic_vector ((06*floatwidth)-1 downto 0); --! Salidas de los 6 multiplicadores.
|
add32blko : in std_logic_vector ((04*width)-1 downto 0); --! Salidas de los 4 sumadores.
|
add32blko : in std_logic_vector ((04*floatwidth)-1 downto 0); --! Salidas de los 4 sumadores.
|
sqr32blko,inv32blko : in std_logic_vector (width-1 downto 0); --! Salidas de la raiz cuadradas y el inversor.
|
sqr32blko,inv32blko : in std_logic_vector (floatwidth-1 downto 0); --! Salidas de la raiz cuadradas y el inversor.
|
fifo32x23_q : in std_logic_vector (03*width-1 downto 0); --! Salida de la cola intermedia.
|
fifo32x23_q : in std_logic_vector (03*floatwidth-1 downto 0); --! Salida de la cola intermedia.
|
fifo32x09_q : in std_logic_vector (02*width-1 downto 0); --! Salida de las colas de producto punto.
|
fifo32x09_q : in std_logic_vector (02*floatwidth-1 downto 0); --! Salida de las colas de producto punto.
|
unary,crossprod,addsub : in std_logic; --! Bit con el identificador del bloque AB vs CD e identificador del sub bloque (A/B) o (C/D).
|
unary,crossprod,addsub : in std_logic; --! Bit con el identificador del bloque AB vs CD e identificador del sub bloque (A/B) o (C/D).
|
sync_chain_0 : in std_logic; --! Señal de dato valido que se va por toda la cadena de sincronizacion.
|
sync_chain_0 : in std_logic; --! Señal de dato valido que se va por toda la cadena de sincronizacion.
|
eoi_int : in std_logic; --! Sennal de interrupción de final de instrucción.
|
eoi_int : in std_logic; --! Señal de interrupción de final de instrucción.
|
eoi_demuxed_int : out std_logic_vector (3 downto 0); --! Señal de interrupción de final de instrucción pero esta vez va asociada a la instruccón UCA.
|
eoi_demuxed_int : out std_logic_vector (3 downto 0); --! Señal de interrupción de final de instrucción pero esta vez va asociada a la instruccón UCA.
|
sqr32blki,inv32blki : out std_logic_vector (width-1 downto 0); --! Salidas de las 2 raices cuadradas y los 2 inversores.
|
sqr32blki,inv32blki : out std_logic_vector (floatwidth-1 downto 0); --! Salidas de las 2 raices cuadradas y los 2 inversores.
|
fifo32x26_d : out std_logic_vector (03*width-1 downto 0); --! Entrada a la cola intermedia para la normalización.
|
fifo32x26_d : out std_logic_vector (03*floatwidth-1 downto 0); --! Entrada a la cola intermedia para la normalización.
|
fifo32x09_d : out std_logic_vector (02*width-1 downto 0); --! Entrada a las colas intermedias del producto punto.
|
fifo32x09_d : out std_logic_vector (02*floatwidth-1 downto 0); --! Entrada a las colas intermedias del producto punto.
|
prd32blki : out std_logic_vector ((12*width)-1 downto 0); --! Entrada de los 12 factores en el bloque de multiplicación respectivamente.
|
prd32blki : out std_logic_vector ((12*floatwidth)-1 downto 0); --! Entrada de los 12 factores en el bloque de multiplicación respectivamente.
|
add32blki : out std_logic_vector ((08*width)-1 downto 0); --! Entrada de los 8 sumandos del bloque de 4 sumadores.
|
add32blki : out std_logic_vector ((08*floatwidth)-1 downto 0); --! Entrada de los 8 sumandos del bloque de 4 sumadores.
|
resw : out std_logic_vector (4 downto 0); --! Salidas de escritura y lectura en las colas de resultados.
|
resw : out std_logic_vector (4 downto 0); --! Salidas de escritura y lectura en las colas de resultados.
|
fifo32x09_w : out std_logic;
|
fifo32x09_w : out std_logic;
|
fifo32x23_w,fifo32x09_r : out std_logic;
|
fifo32x23_w,fifo32x09_r : out std_logic;
|
fifo32x23_r : out std_logic;
|
fifo32x23_r : out std_logic;
|
resf_vector : in std_logic_vector (3 downto 0); --! Entradas de la señal de full de las colas de resultados.
|
resf_vector : in std_logic_vector (3 downto 0); --! Entradas de la señal de full de las colas de resultados.
|
resf_event : out std_logic; --! Salida decodificada que indica que la cola de resultados de la operación que está en curso.
|
resf_event : out std_logic; --! Salida decodificada que indica que la cola de resultados de la operación que está en curso.
|
resultoutput : out std_logic_vector ((08*width)-1 downto 0) --! 8 salidas de resultados, pues lo máximo que podrá calcularse por cada clock son 2 vectores.
|
resultoutput : out std_logic_vector ((08*floatwidth)-1 downto 0) --! 8 salidas de resultados, pues lo máximo que podrá calcularse por cada clock son 2 vectores.
|
);
|
);
|
end dpc;
|
end dpc;
|
|
|
architecture dpc_arch of dpc is
|
architecture dpc_arch of dpc is
|
|
|
Line 70... |
Line 67... |
|
|
constant dpfifoab : integer := 00;
|
constant dpfifoab : integer := 00;
|
constant dpfifocd : integer := 01;
|
constant dpfifocd : integer := 01;
|
|
|
|
|
type vectorblock12 is array (11 downto 0) of std_logic_vector(width-1 downto 0);
|
|
type vectorblock08 is array (07 downto 0) of std_logic_vector(width-1 downto 0);
|
|
type vectorblock06 is array (05 downto 0) of std_logic_vector(width-1 downto 0);
|
|
type vectorblock04 is array (03 downto 0) of std_logic_vector(width-1 downto 0);
|
|
type vectorblock03 is array (02 downto 0) of std_logic_vector(width-1 downto 0);
|
|
type vectorblock02 is array (01 downto 0) of std_logic_vector(width-1 downto 0);
|
|
|
|
|
|
|
|
signal sparaminput,sfactor : vectorblock12;
|
signal sparaminput,sfactor : vectorblock12;
|
signal ssumando,sresult : vectorblock08;
|
signal ssumando,sresult : vectorblock08;
|
signal sprd32blk : vectorblock06;
|
signal sprd32blk : vectorblock06;
|
signal sadd32blk : vectorblock04;
|
signal sadd32blk : vectorblock04;
|
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(width-1 downto 0);
|
signal ssqr32blk,sinv32blk : std_logic_vector(floatwidth-1 downto 0);
|
signal ssync_chain : std_logic_vector(28 downto 0);
|
signal ssync_chain : std_logic_vector(28 downto 0);
|
signal ssync_chain_d : std_logic;
|
signal ssync_chain_d : std_logic;
|
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.
|
signal sres567f,sres123f : std_logic; --! Entradas de la señal de full de las colas de resultados.
|
Line 146... |
Line 138... |
|
|
|
|
--! 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.
|
stuff12:
|
stuff12:
|
for i in 11 downto 0 generate
|
for i in 11 downto 0 generate
|
sparaminput(i) <= paraminput(i*width+width-1 downto i*width);
|
sparaminput(i) <= paraminput(i*floatwidth+floatwidth-1 downto i*floatwidth);
|
prd32blki(i*width+width-1 downto i*width) <= sfactor(i);
|
prd32blki(i*floatwidth+floatwidth-1 downto i*floatwidth) <= sfactor(i);
|
end generate stuff12;
|
end generate stuff12;
|
stuff08:
|
stuff08:
|
for i in 07 downto 0 generate
|
for i in 07 downto 0 generate
|
add32blki(i*width+width-1 downto i*width) <= ssumando(i);
|
add32blki(i*floatwidth+floatwidth-1 downto i*floatwidth) <= ssumando(i);
|
resultoutput(i*width+width-1 downto i*width) <= sresult(i);
|
resultoutput(i*floatwidth+floatwidth-1 downto i*floatwidth) <= sresult(i);
|
end generate stuff08;
|
end generate stuff08;
|
stuff04:
|
stuff04:
|
for i in 02 downto 1 generate
|
for i in 02 downto 1 generate
|
sadd32blk(i) <= add32blko(i*width+width-1 downto i*width);
|
sadd32blk(i) <= add32blko(i*floatwidth+floatwidth-1 downto i*floatwidth);
|
end generate stuff04;
|
end generate stuff04;
|
|
|
|
|
stuff03:
|
stuff03:
|
for i in 02 downto 0 generate
|
for i in 02 downto 0 generate
|
snormfifo_q(i) <= fifo32x23_q(i*width+width-1 downto i*width);
|
snormfifo_q(i) <= fifo32x23_q(i*floatwidth+floatwidth-1 downto i*floatwidth);
|
fifo32x26_d(i*width+width-1 downto i*width) <= snormfifo_d(i);
|
fifo32x26_d(i*floatwidth+floatwidth-1 downto i*floatwidth) <= snormfifo_d(i);
|
end generate stuff03;
|
end generate stuff03;
|
|
|
stuff02:
|
stuff02:
|
for i in 01 downto 0 generate
|
for i in 01 downto 0 generate
|
sdpfifo_q(i) <= fifo32x09_q(i*width+width-1 downto i*width);
|
sdpfifo_q(i) <= fifo32x09_q(i*floatwidth+floatwidth-1 downto i*floatwidth);
|
end generate stuff02;
|
end generate stuff02;
|
|
|
--! El siguiente código sirve para conectar arreglos a señales std_logic_1164, son abstracciones de código también, sin embargo se realizan a través de registros.
|
--! El siguiente código sirve para conectar arreglos a señales std_logic_1164, son abstracciones de código también, sin embargo se realizan a través de registros.
|
register_products_outputs:
|
register_products_outputs:
|
process (clk)
|
process (clk)
|
begin
|
begin
|
if clk'event and clk='1' then
|
if clk'event and clk='1' then
|
for i in 05 downto 0 loop
|
for i in 05 downto 0 loop
|
sprd32blk(i) <= prd32blko(i*width+width-1 downto i*width);
|
sprd32blk(i) <= prd32blko(i*floatwidth+floatwidth-1 downto i*floatwidth);
|
end loop;
|
end loop;
|
end if;
|
end if;
|
end process;
|
end process;
|
--! Los productos del multiplicador 2 y 3, ya registrados dentro de dpc van a la cola intermedia del producto punto (fifo32x09_d)
|
--! Los productos del multiplicador 2 y 3, ya registrados dentro de dpc van a la cola intermedia del producto punto (fifo32x09_d)
|
--! Los unicos resultados de sumandos que de nuevo entran al DataPathControl (observar la pestaña del documento de excel)
|
--! Los unicos resultados de sumandos que de nuevo entran al DataPathControl (observar la pestaña del documento de excel)
|
Line 189... |
Line 181... |
fifo32x09_d <= sprd32blk(p3)&sprd32blk(p2);
|
fifo32x09_d <= sprd32blk(p3)&sprd32blk(p2);
|
register_adder0_and_inversor_output:
|
register_adder0_and_inversor_output:
|
process (clk)
|
process (clk)
|
begin
|
begin
|
if clk'event and clk='1' then
|
if clk'event and clk='1' then
|
sadd32blk(a0) <= add32blko(a0*width+width-1 downto a0*width);
|
sadd32blk(a0) <= add32blko(a0*floatwidth+floatwidth-1 downto a0*floatwidth);
|
sadd32blk(aa) <= add32blko(aa*width+width-1 downto aa*width);
|
sadd32blk(aa) <= add32blko(aa*floatwidth+floatwidth-1 downto aa*floatwidth);
|
sinv32blk <= inv32blko;
|
sinv32blk <= inv32blko;
|
end if;
|
end if;
|
end process;
|
end process;
|
|
|
|
|