##// END OF EJS Templates
Few fixes....
Few fixes. Whole LFR simulation WIP.

File last commit:

r416:92057c9e9a3b JC
r682:c53e1b6b3045 default
Show More
lpp_FIFO_4_Shared_headreg_latency_0.vhd
145 lines | 5.2 KiB | text/x-vhdl | VhdlLexer
/ lib / lpp / lpp_memory / lpp_FIFO_4_Shared_headreg_latency_0.vhd
------------------------------------------------------------------------------
-- This file is a part of the LPP VHDL IP LIBRARY
-- Copyright (C) 2009 - 2012, Laboratory of Plasmas Physic - CNRS
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
------------------------------------------------------------------------------
-- Author : Jean-christophe PELLION
-- Mail : jean-christophe.pellion@lpp.polytechnique.fr
------------------------------------------------------------------------------
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;
LIBRARY techmap;
USE techmap.gencomp.ALL;
ENTITY lpp_fifo_4_shared_headreg_latency_0 IS
PORT(
clk : IN STD_LOGIC;
rstn : IN STD_LOGIC;
---------------------------------------------------------------------------
run : IN STD_LOGIC;
---------------------------------------------------------------------------
o_empty_almost : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --occupancy is lesser than 16 * 32b
o_empty : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
o_data_ren : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
o_rdata_0 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); --
o_rdata_1 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); --
o_rdata_2 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); --
o_rdata_3 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); --
---------------------------------------------------------------------------
i_empty_almost : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
i_empty : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
i_data_ren : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --
i_rdata : IN STD_LOGIC_VECTOR(31 DOWNTO 0)
);
END ENTITY;
ARCHITECTURE beh OF lpp_fifo_4_shared_headreg_latency_0 IS
TYPE REG_HEAD_TYPE IS ARRAY (3 DOWNTO 0) OF STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL reg_head_data : REG_HEAD_TYPE;
SIGNAL reg_head_full : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL i_data_ren_pre : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL o_data_ren_pre : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL i_data_ren_s_temp : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL i_data_ren_s : STD_LOGIC_VECTOR(3 DOWNTO 0); -- todo
SIGNAL i_empty_reg : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
--i_data_ren : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --
i_data_ren <= i_data_ren_s;
o_empty_almost <= i_empty_almost; --TODO
o_rdata_0 <= i_rdata WHEN o_data_ren_pre(0) = '0' AND o_data_ren(0) = '0' ELSE reg_head_data(0) ;
o_rdata_1 <= i_rdata WHEN o_data_ren_pre(1) = '0' AND o_data_ren(1) = '0' ELSE reg_head_data(1) ;
o_rdata_2 <= i_rdata WHEN o_data_ren_pre(2) = '0' AND o_data_ren(2) = '0' ELSE reg_head_data(2) ;
o_rdata_3 <= i_rdata WHEN o_data_ren_pre(3) = '0' AND o_data_ren(3) = '0' ELSE reg_head_data(3) ;
i_data_ren_s(0) <= i_data_ren_s_temp(0);
i_data_ren_s(1) <= i_data_ren_s_temp(1) WHEN i_data_ren_s_temp(0) = '1' ELSE '1';
i_data_ren_s(2) <= i_data_ren_s_temp(2) WHEN i_data_ren_s_temp(1 DOWNTO 0) = "11" ELSE '1';
i_data_ren_s(3) <= i_data_ren_s_temp(3) WHEN i_data_ren_s_temp(2 DOWNTO 0) = "111" ELSE '1';
each_fifo: FOR I IN 3 DOWNTO 0 GENERATE
o_empty(I) <= NOT reg_head_full(I);
-- i_data_ren_pre(I) <= i_data_ren_s(I);
PROCESS (clk, rstn)
BEGIN
IF rstn = '0' THEN
reg_head_data(I) <= (OTHERS => '0');
i_data_ren_pre(I) <= '1';
reg_head_full(I) <= '0';
o_data_ren_pre(I) <= '1';
ELSIF clk'event AND clk = '1' THEN
o_data_ren_pre(I) <= o_data_ren(I) ;
IF i_data_ren_pre(I) = '0' THEN
reg_head_data(I) <= i_rdata;
END IF;
i_data_ren_pre(I) <= i_data_ren_s(I);
-- IF i_data_ren_pre(I) = '0' THEN
IF i_data_ren_s(I) = '0' THEN
reg_head_full(I) <= '1';
-- ELSIF o_data_ren_pre(I) = '0' THEN
ELSIF o_data_ren(I) = '0' THEN
reg_head_full(I) <= '0';
END IF;
END IF;
END PROCESS;
i_data_ren_s_temp(I) <= '1' WHEN i_empty_reg(I) = '1' ELSE
'0' WHEN o_data_ren(I) = '0' ELSE
'0' WHEN reg_head_full(I) = '0' ELSE
'1';
PROCESS (clk, rstn)
BEGIN
IF rstn = '0' THEN
i_empty_reg(I) <= '1';
ELSIF clk'event AND clk = '1' THEN
i_empty_reg(I) <= i_empty(I);
END IF;
END PROCESS;
END GENERATE each_fifo;
END ARCHITECTURE;