FIFO Buffer Code


-- Name1:		Natkeeran 
-- Name2:		Praba 
-- Project:		FIFO Buffer
-- File:		ele758/intro6/FIFO_Buffer4.vhd 
-- Revision:		Final
-- Data:		Oct/18/2002

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
USE ieee.std_logic_unsigned.ALL;

ENTITY FIFO_Buffer4 IS
PORT(
		DataIn		:	IN STD_LOGIC_VECTOR(7 DOWNTO 0);
		LowWrtEn	:	IN STD_LOGIC;
		LowOutEn	:	IN STD_LOGIC;
		clk			:	IN STD_LOGIC;
		
		FullBuffer	:	OUT STD_LOGIC;
		EmptyBuffer	:	OUT STD_LOGIC;
		DataOut		:	OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
		Temp		:   IN  STD_LOGIC_VECTOR(5 DOWNTO 0));
END FIFO_Buffer4;

ARCHITECTURE Description OF FIFO_Buffer4 IS

TYPE FIFO_Buff IS ARRAY(0 TO 5) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL FIFO_Array	:	FIFO_Buff;

SIGNAL Write_ptr	:	INTEGER RANGE 0 TO 5 := 0;
SIGNAL Read_ptr		:	INTEGER RANGE 0 TO 5 := 0;
SIGNAL TempFull		:	STD_LOGIC;
SIGNAL TempEmpty	:	STD_LOGIC;

SIGNAL Last_wrt		: 	STD_LOGIC;
SIGNAL Last_rd		:	STD_LOGIC;

BEGIN    
    -- FIFO_FULL Check and Set Process
	-- Set the "FullBuffer" condition
	-- Set the "FullBuffer"'s temporary signal "TempFull" 
	-- When both "Write_ptr" and "Read_ptr" equal and last action was a write.
	-- This happens at clock event low to let know the status to the read routine 	

PROCESS(clk, LowOutEn)
BEGIN
	IF (clk'event AND clk='0') THEN

		IF(LowOutEn='0') THEN
			TempFull <= '0';
		ELSE
			IF((Write_ptr = Read_ptr) AND (Last_wrt='1')) THEN
				TempFull <= '1';

			ELSIF ((Last_rd='1') AND (TempFull='1')) THEN
				TempFull <= '0';
			ELSIF(Last_wrt='1' AND Last_rd='1') THEN
				TempFull <= '0';
			ELSE
				TempFull <= '0';
			END IF;
		END IF;
	END IF;
END PROCESS;	

	-- Writing Process:
	-- write when clock event HIGH
	-- write when not full
	-- increment as 0 1 2 3 4 5 0 1 2 3 4 5 
	-- If Last_rd is high set low Last_wrt,
	-- overwrite Last_wrt as high if actually writing take place 

PROCESS(clk,LowWrtEn)
	BEGIN
	IF(clk'event AND clk='1') THEN
		
	IF(Last_rd='1') THEN
				Last_wrt <= '0';
	END IF;		

		IF((LowWrtEn = '0') AND (TempFull = '0')) THEN
	    		FIFO_Array(Write_ptr) <= DataIn;
				Last_wrt <= '1';
											
	    		IF (Write_ptr < 5)THEN
	    			Write_ptr <= Write_ptr + 1;
				ELSE
	    		    Write_ptr <= 0;
	    		END IF;						
    	END IF;
	END IF;
	END PROCESS;
	
	-- FIFO_EMPTY Check and Set Process 
	-- Set EmptyBuffer 
	-- If both pointers are equal and last action is a read then set high TempEmpty
	-- If you are writing, set TempEmpty low
	-- TempEmpty='0' for some other conditions as shown below  
	
	PROCESS(clk, LowWrtEn)
	BEGIN
		IF(clk'EVENT AND clk='1') THEN
				
			IF(LowWrtEn='0') THEN
				TempEmpty <= '0';
			ELSE
				IF((Write_ptr=Read_ptr) AND (Last_rd='1')) THEN
						TempEmpty <= '1';
				ELSIF((Last_wrt= '1')and (TempEmpty = '1')) THEN
					TempEmpty <= '0';								
				ELSIF(Last_wrt='1' AND Last_rd='1') THEN
					TempEmpty <= '0';
				ELSE
					TempEmpty <= '0';
				END IF;
			END IF;		
		END IF;
	END PROCESS;		

	-- Reading Process	                 
	-- Read when not empty
	-- empty when Write_ptr=Read_ptr
	-- increment as 0 1 2 3 4 5 0 1 2 3 4 5
	-- If Last_wrt is high set low Last_rd,
	-- overwrite Last_rd as high if actually reading take place 

	PROCESS(clk, LowOutEn)
	BEGIN
		IF(clk'event AND clk='0')THEN 

		IF(Last_wrt='1') THEN
				Last_rd <= '0';
		END IF;		

		IF(LowOutEn='0' AND TempEmpty='0')THEN		
				DataOut <= FIFO_Array(Read_ptr);
				Last_rd <= '1';						
	
				IF (Read_ptr < 5)THEN
					Read_ptr <= Read_ptr + 1;			
				ELSE
					Read_ptr <= 0;
				END IF;	
		ELSIF(LowOutEn='0' AND TempEmpty='1') THEN
				DataOut <= "11111111";		
		END IF;
		END IF;
	END PROCESS;  

FullBuffer <= TempFull;
EmptyBuffer <= TempEmpty;

END Description;