Professional Documents
Culture Documents
Fifocntrl
Fifocntrl
1 LIBRARY IEEE;
2 USE ieee.std_logic_1164 .all;
3 USE ieee.numeric_std .all;
4 ------------------------------------------------------------------------------
5 ENTITY fifo_ctrl IS
6
7 GENERIC(addr_width : natural := 4);
8
9 PORT
10 (
11 clck : IN STD_LOGIC ;
12 reset : IN STD_LOGIC ;
13 rd : IN STD_LOGIC ;
14 wr : IN STD_LOGIC ;
15 empty : OUT STD_LOGIC ;
16 full : OUT STD_LOGIC ;
17 w_addr : OUT STD_LOGIC_VECTOR (addr_width -1 DOWNTO 0);
18 r_addr : OUT STD_LOGIC_VECTOR (addr_width -1 DOWNTO 0);
19 r_addr_next : OUT STD_LOGIC_VECTOR (addr_width -1 DOWNTO 0)
20 );
21
22 END ENTITY fifo_ctrl ;
23 ------------------------------------------------------------------------------
24
25 ARCHITECTURE arch OF fifo_ctrl IS
26
27 SIGNAL w_ptr_reg , w_ptr_next , w_ptr_succ : STD_LOGIC_VECTOR (addr_width -1
DOWNTO 0);
28 SIGNAL r_ptr_reg , r_ptr_next , r_ptr_succ : STD_LOGIC_VECTOR (addr_width -1
DOWNTO 0);
29 SIGNAL full_reg , full_next : STD_LOGIC ;
30 SIGNAL empty_reg , empty_next : STD_LOGIC ;
31 SIGNAL wr_op : STD_LOGIC_VECTOR (1 DOWNTO 0);
32 SIGNAL wr_en : STD_LOGIC ;
33
34 BEGIN
35
36 PROCESS(clck,reset)
37 BEGIN
38 IF(reset = '1') THEN
39 w_ptr_reg <= (OTHERS => '0');
40 r_ptr_reg <= (OTHERS => '0');
41 full_reg <= '0';
42 empty_reg <= '1';
43
44 ELSIF (rising_edge (clck)) THEN
45 w_ptr_reg <= w_ptr_next ;
46 r_ptr_reg <= r_ptr_next ;
47 full_reg <= full_next ;
48 empty_reg <= empty_next ;
49 END IF;
50 END PROCESS;
51
52 ----- sucesive pointer values
53 w_ptr_succ <= STD_LOGIC_VECTOR (unsigned (w_ptr_reg ) + 1);
54 r_ptr_succ <= STD_LOGIC_VECTOR (unsigned (r_ptr_reg ) + 1);
55
56 -- next state logic for read an write pointers
57 wr_op <= wr & rd;
58
59 PROCESS(w_ptr_reg , w_ptr_succ , r_ptr_reg , r_ptr_succ , full_reg ,empty_reg , wr_op)
60
61 BEGIN
62
63 CASE wr_op IS
64