|
|
|
|
|
LIBRARY ieee;
|
|
|
USE ieee.std_logic_1164.ALL;
|
|
|
USE ieee.numeric_std.ALL;
|
|
|
|
|
|
ENTITY DMA_SubSystem_GestionBuffer IS
|
|
|
GENERIC (
|
|
|
BUFFER_ADDR_SIZE : INTEGER := 32;
|
|
|
BUFFER_LENGTH_SIZE : INTEGER := 26);
|
|
|
PORT (
|
|
|
clk : IN STD_LOGIC;
|
|
|
rstn : IN STD_LOGIC;
|
|
|
run : IN STD_LOGIC;
|
|
|
--
|
|
|
buffer_new : IN STD_LOGIC;
|
|
|
buffer_addr : IN STD_LOGIC_VECTOR(BUFFER_ADDR_SIZE-1 DOWNTO 0);
|
|
|
buffer_length : IN STD_LOGIC_VECTOR(BUFFER_LENGTH_SIZE-1 DOWNTO 0); --in 64B
|
|
|
buffer_full : OUT STD_LOGIC;
|
|
|
buffer_full_err : OUT STD_LOGIC;
|
|
|
--
|
|
|
burst_send : IN STD_LOGIC;
|
|
|
burst_addr : OUT STD_LOGIC_VECTOR(BUFFER_ADDR_SIZE-1 DOWNTO 0)
|
|
|
);
|
|
|
END DMA_SubSystem_GestionBuffer;
|
|
|
|
|
|
|
|
|
ARCHITECTURE beh OF DMA_SubSystem_GestionBuffer IS
|
|
|
|
|
|
TYPE state_DMA_GestionBuffer IS (IDLE, ON_GOING);
|
|
|
SIGNAL state : state_DMA_GestionBuffer;
|
|
|
|
|
|
SIGNAL burst_send_counter : STD_LOGIC_VECTOR(BUFFER_LENGTH_SIZE-1 DOWNTO 0);
|
|
|
SIGNAL burst_send_counter_add1 : STD_LOGIC_VECTOR(BUFFER_LENGTH_SIZE-1 DOWNTO 0);
|
|
|
SIGNAL addr_shift : STD_LOGIC_VECTOR(BUFFER_ADDR_SIZE-1 DOWNTO 0);
|
|
|
|
|
|
BEGIN
|
|
|
addr_shift <= burst_send_counter & "000000";
|
|
|
burst_addr <= STD_LOGIC_VECTOR(unsigned(buffer_addr) + unsigned(addr_shift));
|
|
|
|
|
|
burst_send_counter_add1 <= STD_LOGIC_VECTOR(unsigned(burst_send_counter) + 1);
|
|
|
|
|
|
PROCESS (clk, rstn)
|
|
|
BEGIN -- PROCESS
|
|
|
IF rstn = '0' THEN -- asynchronous reset (active low)
|
|
|
burst_send_counter <= (OTHERS => '0');
|
|
|
state <= IDLE;
|
|
|
buffer_full <= '0';
|
|
|
buffer_full_err <= '0';
|
|
|
ELSIF clk'event AND clk = '1' THEN -- rising clock edge
|
|
|
CASE state IS
|
|
|
WHEN IDLE =>
|
|
|
burst_send_counter <= (OTHERS => '0');
|
|
|
buffer_full_err <= burst_send;
|
|
|
buffer_full <= '0';
|
|
|
IF buffer_new = '1' THEN
|
|
|
state <= ON_GOING;
|
|
|
END IF;
|
|
|
|
|
|
WHEN ON_GOING =>
|
|
|
buffer_full_err <= '0';
|
|
|
buffer_full <= '0';
|
|
|
IF burst_send = '1' THEN
|
|
|
IF unsigned(burst_send_counter_add1) < unsigned(buffer_length) THEN
|
|
|
burst_send_counter <= burst_send_counter_add1;
|
|
|
ELSE
|
|
|
buffer_full <= '1';
|
|
|
state <= IDLE;
|
|
|
END IF;
|
|
|
END IF;
|
|
|
|
|
|
WHEN OTHERS => NULL;
|
|
|
END CASE;
|
|
|
END IF;
|
|
|
END PROCESS;
|
|
|
|
|
|
END beh;
|
|
|
|