Line 20... |
Line 20... |
-- You should have received a copy of the GNU General Public License
|
-- You should have received a copy of the GNU General Public License
|
-- along with raytrac. If not, see <http://www.gnu.org/licenses/>.
|
-- along with raytrac. If not, see <http://www.gnu.org/licenses/>.
|
|
|
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
|
|
|
port (
|
port (
|
clk,rst : in std_logic;
|
clk,rst : in std_logic;
|
paraminput : in std_logic_vector ((12*floatwidth)-1 downto 0); --! Vectores A,B,C,D
|
paraminput : in vectorblock12; --! Vectores A,B,C,D
|
prd32blko : in std_logic_vector ((06*floatwidth)-1 downto 0); --! Salidas de los 6 multiplicadores.
|
prd32blko : in vectorblock06; --! Salidas de los 6 multiplicadores.
|
add32blko : in std_logic_vector ((04*floatwidth)-1 downto 0); --! Salidas de los 4 sumadores.
|
add32blko : in vectorblock04; --! Salidas de los 4 sumadores.
|
sqr32blko,inv32blko : in std_logic_vector (floatwidth-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*floatwidth-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*floatwidth-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; --! Señal 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 (floatwidth-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*floatwidth-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*floatwidth-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*floatwidth)-1 downto 0); --! Entrada de los 12 factores en el bloque de multiplicación respectivamente.
|
prd32blki : out vectorblock12; --! Entrada de los 12 factores en el bloque de multiplicación respectivamente.
|
add32blki : out std_logic_vector ((08*floatwidth)-1 downto 0); --! Entrada de los 8 sumandos del bloque de 4 sumadores.
|
add32blki : out vectorblock08; --! 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*floatwidth)-1 downto 0) --! 8 salidas de resultados, pues lo máximo que podrá calcularse por cada clock son 2 vectores.
|
resultoutput : out vectorblock08 --! 8 salidas de resultados, pues lo máximo que podrá calcularse por cada clock son 2 vectores.
|
);
|
);
|
end entity;
|
end entity;
|
|
|
architecture dpc_arch of dpc is
|
architecture dpc_arch of dpc is
|
|
|
Line 136... |
Line 138... |
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.
|
stuff12:
|
sparaminput <= paraminput;
|
for i in 11 downto 0 generate
|
prd32blki <= sfactor;
|
sparaminput(i) <= paraminput(i*floatwidth+floatwidth-1 downto i*floatwidth);
|
add32blki <= ssumando;
|
prd32blki(i*floatwidth+floatwidth-1 downto i*floatwidth) <= sfactor(i);
|
resultoutput<= sresult;
|
end generate stuff12;
|
|
stuff08:
|
|
for i in 07 downto 0 generate
|
|
add32blki(i*floatwidth+floatwidth-1 downto i*floatwidth) <= ssumando(i);
|
|
resultoutput(i*floatwidth+floatwidth-1 downto i*floatwidth) <= sresult(i);
|
|
end generate stuff08;
|
|
stuff04:
|
stuff04:
|
for i in 02 downto 1 generate
|
for i in 02 downto 1 generate
|
sadd32blk(i) <= add32blko(i*floatwidth+floatwidth-1 downto i*floatwidth);
|
sadd32blk(i) <= add32blko(i);
|
end generate stuff04;
|
end generate stuff04;
|
|
|
|
|
stuff03:
|
stuff03:
|
for i in 02 downto 0 generate
|
for i in 02 downto 0 generate
|
Line 168... |
Line 166... |
--! 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
|
sprd32blk <= prd32blko;
|
sprd32blk(i) <= prd32blko(i*floatwidth+floatwidth-1 downto i*floatwidth);
|
|
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)
|
|
|
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*floatwidth+floatwidth-1 downto a0*floatwidth);
|
sadd32blk(a0) <= add32blko(a0);
|
sadd32blk(aa) <= add32blko(aa*floatwidth+floatwidth-1 downto aa*floatwidth);
|
sadd32blk(aa) <= add32blko(aa);
|
sinv32blk <= inv32blko;
|
sinv32blk <= inv32blko;
|
end if;
|
end if;
|
end process;
|
end process;
|
|
|
|
|