Line 26... |
Line 26... |
use ieee.std_logic_unsigned.all;
|
use ieee.std_logic_unsigned.all;
|
|
|
use work.arithpack.all;
|
use work.arithpack.all;
|
|
|
entity sm is
|
entity sm is
|
generic (
|
|
width : integer := 32;
|
|
widthadmemblock : integer := 9
|
|
--!external_readable_widthad :
|
|
);
|
|
port (
|
port (
|
|
|
--! Señales normales de secuencia.
|
--! Señales normales de secuencia.
|
clk,rst: in std_logic;
|
clk,rst: in std_logic;
|
--! Vector con las instrucción codficada
|
--! Vector con las instrucción codficada
|
instrQq:in std_logic_vector(width-1 downto 0);
|
instrQq:in std_logic_vector(floatwidth-1 downto 0);
|
--! Señal de cola vacia.
|
--! Señal de cola vacia.
|
instrQ_empty:in std_logic;
|
instrQ_empty:in std_logic;
|
|
|
|
|
adda,addb:out std_logic_vector (widthadmemblock-1 downto 0);
|
adda,addb:out std_logic_vector (widthadmemblock-1 downto 0);
|
Line 99... |
Line 94... |
--! Código UCA, pero en la etapa DPC: La diferencia es que UCA en la etapa DPC, decodifica el datapath dentro del pipeline aritmético.
|
--! Código UCA, pero en la etapa DPC: La diferencia es que UCA en la etapa DPC, decodifica el datapath dentro del pipeline aritmético.
|
dpc_uca <= s_dpc_uca;
|
dpc_uca <= s_dpc_uca;
|
|
|
|
|
--! Bloques asignados en la instrucci´øn
|
--! Bloques asignados en la instrucci´øn
|
s_block_start_a <= instrQq(width-4 downto width-8);
|
s_block_start_a <= instrQq(floatwidth-4 downto floatwidth-8);
|
s_block_end_a <= instrQq(width-9 downto width-13);
|
s_block_end_a <= instrQq(floatwidth-9 downto floatwidth-13);
|
|
|
s_block_start_b <= instrQq(width-14 downto width-18);
|
s_block_start_b <= instrQq(floatwidth-14 downto floatwidth-18);
|
s_block_end_b <= instrQq(width-19 downto width-23);
|
s_block_end_b <= instrQq(floatwidth-19 downto floatwidth-23);
|
|
|
--! Campo que define si la instrucción es combinatoria
|
--! Campo que define si la instrucción es combinatoria
|
s_combinatory <= instrQq(width-24);
|
s_combinatory <= instrQq(floatwidth-24);
|
|
|
--! Campo que define cuantos clocks debe esperar el sistema, despues de que se ejecuta una instrucción, para que el pipeline aritmético quede vacio.
|
--! Campo que define cuantos clocks debe esperar el sistema, despues de que se ejecuta una instrucción, para que el pipeline aritmético quede vacio.
|
s_delay_field <= instrQq(width-25 downto width-32);
|
s_delay_field <= instrQq(floatwidth-25 downto floatwidth-32);
|
|
|
--! UCA code, código con la instrucción a ejecutar.
|
--! UCA code, código con la instrucción a ejecutar.
|
s_instr_uca <= instrQq(31 downto 29);
|
s_instr_uca <= instrQq(31 downto 29);
|
|
|
--! Address Counters
|
--! Address Counters
|
|
--!TBXINSTANCESTART
|
counterA:customCounter
|
counterA:customCounter
|
generic map ("YES","NO","NO","YES",4,9)
|
generic map (
|
port map (clk,rst,s_go_a,s_set_a,s_block_start_a,s_block_end_a,open,s_eb_a,s_eq_a,adda);
|
EOBFLAG => "YES",
|
|
ZEROFLAG => "NO",
|
|
BACKWARDS => "NO",
|
|
EQUALFLAG => "YES",
|
|
subwidth => 4,
|
|
width => 9
|
|
)
|
|
port map (
|
|
clk => clk,
|
|
rst => rst,
|
|
go => s_go_a,
|
|
set => s_set_a,
|
|
setValue => s_block_start_a,
|
|
cmpBlockValue => s_block_end_a,
|
|
zero_flag => open,
|
|
eob_flag => s_eb_a,
|
|
eq_flag => s_eq_a,
|
|
count => adda
|
|
);
|
|
--!TBXINSTANCEEND
|
|
--!TBXINSTANCESTART
|
counterB:customCounter
|
counterB:customCounter
|
generic map ("YES","NO","NO","YES",4,9)
|
generic map (
|
port map (clk,rst,s_go_b,s_set_b,s_block_start_b,s_block_end_b,open,s_eb_b,s_eq_b,addb);
|
EOBFLAG => "YES",
|
|
ZEROFLAG => "NO",
|
|
BACKWARDS => "NO",
|
|
EQUALFLAG => "YES",
|
|
subwidth => 4,
|
|
width => 9
|
|
)
|
|
port map (
|
|
clk => clk,
|
|
rst => rst,
|
|
go => s_go_b,
|
|
set => s_set_b,
|
|
setValue => s_block_start_b,
|
|
cmpBlockValue => s_block_end_b,
|
|
zero_flag => open,
|
|
eob_flag => s_eb_b,
|
|
eq_flag => s_eq_b,
|
|
count => addb
|
|
);
|
|
--!TBXINSTANCEEND
|
|
--!TBXINSTANCESTART
|
counterDly:customCounter
|
counterDly:customCounter
|
generic map("NO","YES","YES","NO",0,5)
|
generic map(
|
port map (clk,rst,s_go_delay,s_set_dly,s_delay_field(4 downto 0),"00000",s_zeroFlag_delay,open,open,open);
|
EOBFLAG => "NO",
|
|
ZEROFLAG => "YES",
|
|
BACWARDS => "YES",
|
|
EQUALFLAG => "NO",
|
|
width => 5,
|
|
subwidth => 0
|
|
|
|
)
|
|
port map (
|
|
clk => clk,
|
|
rst => rst,
|
|
go => s_go_delay,
|
|
set => s_set_dly,
|
|
setValue => s_delay_field(4 downto 0),
|
|
cmpBlockValue => "00000",
|
|
zero_flag => s_zeroFlag_delay,
|
|
eob_flag => open,
|
|
eq_flag => open,
|
|
count => open
|
|
);
|
|
--!TBXINSTANCEEND
|
|
|
sm_comb:
|
sm_comb:
|
process (s_state, full_r,s_eb_b,s_combinatory,s_zeroFlag_delay,s_eq_b,s_eb_a,s_eq_a,instrQ_empty)
|
process (s_state, full_r,s_eb_b,s_combinatory,s_zeroFlag_delay,s_eq_b,s_eb_a,s_eq_a,instrQ_empty)
|
begin
|
begin
|
--!Señal de play/pause del contador de direcciones para el parámetro B/D.
|
--!Señal de play/pause del contador de direcciones para el parámetro B/D.
|