LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; ENTITY MS_control IS PORT ( clk : IN STD_LOGIC; rstn : IN STD_LOGIC; -- IN current_status_ms : IN STD_LOGIC_VECTOR(49 DOWNTO 0); -- TIME(47 .. 0) & Matrix_type(1..0) -- IN fifo_in_lock : OUT STD_LOGIC_VECTOR(4 DOWNTO 0); fifo_in_data : IN STD_LOGIC_VECTOR(32*5-1 DOWNTO 0); fifo_in_full : IN STD_LOGIC_VECTOR(4 DOWNTO 0); fifo_in_empty : IN STD_LOGIC_VECTOR(4 DOWNTO 0); fifo_in_ren : OUT STD_LOGIC_VECTOR(4 DOWNTO 0); fifo_in_reuse : OUT STD_LOGIC_VECTOR(4 DOWNTO 0); -- OUT fifo_out_data : OUT STD_LOGIC_VECTOR(32*2-1 DOWNTO 0); fifo_out_ren : IN STD_LOGIC_VECTOR(1 DOWNTO 0); fifo_out_empty : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); -- OUT current_status_component : OUT STD_LOGIC_VECTOR(53 DOWNTO 0); -- TIME(47 .. 0) & -- Matrix_type (1..0) -- ComponentType (3..0) correlation_start : OUT STD_LOGIC; correlation_auto : OUT STD_LOGIC; -- 1 => auto correlation / 0 => inter correlation correlation_done : IN STD_LOGIC ); END MS_control; ARCHITECTURE beh OF MS_control IS TYPE fsm_control_MS IS (WAIT_DATA, CORRELATION_ONGOING); SIGNAL state : fsm_control_MS; SUBTYPE fifo_pointer IS INTEGER RANGE 0 TO 4; SIGNAL fifo_1 : fifo_pointer; SIGNAL fifo_2 : fifo_pointer; SIGNAL fifo_in_lock_s : STD_LOGIC_VECTOR(4 DOWNTO 0); SIGNAL fifo_in_reuse_s : STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN -- beh fifo_in_lock <= fifo_in_lock_s; fifo_in_reuse <= fifo_in_reuse_s; PROCESS (clk, rstn) BEGIN IF rstn = '0' THEN state <= WAIT_DATA; fifo_1 <= 0; fifo_2 <= 0; fifo_in_lock_s <= (OTHERS => '0'); fifo_in_reuse_s <= (OTHERS => '0'); correlation_start <= '0'; correlation_auto <= '0'; current_status_component <= (OTHERS => '0'); ELSIF clk'event AND clk = '1' THEN CASE state IS WHEN WAIT_DATA => fifo_in_reuse_s <= (OTHERS => '0'); IF fifo_in_full(fifo_1) = '1' AND fifo_in_full(fifo_2) = '1' THEN fifo_in_lock_s(fifo_1) <= '1'; fifo_in_lock_s(fifo_2) <= '1'; correlation_start <= '1'; IF fifo_1 = fifo_2 THEN correlation_auto <= '1'; END IF; state <= CORRELATION_ONGOING; IF fifo_1 = 0 AND fifo_2 = 0 THEN current_status_component(53 DOWNTO 4) <= current_status_ms; END IF; CASE fifo_1 IS WHEN 0 => current_status_component(3 DOWNTO 0) <= STD_LOGIC_VECTOR(to_unsigned( fifo_2,4)); WHEN 1 => current_status_component(3 DOWNTO 0) <= STD_LOGIC_VECTOR(to_unsigned(4+fifo_2,4)); WHEN 2 => current_status_component(3 DOWNTO 0) <= STD_LOGIC_VECTOR(to_unsigned(7+fifo_2,4)); WHEN 3 => current_status_component(3 DOWNTO 0) <= STD_LOGIC_VECTOR(to_unsigned(9+fifo_2,4)); WHEN 4 => current_status_component(3 DOWNTO 0) <= STD_LOGIC_VECTOR(to_unsigned(14 ,4)); WHEN OTHERS => NULL; END CASE; --current_status_component(3 DOWNTO 0) <= STD_LOGIC_VECTOR(to_unsigned(fifo_1*5+fifo_2,4)); END IF; WHEN CORRELATION_ONGOING => correlation_start <= '0'; correlation_auto <= '0'; IF correlation_done = '1' THEN state <= WAIT_DATA; IF fifo_2 = 4 THEN fifo_in_lock_s(fifo_1) <= '0'; IF fifo_1 = 4 THEN fifo_1 <= 0; fifo_2 <= 0; ELSE fifo_in_reuse_s(fifo_2) <= '1'; fifo_1 <= fifo_1 + 1; fifo_2 <= fifo_1 + 1; END IF; ELSE fifo_in_reuse_s(fifo_2) <= '1'; fifo_in_reuse_s(fifo_1) <= '1'; fifo_2 <= fifo_2 + 1; END IF; END IF; WHEN OTHERS => NULL; END CASE; END IF; END PROCESS; fifo_out_data(31 DOWNTO 0) <= fifo_in_data(32*1-1 DOWNTO 32*0) WHEN fifo_1 = 0 ELSE fifo_in_data(32*2-1 DOWNTO 32*1) WHEN fifo_1 = 1 ELSE fifo_in_data(32*3-1 DOWNTO 32*2) WHEN fifo_1 = 2 ELSE fifo_in_data(32*4-1 DOWNTO 32*3) WHEN fifo_1 = 3 ELSE fifo_in_data(32*5-1 DOWNTO 32*4);-- WHEN fifo_1 = 4 fifo_out_data(63 DOWNTO 32) <= fifo_in_data(32*1-1 DOWNTO 32*0) WHEN fifo_2 = 0 ELSE fifo_in_data(32*2-1 DOWNTO 32*1) WHEN fifo_2 = 1 ELSE fifo_in_data(32*3-1 DOWNTO 32*2) WHEN fifo_2 = 2 ELSE fifo_in_data(32*4-1 DOWNTO 32*3) WHEN fifo_2 = 3 ELSE fifo_in_data(32*5-1 DOWNTO 32*4);-- WHEN fifo_2 = 4 fifo_out_empty(0) <= fifo_in_empty(0) WHEN fifo_1 = 0 ELSE fifo_in_empty(1) WHEN fifo_1 = 1 ELSE fifo_in_empty(2) WHEN fifo_1 = 2 ELSE fifo_in_empty(3) WHEN fifo_1 = 3 ELSE fifo_in_empty(4); fifo_out_empty(1) <= fifo_in_empty(0) WHEN fifo_2 = 0 ELSE fifo_in_empty(1) WHEN fifo_2 = 1 ELSE fifo_in_empty(2) WHEN fifo_2 = 2 ELSE fifo_in_empty(3) WHEN fifo_2 = 3 ELSE fifo_in_empty(4); all_fifo: FOR I IN 0 TO 4 GENERATE fifo_in_ren(I) <= fifo_out_ren(0) WHEN fifo_1 = I ELSE fifo_out_ren(1) WHEN fifo_2 = I ELSE '1'; END GENERATE all_fifo; END beh;