|
|
-- ICI_EGSE_PROTOCOL.vhd
|
|
|
-- ICI_EGSE_PROTOCOL.vhd
|
|
|
library IEEE;
|
|
|
use IEEE.std_logic_1164.all;
|
|
|
use IEEE.numeric_std.all;
|
|
|
|
|
|
entity ICI_EGSE_PROTOCOL is
|
|
|
generic(WordSize : integer := 8;WordCnt : integer :=144;MinFCount : integer := 64;Simu : integer :=0);
|
|
|
port(
|
|
|
clk : in std_logic;
|
|
|
reset : in std_logic;
|
|
|
WEN : in std_logic;
|
|
|
WordCnt_in : in integer range 0 to WordCnt-1;
|
|
|
MinfCnt_in : in integer range 0 to MinFCount-1;
|
|
|
DATAIN : in std_logic_vector (WordSize-1 downto 0);
|
|
|
FULL : in std_logic;
|
|
|
WR : out std_logic;
|
|
|
DATAOUT : out std_logic_vector (WordSize-1 downto 0)
|
|
|
);
|
|
|
end ICI_EGSE_PROTOCOL;
|
|
|
|
|
|
|
|
|
architecture ar_ICI_EGSE_PROTOCOL of ICI_EGSE_PROTOCOL is
|
|
|
|
|
|
type DATA_pipe_t is array(NATURAL RANGE <>) of std_logic_vector (WordSize-1 downto 0);
|
|
|
|
|
|
signal DATA_pipe : DATA_pipe_t(12 downto 0);
|
|
|
signal WR_pipe : std_logic_vector(12 downto 0);
|
|
|
signal headerSended : std_logic := '0';
|
|
|
signal counter : std_logic_vector(7 downto 0):=(others => '0');
|
|
|
|
|
|
begin
|
|
|
|
|
|
WR <= WR_pipe(0);
|
|
|
|
|
|
DATAOUT <= DATA_pipe(0);
|
|
|
|
|
|
|
|
|
process(reset,clk)
|
|
|
begin
|
|
|
if reset = '0' then
|
|
|
WR_pipe(12 downto 0) <= (others => '1');
|
|
|
counter <= (others => '0');
|
|
|
rstloop: for i in 0 to 12 loop
|
|
|
DATA_pipe(i) <= X"00";
|
|
|
end loop;
|
|
|
headerSended <= '0';
|
|
|
elsif clk'event and clk ='1' then
|
|
|
if WordCnt_in = 1 and headerSended = '0' then
|
|
|
counter <= (others => '0');
|
|
|
WR_pipe(4 downto 1) <= (others => '0');
|
|
|
WR_pipe(1) <= '0';
|
|
|
WR_pipe(3) <= '0';
|
|
|
WR_pipe(5) <= '0';
|
|
|
WR_pipe(7) <= '0';
|
|
|
WR_pipe(9) <= '0';
|
|
|
WR_pipe(11) <= '0';
|
|
|
DATA_pipe(1) <= counter; -- Size
|
|
|
DATA_pipe(3) <= X"5a";
|
|
|
DATA_pipe(5) <= X"f0";
|
|
|
DATA_pipe(7) <= X"0f";
|
|
|
DATA_pipe(9) <= X"a5";
|
|
|
DATA_pipe(11) <= std_logic_vector(TO_UNSIGNED(MinfCnt_in,WordSize));
|
|
|
WR_pipe(0) <= '1';
|
|
|
WR_pipe(2) <= '1';
|
|
|
WR_pipe(4) <= '1';
|
|
|
WR_pipe(6) <= '1';
|
|
|
WR_pipe(8) <= '1';
|
|
|
WR_pipe(10) <= '1';
|
|
|
WR_pipe(12) <= '1';
|
|
|
DATA_pipe(0) <= X"00";
|
|
|
DATA_pipe(2) <= X"00";
|
|
|
DATA_pipe(4) <= X"00";
|
|
|
DATA_pipe(6) <= X"00";
|
|
|
DATA_pipe(10) <= X"00";
|
|
|
DATA_pipe(12) <= X"00";
|
|
|
headerSended <= '1';
|
|
|
elsif (FULL = '0') then
|
|
|
if WordCnt_in /= 1 then
|
|
|
headerSended <= '0';
|
|
|
end if;
|
|
|
DATA_pipe(0) <= DATA_pipe(1);
|
|
|
DATA_pipe(1) <= DATA_pipe(2);
|
|
|
DATA_pipe(2) <= DATA_pipe(3);
|
|
|
DATA_pipe(3) <= DATA_pipe(4);
|
|
|
DATA_pipe(4) <= DATA_pipe(5);
|
|
|
DATA_pipe(5) <= DATA_pipe(6);
|
|
|
DATA_pipe(6) <= DATA_pipe(7);
|
|
|
DATA_pipe(7) <= DATA_pipe(8);
|
|
|
DATA_pipe(8) <= DATA_pipe(9);
|
|
|
DATA_pipe(9) <= DATA_pipe(10);
|
|
|
DATA_pipe(10) <= DATA_pipe(11);
|
|
|
DATA_pipe(11) <= DATA_pipe(12);
|
|
|
DATA_pipe(12) <= DATAIN;
|
|
|
WR_pipe(12 downto 0) <= WEN & WR_pipe(12 downto 1);
|
|
|
if(WR_pipe(0) = '0') then
|
|
|
counter <= std_logic_vector(UNSIGNED(counter) + 1);
|
|
|
end if;
|
|
|
else
|
|
|
WR_pipe(0) <= '1';
|
|
|
if WordCnt_in /= 1 then
|
|
|
headerSended <= '0';
|
|
|
end if;
|
|
|
end if;
|
|
|
end if;
|
|
|
end process;
|
|
|
|
|
|
|
|
|
end ar_ICI_EGSE_PROTOCOL;
|