OpenCores
URL https://opencores.org/ocsvn/raytrac/raytrac/trunk

Subversion Repositories raytrac

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /raytrac/branches/fp_sgdma
    from Rev 203 to Rev 204
    Reverse comparison

Rev 203 → Rev 204

/dpc.vhd
29,49 → 29,40
entity dpc is
port (
clk,rst : in std_logic;
clk : in std_logic;
rst : in std_logic;
paraminput : in vectorblock06; --! Vectores A,B
prd32blko : in vectorblock06; --! Salidas de los 6 multiplicadores.
add32blko : in vectorblock03; --! Salidas de los 4 sumadores.
sqr32blko,inv32blko : in std_logic_vector (floatwidth-1 downto 0); --! Salidas de la raiz cuadradas y el inversor.
fifo32x19_q : in std_logic_vector (03*floatwidth-1 downto 0);--! Salida de la cola intermedia.
fifo32x09_q : in std_logic_vector (floatwidth-1 downto 0);--! Salida de las colas de producto punto.
add32blko : in vectorblock03; --! Salidas de los 3 sumadores.
inv32blko : in xfloat32; --! Salidas de la raiz cuadradas y el inversor.
sqr32blko : in xfloat32; --! Salidas de la raiz cuadradas y el inversor.
d,c,s : 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.
sqr32blki,inv32blki : out std_logic_vector (floatwidth-1 downto 0); --! Salidas de las 2 raices cuadradas y los 2 inversores.
fifo32x19_d : out std_logic_vector (03*floatwidth-1 downto 0); --! Entrada a la cola intermedia para la normalización.
q0_32x03_d : out std_logic_vector (floatwidth-1 downto 0); --! Entrada a las colas intermedias del producto punto.
qresult_q : in vectorblock04; --! Salida de las colas de resultados
qresult_sel : in std_logic_vector (1 downto 0); --! Direccion con el resultado de la
 
qresult_rdec : out std_logic_vector (3 downto 0); --!Señales de escritura decodificadas
qresult_w : out std_logic_vector (3 downto 0); --! Salidas de escritura y lectura en las colas de resultados.
qresult_d : out vectorblock04; --! 4 salidas de resultados, pues lo máximo que podrá calcularse por cada clock son 2 vectores.
 
dataread : in std_logic;
prd32blki : out vectorblock12; --! Entrada de los 12 factores en el bloque de multiplicación respectivamente.
add32blki : out vectorblock06; --! Entrada de los 6 sumandos del bloque de 3 sumadores.
resw : out std_logic_vector (3 downto 0); --! Salidas de escritura y lectura en las colas de resultados.
q0_32x03_w : out std_logic;
q1xyz_32x20_w : out std_logic;
q0_32x03_r : out std_logic;
q1xyz_32x20_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.
resultoutput : out vectorblock04 --! 4 salidas de resultados, pues lo máximo que podrá calcularse por cada clock son 2 vectores.
 
dataout : out xfloat32
 
);
end entity;
 
architecture dpc_arch of dpc is
constant qz : integer := 00;constant qy : integer := 01;constant qx : integer := 02;
constant az : integer := 00;constant ay : integer := 01;constant ax : integer := 02;constant bz : integer := 03;constant by : integer := 04;constant bx : integer := 05;
constant cz : integer := 06;constant cy : integer := 07;constant cx : integer := 08;constant dz : integer := 09;constant dy : integer := 10;constant dx : integer := 11;
constant f0 : integer := 00;constant f1 : integer := 01;constant f2 : integer := 02;constant f3 : integer := 03;constant f4 : integer := 04;constant f5 : integer := 05;
constant f6 : integer := 06;constant f7 : integer := 07;constant f8 : integer := 08;constant f9 : integer := 09;constant f10: integer := 10;constant f11: integer := 11;
constant s0 : integer := 00;constant s1 : integer := 01;constant s2 : integer := 02;constant s3 : integer := 03;constant s4 : integer := 04;constant s5 : integer := 05;
constant s6 : integer := 06;constant s7 : integer := 07;
constant a0 : integer := 00;constant a1 : integer := 01;constant a2 : integer := 02;constant aa : integer := 03;
constant p0 : integer := 00;constant p1 : integer := 01;constant p2 : integer := 02;constant p3 : integer := 03;constant p4 : integer := 04;constant p5 : integer := 05;
constant dpfifoab : integer := 00;
constant dpfifocd : integer := 01;
 
signal sparaminput : vectorblock06;
--!TBXSTART:FACTORS_N_ADDENDS
signal sfactor : vectorblock12;
85,7 → 76,8
signal sprd32blk : vectorblock06;
signal sadd32blk : vectorblock03;
signal ssqr32blk,sinv32blk : xfloat32;
signal q1xyz_32x19_q,q1xyz_32x19_d : vectorblock03;
signal q1xyz_32x19_q,q1xyz_32x19_d : vectorblock03;
--!TBXEND
94,11 → 86,53
signal sres : std_logic_vector(3 downto 0);
--!TBXEND
signal q1xyzd : std_logic_vector(95 downto 0);
signal q1xyzq : std_logic_vector(95 downto 0);
begin
 
 
--! Dataout, se encuentra en el "dominio" de la interface Avalon.
--! Procedimiento de decodificación de señal de lectura.
read_dataout:
process(clk,rst,qresult_q,dataread,qresult_sel)
begin
if rst=rstMasterValue then
dataout <= (others => '0');
elsif clk'event and clk='1' and dataread='1' then
case qresult_sel(1 downto 0) is
when "00" =>
dataout <= qresult_q(0);
when "01" =>
dataout <= qresult_q(1);
when "10" =>
dataout <= qresult_q(2);
when others =>
dataout <= qresult_q(3);
end case;
end if;
end process;
decode_wra:
process(dataread,qresult_sel)
begin
if dataread='1' then
case qresult_sel(1 downto 0) is
when "00" =>
qresult_rdec <= "0001";
when "01" =>
qresult_rdec <= "0010";
when "10" =>
qresult_rdec <= "0100";
when others =>
qresult_rdec <= "1000";
end case;
else
qresult_rdec <= (others => '0');
end if;
end process;
--! Cadena de sincronizaci&oacute;n: 29 posiciones.
sync_chain_proc:
115,28 → 149,19
end process sync_chain_proc;
--! Escritura en las colas de resultados y escritura/lectura en las colas intermedias mediante cadena de resultados.
q0_32x03_w <= ssync_chain(5);
q1xyz_32x20_w <= ssync_chain(1);
q0_32x03_r <= ssync_chain(12);
q1xyz_32x20_r <= ssync_chain(21);
q1xyz_32x19_w <= ssync_chain(1);
--! Salida de se&ntilde;ales de datos que se van a escribir en la cola de resultados.
resw <= sres;
qresult_w <= sres;
--! El siguiente c&oacute;digo sirve para conectar arreglos a se&ntilde;ales std_logic_1164, simplemente son abstracciones a nivel de c&oacute;digo y no representar&aacute; cambios en la s&iacute;ntesis.
sparaminput <= paraminput;
prd32blki <= sfactor;
add32blki <= ssumando;
resultoutput<= sresult;
qresult_d <= sresult;
stuff03:
for i in 02 downto 0 generate
q1xyz_32x19_q(i) <= fifo32x19_q(i*floatwidth+floatwidth-1 downto i*floatwidth);
fifo32x19_d(i*floatwidth+floatwidth-1 downto i*floatwidth) <= q1xyz_32x19_d(i);
end generate stuff03;
sdpfifo_q <= fifo32x09_q;
--! El siguiente c&oacute;digo sirve para conectar arreglos a se&ntilde;ales std_logic_1164, son abstracciones de c&oacute;digo tambi&eacute;n, sin embargo se realizan a trav&eacute;s de registros.
register_products_outputs:
146,14 → 171,11
sprd32blk <= prd32blko;
sadd32blk <= add32blko;
sinv32blk <= inv32blko;
--! Raiz Cuadrada.
ssqr32blk <= sqr32blko;
end if;
end process;
--! Los productos del multiplicador 2 y 3, ya registrados dentro de dpc van a la cola intermedia del producto punto (q0_32x03_d)
--! Los unicos resultados de sumandos que de nuevo entran al DataPathControl (observar la pesta&ntilde;a del documento de excel)
q0_32x03_d <= sprd32blk(p2);
--! Raiz Cuadrada.
ssqr32blk <= sqr32blko;
--! Cola de normalizacion
161,50 → 183,101
q1xyz_32x19_d(qy) <= sparaminput(ay);
q1xyz_32x19_d(qz) <= sparaminput(az);
--! La entrada al inversor SIEMPRE viene con la salida de la raiz cuadrada
inv32blki <= ssqr32blk;
--! La entrada de la ra&iacute;z cuadrada SIEMPRE viene con la salida del sumador 1.
sqr32blki <= add32blko(a1);
--! Decodificaci&oacute;n del Datapath.
datapathproc:process(s,d,c,sparaminput,sinv32blk,sprd32blk,sadd32blk,sdpfifo_q,q1xyz_32x19_q,ssync_chain,sqr32blko)
datapathproc:process(s,d,c,sparaminput,sinv32blk,sprd32blk,sadd32blk,sdpfifo_q,q1xyz_32x19_q,ssync_chain,ssqr32blk)
begin
--Summador 0: DORC!
if (d or c)='1' then
ssumando(s0) <= sprd32blk(p0);
ssumando(s1) <= sprd32blk(p1);
else
ssumando(s0) <= sparaminput(ax);
ssumando(s1) <= sparaminput(bx);
end if;
--Sumador 1:
if d='1' then
ssumando(s2) <= sadd32blk(a0);
ssumando(s3) <= sdpfifo_q;
elsif c='0' then
ssumando(s2) <= sparaminput(ay);
ssumando(s3) <= sparaminput(by);
else
ssumando(s2) <= sprd32blk(p2);
ssumando(s3) <= sprd32blk(p3);
end if;
--S2
if c='0' then
ssumando(s4) <= sparaminput(az);
ssumando(s5) <= sparaminput(bz);
else
ssumando(s4) <= sprd32blk(p4);
ssumando(s5) <= sprd32blk(p5);
end if;
--P0,P1,P2
sfactor(f4) <= sparaminput(az);
if d='1' then
--P0 P1 y P2
if (not(d) and c)='1' then
sfactor(f0) <= sparaminput(ay);
sfactor(f1) <= sparaminput(bz);
sfactor(f2) <= sparaminput(az);
sfactor(f3) <= sparaminput(by);
sfactor(f5) <= sparaminput(bx);
else
sfactor(f0) <= sparaminput(ax);
sfactor(f2) <= sparaminput(ay);
sfactor(f1) <= sparaminput(bx) ;
sfactor(f3) <= sparaminput(by) ;
sfactor(f5) <= sparaminput(bz) ;
--P3 P4 y P5
end if;
--P3 P4 P5
if (c and s)='1' then
sfactor(f6) <= sparaminput(ax);
sfactor(f9) <= sparaminput(by);
else
sfactor(f6) <= sinv32blk;
sfactor(f9) <= q1xyz_32x19_q(ay);
end if;
if d='1' then
if s='0' then
sfactor(f6) <= sinv32blk;
sfactor(f7) <= q1xyz_32x19_q(ax);
sfactor(f8) <= sinv32blk;
sfactor(f9) <= q1xyz_32x19_q(ay);
sfactor(f10) <= sinv32blk;
sfactor(f11) <= q1xyz_32x19_q(az);
else
sfactor(f6) <= sparaminput(az);
sfactor(f7) <= sparaminput(bx);
sfactor(f8) <= sparaminput(az);
sfactor(f9) <= sparaminput(bx);
sfactor(f10) <= sparaminput(az);
sfactor(f11) <= sparaminput(bx);
sfactor(f8) <= sparaminput(ay);
sfactor(f10) <= sparaminput(az);
sfactor(f11) <= sparaminput(bz);
end if;
-- S0
ssumando(s0) <= sprd32blk(p0);
ssumando(s1) <= sprd32blk(p1);
--S1
ssumando(s2) <= sadd32blk(a0);
ssumando(s3) <= sdpfifo_q;
--RES0,1,2
else
sfactor(f7) <= sparaminput(bz);
sfactor(f8) <= sparaminput(ax);
sfactor(f10) <= sparaminput(ay);
sfactor(f11) <= sparaminput(bx);
end if;
--res0,1,2
if d='1' then
sresult(0) <= sprd32blk(p3);
sresult(1) <= sprd32blk(p4);
sresult(2) <= sprd32blk(p5);
else
sresult(0) <= sadd32blk(a0);
sresult(1) <= sadd32blk(a1);
sresult(2) <= sadd32blk(a2);
end if;
--res3
if c='1' then
sresult(3) <= ssqr32blk;
sres(3) <= ssync_chain(20) and d and not(s);
else
sresult(3) <= sadd32blk(a1);
sres(3) <= ssync_chain(19) and d and not(s);
end if;
if d='1' then
if c='1' and s='1' then
sres(2 downto 0) <= ssync_chain(5)&ssync_chain(5)&ssync_chain(5);
elsif c='1' then
212,52 → 285,7
else
sres(2 downto 0) <= (others => '0');
end if;
else
 
--P0 P1 y P2
sfactor(f0) <= sparaminput(ay);
sfactor(f1) <= sparaminput(bz);
 
sfactor(f2) <= sparaminput(az);
sfactor(f3) <= sparaminput(by);
sfactor(f5) <= sparaminput(bx);
 
--P3 P4 y P5
sfactor(f6) <= sparaminput(ax);
sfactor(f7) <= sparaminput(bz);
sfactor(f8) <= sparaminput(ax);
sfactor(f9) <= sparaminput(by);
sfactor(f10) <= sparaminput(ay);
sfactor(f11) <= sparaminput(bx);
-- S0
if c='0' then
ssumando(s0) <= sparaminput(ax);
ssumando(s1) <= sparaminput(bx);
--S1
ssumando(s2) <= sparaminput(ay);
ssumando(s3) <= sparaminput(by);
else
ssumando(s0) <= sprd32blk(p0);
ssumando(s1) <= sprd32blk(p1);
--S1
ssumando(s2) <= sprd32blk(p2);
ssumando(s3) <= sprd32blk(p3);
end if;
--RES0,1,2
sresult(0) <= sadd32blk(a0);
sresult(1) <= sadd32blk(a1);
sresult(2) <= sadd32blk(a2);
 
 
if c='1' and s='1' then
sres(2 downto 0) <= ssync_chain(12)&ssync_chain(12)&ssync_chain(12);
elsif c='0' then
265,32 → 293,65
else
sres(2 downto 0) <= (others => '0');
end if;
end if;
--S2
if c='0' then
ssumando(s4) <= sparaminput(az);
ssumando(s5) <= sparaminput(bz);
else
ssumando(s4) <= sprd32blk(p4);
ssumando(s5) <= sprd32blk(p5);
end if;
--RES3
if c='1' then
sresult(3) <= sqr32blko;
sres(3) <= ssync_chain(20) and d and not(s);
else
sresult(3) <= sadd32blk(a1);
sres(3) <= ssync_chain(19) and d and not(s);
end if;
end process;
--! Colas internas de producto punto, ubicada en el pipe line aritm&eacute;co. Paralelo a los sumadores a0 y a2.
q0 : scfifo --! Debe ir registrada la salida.
generic map (
add_ram_output_register => "OFF",
allow_rwcycle_when_full => "OFF",
intended_device_family => "CycloneIII",
lpm_hint => "MAXIMUM_DEPTH=8",
lpm_numwords => 8,
lpm_showahead => "ON",
lpm_type => "SCIFIFO",
lpm_width => 32,
overflow_checking => "ON",
underflow_checking => "ON",
use_eab => "OFF"
)
port map (
rdreq => ssync_chain(12),
aclr => '0',
clock => clk,
q => sdpfifo_q,
wrreq => ssync_chain(5),
data => sprd32blk(p2)
);
--! Cola interna de normalizaci&oacute;n de vectores, ubicada entre el pipeline aritm&eacute;tico
q1xyzd(95 downto 64) <= q1xyz_32x19_d(ax);
q1xyzd(63 downto 32) <= q1xyz_32x19_d(ay);
q1xyzd(31 downto 00) <= q1xyz_32x19_d(az);
q1xyz_32x19_q(ax) <= q1xyzq(95 downto 64);
q1xyz_32x19_q(ay) <= q1xyzq(63 downto 32);
q1xyz_32x19_q(az) <= q1xyzq(31 downto 00);
qxqyqz : scfifo
generic map (
add_ram_output_register => "OFF",
allow_rwcycle_when_full => "OFF",
intended_device_family => "Cyclone III",
lpm_hint => "RAM_BLOCK_TYPE=M9K",
lpm_numwords => 32,
lpm_showahead => "OFF",
lpm_type => "SCFIFO",
lpm_width => 96,
overflow_checking => "ON",
underflow_checking => "ON",
use_eab => "ON"
)
port map (
rdreq => ssync_chain(21),
aclr => '0',
clock => clk,
q => q1xyzq,
wrreq => ssync_chain(1),
data => q1xyzd
);
 
end architecture;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.