source: PROJECT_CORE_MPI/CORE_MPI/TRUNK/FIFO_64_FWFT.vhd

Last change on this file was 15, checked in by rolagamo, 12 years ago
File size: 6.7 KB
Line 
1----------------------------------------------------------------------------------
2-- Company:
3-- Engineer: KIEGAING EMMANUEL/GAMOM
4--
5-- Create Date:    19:51:54 04/19/2011
6-- Design Name:
7-- Module Name:    FIFO_64 - Behavioral
8-- Project Name:
9-- Target Devices:
10-- Tool versions:
11-- Description:
12--FIFO 64 Octets utisé pour les modules d'entrée
13-- ce fifo est de type fwft first word falls throught ce qui
14-- signifie que l'on a toujours la donnée au sommet de la pile en
15-- sortie du fifo.
16-- Dependencies:  RAM_64.vhd
17--
18-- Revision: 08-11-2012
19-- Revision 0.01 - File Created
20-- Additional Comments: suppression du signal counter_en dans les expressions
21-- 08/11/12 : prise en compte du retard de propagation des infos dans la FIFO.
22----------------------------------------------------------------------------------
23library IEEE;
24use IEEE.STD_LOGIC_1164.ALL;
25use IEEE.STD_LOGIC_ARITH.ALL;
26use IEEE.STD_LOGIC_UNSIGNED.ALL;
27Library NocLib;
28use NocLib.CoreTypes.all;
29---- Uncomment the following library declaration if instantiating
30---- any Xilinx primitives in this code.
31--library UNISIM;
32--use UNISIM.VComponents.all;
33
34entity FIFO_64_FWFT is
35    Port ( clk : in  STD_LOGIC;
36           din : in  STD_LOGIC_VECTOR (Word-1 downto 0);
37           rd_en : in  STD_LOGIC;
38           srst : in  STD_LOGIC;
39           wr_en : in  STD_LOGIC;
40           dout : out  STD_LOGIC_VECTOR (Word-1 downto 0);
41           empty : out  STD_LOGIC;
42           full : out  STD_LOGIC);
43end FIFO_64_FWFT;
44
45architecture Behavioral of FIFO_64_FWFT is
46-- declaration de la ram 64 octets
47COMPONENT RAM_64
48        PORT(
49                clka : IN std_logic;
50                clkb : IN std_logic;
51                wea : IN std_logic;
52                ena : IN std_logic;
53                enb : IN std_logic;
54                addra : IN std_logic_vector(5 downto 0);
55                addrb : IN std_logic_vector(5 downto 0);
56                dia : IN std_logic_vector(Word-1 downto 0);         
57                --doa : OUT std_logic_vector(Word-1 downto 0);
58                dob : OUT std_logic_vector(Word-1 downto 0)
59                );
60        END COMPONENT;
61type fsm_states is (state0, state1, state2);-- definition du type etat pour le codage des etats des fsm
62signal fwft_fsm_state : fsm_states;
63type ram_type is array (63 downto 0) of std_logic_vector (Word-1 downto 0);
64        signal RAM: ram_type;
65-- declaration des signeaux des compteurs
66signal push_address_counter : std_logic_vector(5 downto 0);
67signal pop_address_counter : std_logic_vector(5 downto 0);
68signal fifo_counter : std_logic_vector(5 downto 0);
69--autre signaux
70signal rd_ready : std_logic:='0';
71signal empty_signal : std_logic;
72signal full_signal  : std_logic;
73signal wr_en_signal : std_logic;
74signal rd_en_signal : std_logic;
75signal clk_signal :  std_logic;
76signal dob_signal : std_logic_vector(Word-1 downto 0);
77signal dout_signal : std_logic_vector(Word-1 downto 0);
78signal doa_signal : std_logic_vector(Word-1 downto 0);
79signal counter_en : std_logic; 
80
81begin
82
83-- ram instantiation de la ram 64 octets du FIFO
84--fifo_RAM_64: RAM_64 PORT MAP(
85--              clka => clk_signal,
86--              clkb => clk_signal,
87--              wea => wr_en_signal,
88--              ena => wr_en_signal,
89--              enb => rd_en_signal,
90--              addra => push_address_counter,
91--              addrb => pop_address_counter,
92--              dia => din,
93--              --doa => doa_signal,
94--              dob => dob_signal
95--      );
96-- circuiterie des signaux de validation et d'etat du fifo
97wr_en_signal <= wr_en and (not full_signal); -- la donnée est ignorée si le fifo est plein
98rd_en_signal <= rd_en and (not empty_signal);-- pas de lecture si le fifo est vide
99full_signal <= '1' when fifo_counter = "111111" else
100                                   '0';
101empty_signal <= '1' when rd_ready='0' or unsigned(fifo_counter) = 0  else
102                                         '0';
103clk_signal <= clk;
104full <= full_signal;
105empty <= empty_signal;
106
107-- sortie du fifo fwft
108dout <= dout_signal;
109
110-- le processus des transistion
111fwft_fsm_nsl : process(clk)
112 begin
113    if rising_edge(clk) then
114           if srst = '1' then
115                   fwft_fsm_state  <= state0;
116                else
117                   case fwft_fsm_state  is
118                                        when state0 => if wr_en_signal = '1' then  --tampon vide seule l'écriture est possible
119                                                                                        fwft_fsm_state  <= state1;
120                                                                                end if;
121                                                                               
122                                                                               
123                                        when state1 => --if rd_en_signal = '1' and wr_en_signal='1'  then  --écriture seule dans le tampon
124                                                                                       
125                                                                                        fwft_fsm_state  <= state2;
126                                                                                --end if;
127                                                                               
128                                        when state2 => if rd_en_signal = '1' and wr_en_signal='1'  then
129                                                                                        fwft_fsm_state  <= state2;
130                                                                                elsif rd_en_signal='1' and wr_en_signal='0' and unsigned(fifo_counter) = 1 then --lecture avec écriture
131                                                                                        fwft_fsm_state  <= state0;
132                                                                                elsif unsigned(fifo_counter) = 0 then
133                                                                                        fwft_fsm_state  <= state0;
134                                                                                end if;
135                                       
136                                        when others => fwft_fsm_state <= state0;
137                        end case;
138           end if;
139        end if;
140 end process;
141 -- actions associées à la fsm
142 -- mux qui oriente les sortie doa et dob vers out
143 val_fwft:process (fwft_fsm_state,dob_signal)
144 
145 begin
146 case fwft_fsm_state  is
147                                        when state0 => 
148               
149                                                dout_signal <= dob_signal;
150                                                counter_en   <= '0';
151                                                rd_ready <='0';
152                                        when state1 => 
153               
154                                                dout_signal <= dob_signal;
155                                                counter_en   <= '1';
156                                                rd_ready <='0';
157                                        when state2 => 
158               
159                                                dout_signal <= dob_signal;
160                                                counter_en   <= '1';
161                                                rd_ready <='1';
162                                        when others =>
163                       dout_signal <= dob_signal;
164                                                counter_en   <= '0';
165                                                rd_ready <='0';
166                end case;
167end process;
168doa_latch_process : process(clk)
169begin
170  if rising_edge(clk) then
171                if wr_en_signal ='1'  then
172                        doa_signal <= din;
173                end if;
174  end if;
175end process;
176                       
177-- processus de comptage des adresses d'empilement
178push_process : process(clk)
179 begin
180 if rising_edge(clk) then
181   if srst = '1' then
182         push_address_counter <= (others =>'0');
183        elsif wr_en_signal ='1' then
184                        RAM(conv_integer(push_address_counter)) <=din;
185                push_address_counter <= push_address_counter +1;
186         end if;
187 end if;
188end process;
189 
190 -- processus de comptage des adresses depilement du fifo
191pop_process : process(clk)
192 begin
193 if rising_edge(clk) then
194   if srst = '1' then
195          pop_address_counter <= (others =>'0');
196        elsif rd_en_signal ='1' then
197                pop_address_counter <= pop_address_counter +1;
198        end if;
199 end if;
200 end process;
201  dob_signal<=RAM(conv_integer(pop_address_counter));
202 -- processus de comptage des octets dans le fifo
203 fifo_counter_process : process(clk)
204 variable count : std_logic_vector(5 downto 0):= (others=>'0');
205begin
206 if rising_edge(clk) then
207   if srst = '1' then
208         fifo_counter <= (others =>'0');
209         count:=(others =>'0');
210        else
211         if wr_en_signal ='1'  and rd_en_signal ='0' then 
212                        count:=count+1;
213          end if;
214         if rd_en_signal ='1' and wr_en_signal ='0' and counter_en='1' then
215                        count:=count-1;         
216         end if;
217         fifo_counter<=count;
218  end if;
219 end if;
220end process;
221
222end Behavioral;
223
Note: See TracBrowser for help on using the repository browser.