DMA_SubSystem_GestionBuffer.vhd
76 lines
| 2.4 KiB
| text/x-vhdl
|
VhdlLexer
pellion
|
r435 | |||
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; | ||||
pellion
|
r611 | -- run : IN STD_LOGIC; | ||
pellion
|
r435 | -- | ||
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 | ||||
pellion
|
r443 | IF unsigned(burst_send_counter_add1) < unsigned(buffer_length) THEN | ||
pellion
|
r435 | 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; | ||||