Line 7... |
Line 7... |
|
|
library lpm;
|
library lpm;
|
use lpm.lpm_components.all;
|
use lpm.lpm_components.all;
|
|
|
|
|
entity slave_template is
|
entity raytrac is
|
generic (
|
generic (
|
wd : integer := 32;
|
wd : integer := 32;
|
sl : integer := 5; --! Arith Sync Chain Long 2**sl
|
sl : integer := 5; --! Arith Sync Chain Long 2**sl
|
ln : integer := 12; --! Max Transfer Length = 2**ln = n_outputbuffers * 256
|
ln : integer := 12; --! Max Transfer Length = 2**ln = n_outputbuffers * 256
|
fd : integer := 8; --! Result Fifo Depth = 2**fd =256
|
fd : integer := 8; --! Result Fifo Depth = 2**fd =256
|
Line 50... |
Line 50... |
|
|
);
|
);
|
end entity;
|
end entity;
|
|
|
|
|
architecture slave_template_arch of slave_template is
|
architecture raytrac_arch of raytrac is
|
|
|
--! Altera Compiler Directive, to avoid m9k autoinferring thanks to the guys at http://www.alteraforum.com/forum/archive/index.php/t-30784.html ....
|
--! Altera Compiler Directive, to avoid m9k autoinferring thanks to the guys at http://www.alteraforum.com/forum/archive/index.php/t-30784.html ....
|
attribute altera_attribute : string;
|
attribute altera_attribute : string;
|
attribute altera_attribute of slave_template_arch : architecture is "-name AUTO_SHIFT_REGISTER_RECOGNITION OFF";
|
attribute altera_attribute of raytrac_arch : architecture is "-name AUTO_SHIFT_REGISTER_RECOGNITION OFF";
|
|
|
|
|
subtype xfloat32 is std_logic_vector(wd-1 downto 0);
|
subtype xfloat32 is std_logic_vector(wd-1 downto 0);
|
type registerblock is array ((2**nr)-1 downto 0) of xfloat32;
|
type registerblock is array ((2**nr)-1 downto 0) of xfloat32;
|
type transferState is (IDLE,SINK,SOURCE);
|
type transferState is (IDLE,SINK,SOURCE);
|
Line 90... |
Line 90... |
constant reg_ctrl_c : integer:=02; --! C bit of the DCS field.
|
constant reg_ctrl_c : integer:=02; --! C bit of the DCS field.
|
constant reg_ctrl_d : integer:=03; --! D bit of the DCS field.
|
constant reg_ctrl_d : integer:=03; --! D bit of the DCS field.
|
|
|
constant reg_ctrl_sc : integer:=04; --! SC bit of the VTSC field.
|
constant reg_ctrl_sc : integer:=04; --! SC bit of the VTSC field.
|
constant reg_ctrl_vt : integer:=05; --! VT bit of the VTSC field.
|
constant reg_ctrl_vt : integer:=05; --! VT bit of the VTSC field.
|
constant reg_ctrl_flags_ae : integer:=06; --! Almost Empty Flag.
|
constant reg_ctrl_dma : integer:=06; --! DMA bit.
|
constant reg_ctrl_flags_fc : integer:=07; --! Flood Condition Flag.
|
constant reg_ctrl_flags_fc : integer:=07; --! Flood Condition Flag.
|
|
|
constant reg_ctrl_flags_dc : integer:=08; --! Drain Condition Flag.
|
constant reg_ctrl_flags_dc : integer:=08; --! Drain Condition Flag.
|
constant reg_ctrl_flags_wp : integer:=09; --! Write on Memory Pending Flag.
|
constant reg_ctrl_flags_wp : integer:=09; --! Write on Memory Pending Flag.
|
constant reg_ctrl_flags_pp : integer:=10; --! Pipeline Pending Flag.
|
constant reg_ctrl_flags_pp : integer:=10; --! Pipeline Pending Flag.
|
Line 115... |
Line 115... |
signal sslave_read : std_logic;
|
signal sslave_read : std_logic;
|
signal sslave_write : std_logic;
|
signal sslave_write : std_logic;
|
signal sslave_writedata : xfloat32;
|
signal sslave_writedata : xfloat32;
|
signal sslave_address : std_logic_vector (nr-1 downto 0);
|
signal sslave_address : std_logic_vector (nr-1 downto 0);
|
signal sslave_waitrequest : std_logic;
|
signal sslave_waitrequest : std_logic;
|
|
|
--! Avalon MM Master
|
--! Avalon MM Master
|
signal smaster_write : std_logic;
|
signal smaster_write : std_logic;
|
signal smaster_read : std_logic;
|
signal smaster_read : std_logic;
|
|
|
|
|
--! State Machine and event signaling
|
--! State Machine and event signaling
|
signal sm : transferState;
|
signal sm : transferState;
|
|
|
signal sres_ack : std_logic;
|
signal sres_ack : std_logic;
|
signal soutb_ack : std_logic;
|
signal soutb_ack : std_logic;
|
Line 140... |
Line 140... |
signal sres_e : std_logic;
|
signal sres_e : std_logic;
|
signal soutb_e : std_logic;
|
signal soutb_e : std_logic;
|
signal soutb_ae : std_logic;
|
signal soutb_ae : std_logic;
|
signal soutb_af : std_logic;
|
signal soutb_af : std_logic;
|
|
|
|
|
signal soutb_usedw : std_logic_vector(fd-1 downto 0);
|
signal soutb_usedw : std_logic_vector(fd-1 downto 0);
|
|
|
signal ssync_chain_1 : std_logic;
|
signal ssync_chain_1 : std_logic;
|
signal ssync_chain_pending : std_logic;
|
signal ssync_chain_pending : std_logic;
|
signal sfetch_data_pending : std_logic;
|
signal sfetch_data_pending : std_logic;
|
Line 153... |
Line 154... |
signal sparamload_pending : std_logic;
|
signal sparamload_pending : std_logic;
|
signal sZeroTransit : std_logic;
|
signal sZeroTransit : std_logic;
|
|
|
|
|
--!Unload Control
|
--!Unload Control
|
type upload_chain is (VX,VY,VZ,SC);
|
type upload_chain is (VX,VY,VZ,SC,DMA);
|
signal supload_chain : upload_chain;
|
signal supload_chain : upload_chain;
|
signal supload_start : upload_chain;
|
signal supload_start : upload_chain;
|
|
|
--!Señales de apoyo:
|
--!Señales de apoyo:
|
signal zero : std_logic_vector(31 downto 0);
|
signal zero : std_logic_vector(31 downto 0);
|
Line 207... |
Line 208... |
--! Conexióln a señales externas.
|
--! Conexióln a señales externas.
|
irq <= sreg_block(reg_ctrl)(reg_ctrl_irq);
|
irq <= sreg_block(reg_ctrl)(reg_ctrl_irq);
|
master_read <= smaster_read;
|
master_read <= smaster_read;
|
master_write <= smaster_write;
|
master_write <= smaster_write;
|
|
|
|
--! Direct Memory Access Selector.
|
|
|
|
|
|
|
--! ZERO_TRANSIT: Cuando todos los elementos de sincronización están en cero menos la cola de sincronización de carga de parametros.
|
--! ZERO_TRANSIT: Cuando todos los elementos de sincronización están en cero menos la cola de sincronización de carga de parametros.
|
sZeroTransit <= not(sload_add_pending or sfetch_data_pending or spipeline_pending or swrite_pending);
|
sZeroTransit <= not(sload_add_pending or sfetch_data_pending or spipeline_pending or swrite_pending);
|
|
|
--! ELEMENTO DE SINCRONIZACION OUT QUEUE: Datos pendientes por cargar a la memoria a través de la interconexión
|
--! ELEMENTO DE SINCRONIZACION OUT QUEUE: Datos pendientes por cargar a la memoria a través de la interconexión
|
Line 274... |
Line 278... |
end if;
|
end if;
|
|
|
--! Restart param load chain
|
--! Restart param load chain
|
srestart_chain <= sreg_block(reg_ctrl)(reg_ctrl_irq) and sreg_block(reg_ctrl)(reg_ctrl_rlsc);
|
srestart_chain <= sreg_block(reg_ctrl)(reg_ctrl_irq) and sreg_block(reg_ctrl)(reg_ctrl_rlsc);
|
|
|
--! Data dumpster: Dump data once the interconeection has loaded the data to write.
|
--! Data dumpster: Descaratar dato de upload una vez la interconexión haya enganchado el dato.
|
if sm=SINK and master_waitrequest='0' and smaster_write='1' then
|
if sm=SINK and master_waitrequest='0' and smaster_write='1' then
|
soutb_ack <= '1';
|
soutb_ack <= '1';
|
else
|
else
|
soutb_ack <= '0';
|
soutb_ack <= '0';
|
end if;
|
end if;
|
|
|
|
|
|
|
--! Flow Control State Machine.
|
--! Flow Control State Machine.
|
if rst=rstMasterValue then
|
if rst=rstMasterValue then
|
|
|
--! State Machine
|
--! State Machine
|
sm <= IDLE;
|
sm <= IDLE;
|
Line 373... |
Line 379... |
|
|
--! Flow Control: Finalizada la instrucción, generar una interrupción e ir al estado IDLE.
|
--! Flow Control: Finalizada la instrucción, generar una interrupción e ir al estado IDLE.
|
sm <= IDLE;
|
sm <= IDLE;
|
sreg_block(reg_ctrl)(reg_ctrl_irq) <= '1';
|
sreg_block(reg_ctrl)(reg_ctrl_irq) <= '1';
|
sreg_block(reg_ctrl)(reg_ctrl_rom) <= '0';
|
sreg_block(reg_ctrl)(reg_ctrl_rom) <= '0';
|
sreg_block(reg_ctrl)(reg_ctrl_flags_dc downto reg_ctrl_flags_ae) <= sdrain_condition & sflood_condition & soutb_ae;
|
sreg_block(reg_ctrl)(reg_ctrl_flags_dc downto reg_ctrl_flags_fc) <= sdrain_condition & sflood_condition;
|
sreg_block(reg_ctrl)(reg_ctrl_flags_ap downto reg_ctrl_flags_wp) <= sload_add_pending & sfetch_data_pending & sparamload_pending & spipeline_pending & swrite_pending;
|
sreg_block(reg_ctrl)(reg_ctrl_flags_ap downto reg_ctrl_flags_wp) <= sload_add_pending & sfetch_data_pending & sparamload_pending & spipeline_pending & swrite_pending;
|
|
|
else
|
else
|
|
|
--! Flow Control: Cambiar a Source porque aun hay elementos transitando.
|
--! Flow Control: Cambiar a Source porque aun hay elementos transitando.
|
Line 405... |
Line 411... |
|
|
--! Flow Control: Finalizada la instrucción, generar una interrupción e ir al estado IDLE.
|
--! Flow Control: Finalizada la instrucción, generar una interrupción e ir al estado IDLE.
|
sm <= IDLE;
|
sm <= IDLE;
|
sreg_block(reg_ctrl)(reg_ctrl_irq) <= '1';
|
sreg_block(reg_ctrl)(reg_ctrl_irq) <= '1';
|
sreg_block(reg_ctrl)(reg_ctrl_rom) <= '0';
|
sreg_block(reg_ctrl)(reg_ctrl_rom) <= '0';
|
sreg_block(reg_ctrl)(reg_ctrl_flags_dc downto reg_ctrl_flags_ae) <= sdrain_condition & sflood_condition & soutb_ae;
|
sreg_block(reg_ctrl)(reg_ctrl_flags_dc downto reg_ctrl_flags_fc) <= sdrain_condition & sflood_condition;
|
sreg_block(reg_ctrl)(reg_ctrl_flags_ap downto reg_ctrl_flags_wp) <= sload_add_pending & sfetch_data_pending & sparamload_pending & spipeline_pending & swrite_pending;
|
sreg_block(reg_ctrl)(reg_ctrl_flags_ap downto reg_ctrl_flags_wp) <= sload_add_pending & sfetch_data_pending & sparamload_pending & spipeline_pending & swrite_pending;
|
|
|
end if;
|
end if;
|
end if;
|
end if;
|
end if;
|
end if;
|
Line 465... |
Line 471... |
--! ******************************************************************************************************************************************************
|
--! ******************************************************************************************************************************************************
|
--! PROCESO DE CONTROL DE FLUJO ENTRE EL BUFFER DE RESULTADOS Y EL BUFFER DE SALIDA
|
--! PROCESO DE CONTROL DE FLUJO ENTRE EL BUFFER DE RESULTADOS Y EL BUFFER DE SALIDA
|
--! ******************************************************************************************************************************************************
|
--! ******************************************************************************************************************************************************
|
|
|
FLOW_CONTROL_OUTPUT_STAGE:
|
FLOW_CONTROL_OUTPUT_STAGE:
|
process (clk,rst,sres_e,sreg_block(reg_ctrl)(reg_ctrl_vt downto reg_ctrl_sc),sm,supload_chain,zero,ssync_chain_pending,sres_q,supload_start)
|
process (clk,rst,master_readdata, master_readdatavalid,sres_e,sreg_block(reg_ctrl)(reg_ctrl_vt downto reg_ctrl_sc),sm,supload_chain,zero,ssync_chain_pending,sres_q,supload_start)
|
begin
|
begin
|
|
|
|
|
--! Compute initial State.
|
--! Compute initial State.
|
|
|
--! Escribir en el output buffer.
|
--! Escribir en el output buffer.
|
|
if supload_chain=DMA then
|
|
--! Modo DMA escribir los datos de entrada directamente en el buffer.
|
|
soutb_w <= master_readdatavalid;
|
|
else
|
|
--!Modo Arithmetic Pipeline
|
soutb_w <= not(sres_e);
|
soutb_w <= not(sres_e);
|
|
end if;
|
|
|
--! Control de lectura de la cola de resultados.
|
--! Control de lectura de la cola de resultados.
|
if sres_e='0' then
|
if sres_e='0' then
|
--!Hay datos en la cola de resultados.
|
--!Hay datos en la cola de resultados.
|
if (supload_chain=VZ and sreg_block(reg_ctrl)(reg_ctrl_sc)='0') or supload_chain=SC then
|
if (supload_chain=VZ and sreg_block(reg_ctrl)(reg_ctrl_sc)='0') or supload_chain=SC then
|
Line 485... |
Line 497... |
end if;
|
end if;
|
else
|
else
|
sres_ack <= '0';
|
sres_ack <= '0';
|
end if;
|
end if;
|
|
|
|
|
--! Decodificar que salida de la cola de resultados se conecta a la entrada del otput buffer
|
--! Decodificar que salida de la cola de resultados se conecta a la entrada del otput buffer
|
|
--! DMA Path Control: Si se encuentra habilitado el modo dma entonces conectar la entrada del buffer de salida a la interconexión
|
case supload_chain is
|
case supload_chain is
|
when VX =>
|
when VX =>
|
soutb_d <= sres_q ((wd*1)-1 downto wd*0);
|
soutb_d <= sres_q ((wd*1)-1 downto wd*0);
|
when VY =>
|
when VY =>
|
soutb_d <= sres_q ((wd*2)-1 downto wd*1);
|
soutb_d <= sres_q ((wd*2)-1 downto wd*1);
|
when VZ =>
|
when VZ =>
|
soutb_d <= sres_q ((wd*3)-1 downto wd*2);
|
soutb_d <= sres_q ((wd*3)-1 downto wd*2);
|
when SC =>
|
when SC =>
|
soutb_d <= sres_q ((wd*4)-1 downto wd*3);
|
soutb_d <= sres_q ((wd*4)-1 downto wd*3);
|
|
when DMA =>
|
|
soutb_d <= master_readdata;
|
end case;
|
end case;
|
|
|
|
|
case sreg_block(reg_ctrl)(reg_ctrl_vt downto reg_ctrl_sc) is
|
case sreg_block(reg_ctrl)(reg_ctrl_vt downto reg_ctrl_sc) is
|
when "01" =>
|
when "01" =>
|
Line 509... |
Line 525... |
|
|
|
|
--! Máquina de estados para el width adaptation RES(128) -> OUTPUTBUFFER(32).
|
--! Máquina de estados para el width adaptation RES(128) -> OUTPUTBUFFER(32).
|
if rst=rstMasterValue then
|
if rst=rstMasterValue then
|
supload_chain <= VX;
|
supload_chain <= VX;
|
elsif clk'event and clk='1' then
|
elsif clk'event and clk='1' and sreg_block(reg_ctrl)(reg_ctrl_dma)='0' then
|
|
--! Modo de operación normal.
|
case supload_chain is
|
case supload_chain is
|
when VX =>
|
when VX =>
|
if sres_e='1' then
|
if sres_e='1' then
|
supload_chain <= supload_start;
|
supload_chain <= supload_start;
|
else
|
else
|
Line 525... |
Line 542... |
if sreg_block(reg_ctrl)(reg_ctrl_sc)='0' then
|
if sreg_block(reg_ctrl)(reg_ctrl_sc)='0' then
|
supload_chain <= VX;
|
supload_chain <= VX;
|
else
|
else
|
supload_chain <= SC;
|
supload_chain <= SC;
|
end if;
|
end if;
|
when SC =>
|
when SC|DMA =>
|
supload_chain <= supload_start;
|
supload_chain <= supload_start;
|
|
|
end case;
|
end case;
|
|
|
|
elsif clk'event and clk='1' then
|
|
--! Modo DMA
|
|
supload_chain <= DMA;
|
end if;
|
end if;
|
|
|
|
|
end process;
|
end process;
|
--! ******************************************************************************************************************************************************
|
--! ******************************************************************************************************************************************************
|
--! PROCESO DE CONTROL DE FLUJO ENTRE LA ENTRADA DESDE LA INTERCONEXI&OACUTE;N Y LOS PARAMETROS DE ENTRADA EN EL PIPELINE ARITMETICO
|
--! PROCESO DE CONTROL DE FLUJO ENTRE LA ENTRADA DESDE LA INTERCONEXI&OACUTE;N Y LOS PARAMETROS DE ENTRADA EN EL PIPELINE ARITMETICO
|
--! ******************************************************************************************************************************************************
|
--! ******************************************************************************************************************************************************
|
FLOW_CONTROL_INPUT_STAGE:
|
FLOW_CONTROL_INPUT_STAGE:
|
process(clk,rst,master_readdatavalid,master_readdata,sreg_block(reg_ctrl)(reg_ctrl_d downto reg_ctrl_s),sslave_write,sslave_address)
|
process(clk,rst,master_readdatavalid,master_readdata,sreg_block(reg_ctrl)(reg_ctrl_dma downto reg_ctrl_s),sslave_write,sslave_address,supload_chain)
|
begin
|
begin
|
--! Está ocurriendo un evento de transición del estado TX al estado FETCH: Programar el enganche de parámetros que vienen de la interconexión.
|
--! Está ocurriendo un evento de transición del estado TX al estado FETCH: Programar el enganche de parámetros que vienen de la interconexión.
|
--! Mirar como es la carga inicial. Si es Normalizacion o Magnitud (dcs=110) entonces cargar AXBX de lo contrario solo AX.
|
--! Mirar como es la carga inicial. Si es Normalizacion o Magnitud (dcs=110) entonces cargar AXBX de lo contrario solo AX.
|
case sreg_block(reg_ctrl)(reg_ctrl_d downto reg_ctrl_s) is
|
case sreg_block(reg_ctrl)(reg_ctrl_d downto reg_ctrl_s) is
|
when "110" | "100" => sdownload_start <= AXBX;
|
when "110" | "100" => sdownload_start <= AXBX;
|
Line 552... |
Line 574... |
for i in reg_bz downto reg_ax loop
|
for i in reg_bz downto reg_ax loop
|
sreg_block(i) <= (others => '0');
|
sreg_block(i) <= (others => '0');
|
end loop;
|
end loop;
|
elsif clk'event and clk='1' then
|
elsif clk'event and clk='1' then
|
ssync_chain_1 <= '0';
|
ssync_chain_1 <= '0';
|
if master_readdatavalid='1' then
|
if master_readdatavalid='1' and sreg_block(reg_ctrl)(reg_ctrl_dma)='0' then
|
--! El dato en la interconexión es valido, se debe enganchar.
|
--! El dato en la interconexión es valido, se debe enganchar.
|
case sdownload_chain is
|
case sdownload_chain is
|
when AX | AXBX =>
|
when AX | AXBX =>
|
--! Cargar el operando correspondiente al componente "X" del vector "A"
|
--! Cargar el operando correspondiente al componente "X" del vector "A"
|
ssync_chain_1 <= '0';
|
ssync_chain_1 <= '0';
|
Line 662... |
Line 684... |
end if;
|
end if;
|
end process;
|
end process;
|
--! *************************************************************************************************************************************************************************************************************************************************************
|
--! *************************************************************************************************************************************************************************************************************************************************************
|
--! AVALON MEMORY MAPPED SLAVE FINISHED
|
--! AVALON MEMORY MAPPED SLAVE FINISHED
|
--! *************************************************************************************************************************************************************************************************************************************************************
|
--! *************************************************************************************************************************************************************************************************************************************************************
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end architecture;
|
|
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------
|
--! Control Register (cr) BASE_ADDRESS + 0x0 |
|
--! Control Register (reg_ctrl) BASE_ADDRESS + 0x0 |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------
|
--! Bit No. | Nombre | Descripción |
|
--! Bit No. | Nombre | Descripción |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------
|
--! 0 | cmb (rw) | 1: La operación es combinatoria, por lo tanto solo se cargan vectores en el operando B. |
|
--! 0 | cmb (rw) | 1: La operación es combinatoria, por lo tanto cargan los primeros 3 valores en el Operando A y el |
|
|
--! | | de vectores en el operando B. |
|
--! | | 0: La operación no es combinatoria, se cargan vectores en los operandos A y B. |
|
--! | | 0: La operación no es combinatoria, se cargan vectores en los operandos A y B. |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! | | Configuración del Datapath, Interconexión del Pipeline Aritmético y Cadena de Carga |
|
--! | | Configuración del Datapath, Interconexión del Pipeline Aritmético y Cadena de Carga |
|
--! | | Dependiendo del valor de estos 3 bits se configura la operación a ejecutar. |
|
--! | | Dependiendo del valor de estos 3 bits se configura la operación a ejecutar. |
|
--! | | |
|
--! | | |
|
Line 689... |
Line 703... |
--! | | 001: Resta Vectorial |
|
--! | | 001: Resta Vectorial |
|
--! | | 110: Normalización Vectorial y cálculo de Magnitud Vectorial |
|
--! | | 110: Normalización Vectorial y cálculo de Magnitud Vectorial |
|
--! | | 100: Producto Punto |
|
--! | | 100: Producto Punto |
|
--! | | 111: Producto Simple |
|
--! | | 111: Producto Simple |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! | | En el caso de que dcs sea 110 (Normalización y Magnitud Vectorial) este par de bits indica que resultados |
|
|
--! | | escribir. Si dcs tiene un valor diferente a 110 se ignora este campo. |
|
|
--! | | |
|
|
--! [5:4] | vtsc (rw) | 00: Solo leer los resultados vectoriales. |
|
--! [5:4] | vtsc (rw) | 00: Solo leer los resultados vectoriales. |
|
--! | | 01: Solo leer los resultados escalares. |
|
--! | | 01: Solo leer los resultados escalares. |
|
--! | | 10: Solo leer los resultados vectoriales. |
|
--! | | 10: Solo leer los resultados vectoriales. |
|
--! | | 11: Leer los resultados escalares y vectoriales. |
|
--! | | 11: Leer los resultados escalares y vectoriales. |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! 6 | dma (rw) | 1: Modo DMA: Los datos que ingresan se leen desde la dirección FETCHSTART (BASE+0x08) y se escriben en |
|
|
--! | | la dirección SINKSTART (BASE+0x09). |
|
|
--! | | 0: Modo Arithmetic Pipeline: Los datos ingresan en grupos de a 6 valores para 2 vectores de 3 valores cada uno,|
|
|
--! | | cuando se usa en modo uno a uno (cmb=1), ó en grupos de 3 valores para 1 vector de 3 valores, |
|
|
--! | | pero con el operando A fijado con el valor de la primera carga de valores en modo combinatorio (cmb=1). |
|
|
--! | | De la misma manera que en modo DMA se cargan los operandos en la dirección FETCHSTART y se escriben |
|
|
--! | | los resultados en la dirección SINKSTART. |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! 7 | flag_fc(r)| 1: Al momento de generar una interrupción este bit se coloca en 1 si se cumplen las condiciones de |
|
|
--! | | descarga de datos de la memoria (revisar el net signal sflood_condition). Si se encuentra en uno se |
|
|
--! | | trataría de una inconsistencia puesto que la interrupción se dispara una vez se ha terminado |
|
|
--! | | de ejecutar una instrucción y el que la bandera este en uno significa que hay transacciones de |
|
|
--! | | descarga de datos desde la memoria pendientes. |
|
|
--! | | |
|
|
--! | | En general que cualquiera de estas banderas se coloque en uno es una señalizacion de error, puesto |
|
|
--! | | que una vez se ha terminado de ejecutar una instrucción no deben haber transacciones pendientes. |
|
|
--! | | La razón de ser de estas banderas es hacer depuración del hardware mas que del software. |
|
|
--! | | |
|
|
--! | | 0: Flood Condition off. |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! 8 | flag_dc(r)| 1: Error, la instrucción ya se ejecutó y hay datos transitando en el buffer de salida aun. |
|
|
--! | | 0: Drain Condition off. |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! 9 | wp(r) | 1: Error, la instrucción ya se ejecutó y hay datos transitando en el buffer de salida aun. |
|
|
--! | | 0: Write on Memory not pending. |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! 10 | pp(r) | 1: Error, la instrucción ya se ejecutón y hay datos transitando el pipeline aritmético. |
|
|
--! | | 0: Pipeline not pending. |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! 11 | pl(r) | 1: La carga de parametros no se completó. Esto por lo general pasa cuando uno va a realizar una |
|
|
--! | | operaci´n combinatoria y solo cargo el primer operando, el A, esto puede ocurrir porque por ejemplo |
|
|
--! | | se puede desear sumar un conjunto de vectores a un vector de referencia. Este vector de referencia puede |
|
|
--! | | estar en un area de memoria distinta, que el resto de los vectores. Por lo tanto el pseudo codigo para |
|
|
--! | | ejecutar una operación de este tipo seria: |
|
|
--! | | |
|
|
--! | | ld vect,add,cmb; //Resultados solo vectoriales, ejecutar operación suma en modo combinatorio |
|
|
--! | | ld &A; //Cargar la direccion del Vector A. |
|
|
--! | | ld 3; //Cargar 3 valores, o sea el Vector A. |
|
|
--! | | wait int; //Esperar a que se ejecute la interrupcion. Una vez se termine de ejecutar si la bandera|
|
|
--! | | //pl está en uno se vuelve a comenzar y se deshecha el dato que hay como |
|
|
--! | | //parámetro. Para este ejemplo se asume que está en uno |
|
|
--! | | ld &B; //Cargar la dirección donde se encuentran los vectores B |
|
|
--! | | ld &C; //Cargar la dirección donde se exribiran los resultados. |
|
|
--! | | ld 24; //Cargar los siguientes 24 valores a partir de &B correspondiente a 8 vectores |
|
|
--! | | //ejecutando 8 sumas vectoriales que se escribirín a apartir de &C |
|
|
--! | | wait int; //Esperar a que termine la ejecución de las sumas. |
|
|
--! | | |
|
|
--! | | 0: Los operandos se cargaron integros se cargo del todo y no hubo que desechar parametros. |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! 12 | dp (r) | 1: Error, la instrucción se termino y aun hay datos pendientes por ser descargados |
|
|
--! | | 0: No hay datos pendientes por ser descargados. |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! 13 | ap (r) | 1: Carga de direcciones en la interconexión aún está pendiente y la instrucció ya |
|
|
--! | | se ejecutó |
|
|
--! | | 0: No hay direcciones pendientes por cargar. |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! 14 | rlsc (rw) | 1: El sistema está configurado para resetear la recarga sincronizada de parámetros una vez |
|
--! 14 | rlsc (rw) | 1: El sistema está configurado para resetear la recarga sincronizada de parámetros una vez |
|
--! | | concluya la instrucción |
|
--! | | concluya la instrucción |
|
--! | | |
|
--! | | |
|
--! | | 0: El sistema está configurado para no resetear la cadena de sincronización de carga. |
|
--! | | 0: El sistema está configurado para no resetear la cadena de sincronización de carga. |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! 15 | rom (r) | 1: Los registros solo se pueden leer no se pueden escribir. |
|
--! 15 | rom (r) | 1: Los registros solo se pueden leer no se pueden escribir. Etsado SINK y SOURCE |
|
--! | | 0: Los registros se pueden leer y escribir. |
|
--! | | 0: Los registros se pueden leer y escribir. |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! [30:16] | nfetch(rw)| Cantidad de direcciones a cargar en la interconexón para realizar la posterior descarga de datos de la |
|
--! [30:16] | nfetch(rw)| Cantidad de direcciones a cargar en la interconexón para realizar la posterior descarga de datos de la |
|
--! | | memoria al RayTrac.
|
--! | | memoria al RayTrac.
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! 31 | irq | 1: Evento de interrupción. El usuario debe hacer clear de este bit para dar la interrupci&o;n por |
|
--! 31 | irq | 1: Evento de interrupción. El usuario debe hacer clear de este bit para dar la interrupci&o;n por |
|
--! | | por atendida. Este bit se pone en uno cuando el sistema pasa de estado TX a FETCH o FETCH a TX. |
|
--! | | por atendida. Este bit se pone en uno cuando el sistema pasa de estado TX a FETCH o FETCH a TX. |
|
--! | | |
|
--! | | |
|
--! | | 0: El RayTrac se encuentra en operación Normal. |
|
--! | | 0: El RayTrac se encuentra en operación Normal. |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------
|
--! Start Parameter Address (psadd) BASE_ADDRESS + 0x4 |
|
--! Result Vector Z component (reg_vz) BASE_ADDRESS + 0x4 |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! Result Vector Y component (reg_vy) BASE_ADDRESS + 0x8 |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! Result Vector X component (reg_vx) BASE_ADDRESS + 0xC |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! Result Vector Scalar component (reg_scalar) BASE_ADDRESS + 0x10 |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! Scratch Vector 00 (reg_scratch00) BASE_ADDRESS + 0x14 |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! [31:0] | sadd (rw) | Dirección de memoria donde se encuentra el primer parámetro de entrada. |
|
--! output Data Counter (reg_outputcounter) BASE_ADDRESS + 0x18 |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! Start Result Address (rsadd) BASE_ADDRESS + 0x8 |
|
--! Input Data Counter (reg_inputcounter) BASE_ADDRESS + 0x1C |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! [31:0] | rsadd (rw)| Dirección de memoria donde se encuentra el primer parámetro de entrada. |
|
--! Data Fetch Start Address (reg_fetchstart) BASE_ADDRESS + 0x20 |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! Scratch Register (screg) BASE_ADDRESS + 0x1C |
|
--! Data Write Start Address (reg_sinkstart) BASE_ADDRESS + 0x24 |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! [31:0] | screg (rw)| Dirección de memoria donde se pueden escribir y leer valores de 32 bits. |
|
--! Parameter Ax component (reg_ax) BASE_ADDRESS + 0x28 |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! Parameter Ay component (reg_ay) BASE_ADDRESS + 0x2C |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! Parameter Az component (reg_az) BASE_ADDRESS + 0x30 |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! Parameter Bx component (reg_bx) BASE_ADDRESS + 0x34 |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! Parameter By component (reg_by) BASE_ADDRESS + 0x38 |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
--! Parameter Bz component (reg_bz) BASE_ADDRESS + 0x3C |
|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end architecture;
|
|
|
|
|
No newline at end of file
|
No newline at end of file
|