LIbrary IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
ENTITY FIFO_TEST IS
-- GENERIC( SIZE: INTEGER:= 16;
-- WIDE: INTEGER:= 4
-- );
PORT(
CLK,RESET,WRITE_EN,READ_EN: IN STD_LOGIC;
DATA_IN: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
DATA_OUT: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
ARRAY_COUNT: OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
QUEUE_EMPTY,QUEUE_FULL: OUT STD_LOGIC;
WRAP: BUFFER STD_LOGIC
);
END FIFO_TEST;
ARCHITECTURE BEHAVIOR OF FIFO_TEST IS
COMPONENT QUEUE_ARRAY
PORT( WRITE_EN,CLK: IN STD_LOGIC;
DATA_IN: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
DATA_OUT: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
ADDR: IN STD_LOGIC_VECTOR(2 DOWNTO 0)
);
END COMPONENT;
SIGNAL START_POINTER: STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL END_POINTER: STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL COUNTER: STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL WRITE_ENABLE_S: STD_LOGIC;
SIGNAL ADDR_S: STD_LOGIC_VECTOR(2 DOWNTO 0);
--SIGNAL WRAP: STD_LOGIC;
SIGNAL QUEUE_FULL_S: STD_LOGIC;
SIGNAL QUEUE_EMPTY_S: STD_LOGIC;
BEGIN
FifoRam : QUEUE_ARRAY
PORT MAP(
WRITE_EN => WRITE_ENABLE_S,
CLK => CLK,
DATA_IN => DATA_IN,
DATA_OUT => DATA_OUT,
ADDR => START_POINTER
);
PROCESS(CLK,RESET)
BEGIN
IF (RESET = '1') THEN
START_POINTER <= (OTHERS=>'0');
END_POINTER <= (OTHERS=>'0');
COUNTER <= (OTHERS=>'0');
ELSIF(RISING_EDGE(CLK)) THEN
IF(WRITE_EN = '1' AND WRAP = '0' AND READ_EN = '0') THEN
IF(COUNTER = "11111111") THEN
START_POINTER <= (OTHERS => '0');
END_POINTER <= END_POINTER + 1;
WRAP <= '1';
ELSE
START_POINTER <= START_POINTER + 1;
COUNTER <= COUNTER + 1;
END IF;
END IF;
IF(WRITE_EN = '1' AND WRAP ='1' AND READ_EN ='0') THEN
IF(END_POINTER = "11111111") THEN
END_POINTER <= (OTHERS => '0');
ELSIF(START_POINTER = "11111111") THEN
START_POINTER <= (OTHERS =>'0');
ELSE
START_POINTER <= START_POINTER + 1;
END_POINTER <= END_POINTER + 1;
END IF;
END IF;
IF(READ_EN = '1' AND WRITE_EN ='0') THEN
IF(START_POINTER = END_POINTER) THEN
QUEUE_EMPTY_S <= '1';
ELSE
START_POINTER <= START_POINTER - 1;
COUNTER <= COUNTER - 1;
END IF;
IF(COUNTER = 0) THEN
QUEUE_EMPTY_S <= '1';
ELSE
QUEUE_EMPTY_S <= '0';
END IF;
END IF;
END IF;
END PROCESS;
-----------------------------------------------------------
-- Combinatorial Logic
-----------------------------------------------------------
ARRAY_COUNT <= COUNTER;
WRAP <= '1' WHEN (COUNTER = "11111111") ELSE '0';
QUEUE_FULL <= '1' WHEN (COUNTER = "11111111") ELSE '0';
QUEUE_EMPTY <= QUEUE_EMPTY_S;
WRITE_ENABLE_S <= '1' WHEN (WRITE_EN = '1') ELSE '0';
------------------------------------------------------------
END BEHAVIOR;