Line 89... |
Line 89... |
constant reg_vz : integer:=01;
|
constant reg_vz : integer:=01;
|
constant reg_vy : integer:=02;
|
constant reg_vy : integer:=02;
|
constant reg_vx : integer:=03;
|
constant reg_vx : integer:=03;
|
constant reg_scalar : integer:=04;
|
constant reg_scalar : integer:=04;
|
constant reg_nfetch : integer:=05;
|
constant reg_nfetch : integer:=05;
|
constant reg_outputcounter : integer:=06;
|
constant reg_timercounter : integer:=06;
|
constant reg_inputcounter : integer:=07;
|
constant reg_inputcounter : integer:=07;
|
constant reg_fetchstart : integer:=08;
|
constant reg_fetchstart : integer:=08;
|
constant reg_sinkstart : integer:=09;
|
constant reg_sinkstart : integer:=09;
|
constant reg_ax : integer:=10;
|
constant reg_ax : integer:=10;
|
constant reg_ay : integer:=11;
|
constant reg_ay : integer:=11;
|
Line 188... |
Line 188... |
signal zero : std_logic_vector(31 downto 0);
|
signal zero : std_logic_vector(31 downto 0);
|
|
|
--!High Register Bank Control Signals or AKA Load Sync Chain Control
|
--!High Register Bank Control Signals or AKA Load Sync Chain Control
|
signal sdownload_chain : download_chain;
|
signal sdownload_chain : download_chain;
|
signal sdownload_start : download_chain;
|
signal sdownload_start : download_chain;
|
signal srestart_chain : std_logic;
|
|
--!State Machine Hysteresis Control Signals
|
--!State Machine Hysteresis Control Signals
|
signal sdrain_condition : std_logic;
|
signal sdrain_condition : std_logic;
|
signal sdrain_burstcount : std_logic_vector(mb downto 0);
|
signal sdrain_burstcount : std_logic_vector(mb downto 0);
|
signal sdata_fetch_counter : std_logic_vector(reg_nfetch_high downto 0);
|
signal sdata_fetch_counter : std_logic_vector(reg_nfetch_high downto 0);
|
signal sburstcount_sink : std_logic_vector(mb downto 0);
|
signal sburstcount_sink : std_logic_vector(mb downto 0);
|
Line 344... |
Line 343... |
sdrain_burstcount <= '1'&zero(mb-1 downto 0);
|
sdrain_burstcount <= '1'&zero(mb-1 downto 0);
|
--! Flow Control: El drenado de datos continuará si el número de datos en la cola es mayor o igual a 2**mb O si hay muy pocos datos y no hay datos transitando por el pipeline.
|
--! Flow Control: El drenado de datos continuará si el número de datos en la cola es mayor o igual a 2**mb O si hay muy pocos datos y no hay datos transitando por el pipeline.
|
sdrain_condition <= '1';
|
sdrain_condition <= '1';
|
end if;
|
end if;
|
|
|
--! Restart param load chain
|
|
srestart_chain <= sreg_block(reg_ctrl)(reg_ctrl_irq) and sreg_block(reg_ctrl)(reg_ctrl_rlsc);
|
|
|
|
--! Data dumpster: Descaratar dato de upload una vez la interconexión haya enganchado el dato.
|
--! 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';
|
Line 384... |
Line 380... |
sreg_block(reg_fetchstart) <= (others => '0');
|
sreg_block(reg_fetchstart) <= (others => '0');
|
--! Control and Status Register
|
--! Control and Status Register
|
sreg_block(reg_ctrl) <= (others => '0');
|
sreg_block(reg_ctrl) <= (others => '0');
|
--! Contador Overall
|
--! Contador Overall
|
sreg_block(reg_inputcounter) <= (others => '0');
|
sreg_block(reg_inputcounter) <= (others => '0');
|
sreg_block(reg_outputcounter) <= (others => '0');
|
-- sreg_block(reg_timercounter) <= (others => '0');
|
--! Address Fetch Counter
|
--! Address Fetch Counter
|
sreg_block(reg_nfetch) <= (others => '0');
|
sreg_block(reg_nfetch) <= (others => '0');
|
|
|
|
|
elsif clk'event and clk='1' then
|
elsif clk'event and clk='1' then
|
Line 396... |
Line 392... |
--! Nevermind the State, discount the incoming valid data counter.
|
--! Nevermind the State, discount the incoming valid data counter.
|
sdata_fetch_counter <= sdata_fetch_counter-master_readdatavalid;
|
sdata_fetch_counter <= sdata_fetch_counter-master_readdatavalid;
|
|
|
--! Debug Counter.
|
--! Debug Counter.
|
sreg_block(reg_inputcounter) <= sreg_block(reg_inputcounter) + master_readdatavalid;
|
sreg_block(reg_inputcounter) <= sreg_block(reg_inputcounter) + master_readdatavalid;
|
sreg_block(reg_outputcounter) <= sreg_block(reg_outputcounter) + soutb_ack;
|
|
|
--!Timer Counter.
|
|
-- case sm is
|
|
-- when IDLE =>
|
|
-- sreg_block(reg_timercounter) <= sreg_block(reg_timercounter) + 0;
|
|
-- when others =>
|
|
-- sreg_block(reg_timercounter) <= sreg_block(reg_timercounter) + 1;
|
|
-- end case;
|
|
|
--! Flags
|
--! Flags
|
|
|
|
|
case sm is
|
case sm is
|
Line 504... |
Line 507... |
--! Solo se permitira escribir en el registro de control si no hay una interrupción activa o si la hay solamente si se esta intentando desactivar la interrupci´n
|
--! Solo se permitira escribir en el registro de control si no hay una interrupción activa o si la hay solamente si se esta intentando desactivar la interrupci´n
|
if sreg_block(reg_ctrl)(reg_ctrl_irq)='0' or sslave_writedata(reg_ctrl_irq)='0' then
|
if sreg_block(reg_ctrl)(reg_ctrl_irq)='0' or sslave_writedata(reg_ctrl_irq)='0' then
|
sreg_block(reg_ctrl)<= sslave_writedata;
|
sreg_block(reg_ctrl)<= sslave_writedata;
|
end if;
|
end if;
|
when x"5" => sreg_block(reg_nfetch) <= sslave_writedata;
|
when x"5" => sreg_block(reg_nfetch) <= sslave_writedata;
|
when x"6" => sreg_block(reg_outputcounter) <= sslave_writedata;
|
-- when x"6" => sreg_block(reg_timercounter) <= sslave_writedata;
|
when x"7" => sreg_block(reg_inputcounter) <= sslave_writedata;
|
when x"7" => sreg_block(reg_inputcounter) <= sslave_writedata;
|
when x"8" => sreg_block(reg_fetchstart) <= sslave_writedata;
|
when x"8" => sreg_block(reg_fetchstart) <= sslave_writedata;
|
when x"9" => sreg_block(reg_sinkstart) <= sslave_writedata;
|
when x"9" => sreg_block(reg_sinkstart) <= sslave_writedata;
|
when others => null;
|
when others => null;
|
end case;
|
end case;
|
Line 519... |
Line 522... |
|
|
--! Flow Control: Existe un número de descargas programadas por el sistema, comenzar a realizarlas.
|
--! Flow Control: Existe un número de descargas programadas por el sistema, comenzar a realizarlas.
|
--! Ir al estado Source.
|
--! Ir al estado Source.
|
sm <= SOURCE;
|
sm <= SOURCE;
|
sreg_block(reg_ctrl)(reg_ctrl_rom) <= '1';
|
sreg_block(reg_ctrl)(reg_ctrl_rom) <= '1';
|
|
|
else
|
else
|
sreg_block(reg_ctrl)(reg_ctrl_rom) <= '0';
|
sreg_block(reg_ctrl)(reg_ctrl_rom) <= '0';
|
|
|
end if;
|
end if;
|
end if;
|
end if;
|
Line 646... |
Line 648... |
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' and sreg_block(reg_ctrl)(reg_ctrl_dma)='0' then
|
if master_readdatavalid='1' and sreg_block(reg_ctrl)(reg_ctrl_dma)='0' and (sreg_block(reg_ctrl)(reg_ctrl_irq)='0' or sreg_block(reg_ctrl)(reg_ctrl_rlsc)='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 DWAX | DWAXBX =>
|
when DWAX | DWAXBX =>
|
--! 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 702... |
Line 704... |
sdownload_chain <= DWAX;
|
sdownload_chain <= DWAX;
|
end if;
|
end if;
|
when others =>
|
when others =>
|
null;
|
null;
|
end case;
|
end case;
|
|
--! Ok operation check if operation has ended. If that's the case.
|
if srestart_chain='1' then
|
elsif sreg_block(reg_ctrl)(reg_ctrl_irq)='1' and sreg_block(reg_ctrl)(reg_ctrl_rlsc)='1' then
|
sdownload_chain <= sdownload_start;
|
sdownload_chain <= sdownload_start;
|
end if;
|
end if;
|
|
|
end if;
|
|
end if;
|
end if;
|
end process;
|
end process;
|
--! *************************************************************************************************************************************************************************************************************************************************************
|
--! *************************************************************************************************************************************************************************************************************************************************************
|
--! AVALON MEMORY MAPPED MASTER FINISHED
|
--! AVALON MEMORY MAPPED MASTER FINISHED
|
--! *************************************************************************************************************************************************************************************************************************************************************
|
--! *************************************************************************************************************************************************************************************************************************************************************
|
Line 724... |
Line 724... |
begin
|
begin
|
if rst=rstMasterValue then
|
if rst=rstMasterValue then
|
for i in reg_scalar downto reg_vz loop
|
for i in reg_scalar downto reg_vz loop
|
sreg_block(i) <= (others => '0');
|
sreg_block(i) <= (others => '0');
|
end loop;
|
end loop;
|
|
sreg_block(reg_timercounter) <= (others => '0');
|
slave_readdata <= (others => '0');
|
slave_readdata <= (others => '0');
|
sslave_address <= (others => '0');
|
sslave_address <= (others => '0');
|
sslave_writedata <= (others => '0');
|
sslave_writedata <= (others => '0');
|
sslave_write <= '0';
|
sslave_write <= '0';
|
sslave_read <= '0';
|
sslave_read <= '0';
|
Line 738... |
Line 738... |
sslave_address <= slave_address;
|
sslave_address <= slave_address;
|
sslave_write <= slave_write;
|
sslave_write <= slave_write;
|
sslave_read <= slave_read;
|
sslave_read <= slave_read;
|
sslave_writedata <= slave_writedata;
|
sslave_writedata <= slave_writedata;
|
|
|
for i in reg_scalar downto reg_scalar loop
|
if sslave_write='1' and sslave_address=reg_timercounter then
|
if sslave_address=i then
|
sreg_block(reg_timercounter) <= sslave_writedata;
|
if sslave_write='1' then
|
else
|
sreg_block(i) <= sslave_writedata;
|
sreg_block(reg_timercounter) <= sreg_block(reg_timercounter)+1;
|
end if;
|
end if;
|
|
|
|
if sslave_write='1' and sslave_address=reg_scalar then
|
|
sreg_block(reg_scalar) <= sslave_writedata;
|
|
else
|
|
sreg_block(reg_scalar) <= sreg_block(reg_scalar);
|
end if;
|
end if;
|
end loop;
|
|
|
-- for i in reg_scalar downto reg_scalar loop
|
|
-- if sslave_address=i then
|
|
-- if sslave_write='1' then
|
|
-- sreg_block(i) <= sslave_writedata;
|
|
-- end if;
|
|
-- end if;
|
|
-- end loop;
|
for i in 15 downto 0 loop
|
for i in 15 downto 0 loop
|
if sslave_address=i then
|
if sslave_address=i then
|
if sslave_read='1' then
|
if sslave_read='1' then
|
|
|
if (i<10 and i>3) or i=0 then
|
if (i<10 and i>3) or i=0 then
|
Line 886... |
Line 898... |
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! Result Vector Scalar component (reg_scalar) BASE_ADDRESS + 0x10 |
|
--! Result Vector Scalar component (reg_scalar) BASE_ADDRESS + 0x10 |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! Scratch Vector 00 (reg_nfetch) BASE_ADDRESS + 0x14 |
|
--! Scratch Vector 00 (reg_nfetch) BASE_ADDRESS + 0x14 |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! output Data Counter (reg_outputcounter) BASE_ADDRESS + 0x18 |
|
--! output Data Counter (reg_timercounter) BASE_ADDRESS + 0x18 |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! Input Data Counter (reg_inputcounter) BASE_ADDRESS + 0x1C |
|
--! Input Data Counter (reg_inputcounter) BASE_ADDRESS + 0x1C |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--! Data Fetch Start Address (reg_fetchstart) BASE_ADDRESS + 0x20 |
|
--! Data Fetch Start Address (reg_fetchstart) BASE_ADDRESS + 0x20 |
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|
--!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
|