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ó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ñales de datos que se van a escribir en la cola de resultados. |
resw <= sres; |
qresult_w <= sres; |
|
--! 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. |
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ó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: |
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ñ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íz cuadrada SIEMPRE viene con la salida del sumador 1. |
sqr32blki <= add32blko(a1); |
|
--! Decodificació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é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ón de vectores, ubicada entre el pipeline aritmé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; |