OpenCores
URL https://opencores.org/ocsvn/riscv_vhdl/riscv_vhdl/trunk

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [rtl/] [gnsslib/] [sync/] [afifo.vhd] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 sergeykhbr
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_unsigned.all;
4
 
5
entity afifo is
6
    generic (
7
        abits : integer := 4;
8
        dbits : integer := 8
9
    );
10
    port (
11
        i_nrst      : in  std_logic;
12
        -- Reading port.
13
        i_rclk      : in  std_logic;
14
        i_rd_ena    : in  std_logic;
15
        o_data      : out std_logic_vector (dbits-1 downto 0);
16
        o_empty     : out std_logic;
17
        o_valid     : out std_logic;
18
        -- Writing port.
19
        i_wclk      : in  std_logic;
20
        i_wr_ena    : in  std_logic;
21
        i_data      : in  std_logic_vector (dbits-1 downto 0);
22
        o_full      : out std_logic
23
 
24
    );
25
end entity;
26
architecture rtl of afifo is
27
    ----/Internal connections & variables------
28
    constant FIFO_DEPTH :integer := 2**abits;
29
 
30
    type RAM is array (integer range <>)of std_logic_vector (dbits-1 downto 0);
31
    signal Mem : RAM (0 to FIFO_DEPTH-1);
32
 
33
    signal pNextWordToWrite     :std_logic_vector (abits-1 downto 0);
34
    signal pNextWordToRead      :std_logic_vector (abits-1 downto 0);
35
    signal EqualAddresses       :std_logic;
36
    signal NextWriteAddressEn   :std_logic;
37
    signal NextReadAddressEn    :std_logic;
38
    signal Set_Status           :std_logic;
39
    signal Rst_Status           :std_logic;
40
    signal Status               :std_logic;
41
    signal PresetFull           :std_logic;
42
    signal PresetEmpty          :std_logic;
43
    signal empty,full           :std_logic;
44
    signal r_stat               :std_logic;
45
 
46
    component GrayCounter is
47
    generic (
48
        generic_width : integer := 4
49
    );
50
    port (                            --'Gray' code count output.
51
        i_nrst : in  std_logic;       -- Count reset.
52
        i_clk  : in  std_logic;       -- Input clock
53
        i_ena  : in  std_logic;       -- Count enable.
54
        o_cnt  : out std_logic_vector (generic_width-1 downto 0)
55
    );
56
    end component;
57
begin
58
 
59
    proc_rclk0 : process (i_rclk) begin
60
        if (rising_edge(i_rclk)) then
61
            o_valid <= '0';
62
            if (i_rd_ena = '1' and empty = '0') then
63
                o_data <= Mem(conv_integer(pNextWordToRead));
64
                o_valid <= '1';
65
            end if;
66
        end if;
67
    end process;
68
 
69
    --'Data_in' logic:
70
    proc_wclk0 : process (i_wclk) begin
71
        if (rising_edge(i_wclk)) then
72
            if (i_wr_ena = '1' and full = '0') then
73
                Mem(conv_integer(pNextWordToWrite)) <= i_data;
74
            end if;
75
        end if;
76
    end process;
77
 
78
    --Fifo addresses support logic: 
79
    NextWriteAddressEn <= i_wr_ena and (not full);
80
    NextReadAddressEn  <= i_rd_ena and (not empty);
81
 
82
    --Addreses (Gray counters) logic:
83
    GrayCounter_pWr : GrayCounter
84
    generic map (
85
        generic_width => abits
86
    ) port map (
87
        i_nrst  => i_nrst,
88
        i_clk   => i_wclk,
89
        i_ena   => NextWriteAddressEn,
90
        o_cnt   => pNextWordToWrite
91
    );
92
 
93
    GrayCounter_pRd : GrayCounter
94
    generic map (
95
        generic_width => abits
96
    ) port map (
97
        i_nrst  => i_nrst,
98
        i_clk   => i_rclk,
99
        i_ena   => NextReadAddressEn,
100
        o_cnt   => pNextWordToRead
101
    );
102
 
103
    --'EqualAddresses' logic:
104
    EqualAddresses <= '1' when (pNextWordToWrite = pNextWordToRead) else '0';
105
 
106
    --'Quadrant selectors' logic:
107
    proc0 : process (pNextWordToWrite, pNextWordToRead)
108
        variable set_status_bit0 :std_logic;
109
        variable set_status_bit1 :std_logic;
110
        variable rst_status_bit0 :std_logic;
111
        variable rst_status_bit1 :std_logic;
112
    begin
113
        set_status_bit0 := pNextWordToWrite(abits-2) xnor pNextWordToRead(abits-1);
114
        set_status_bit1 := pNextWordToWrite(abits-1) xor  pNextWordToRead(abits-2);
115
        Set_Status <= set_status_bit0 and set_status_bit1;
116
 
117
        rst_status_bit0 := pNextWordToWrite(abits-2) xor  pNextWordToRead(abits-1);
118
        rst_status_bit1 := pNextWordToWrite(abits-1) xnor pNextWordToRead(abits-2);
119
        Rst_Status      <= rst_status_bit0 and rst_status_bit1;
120
    end process;
121
 
122
    --'Status' latch logic:
123
    r_stat <= Rst_Status or (not i_nrst);
124
    latch0 : process (i_rclk, Set_Status, r_stat) begin--D Latch w/ Asynchronous Clear & Preset.
125
        if r_stat = '1' then
126
            Status <= '0';
127
        elsif (Set_Status = '1') then
128
            Status <= '1';  --Going 'Full'.
129
        elsif rising_edge(i_rclk) then
130
            Status <= Status;
131
        end if;
132
    end process;
133
 
134
    --'Full_out' logic for the writing port:
135
    PresetFull <= Status and EqualAddresses;  --'Full' Fifo.
136
 
137
    latch1 : process (i_wclk, PresetFull) begin --D Flip-Flop w/ Asynchronous Preset.
138
        if (PresetFull = '1') then
139
            full <= '1';
140
        elsif (rising_edge(i_wclk)) then
141
            full <= '0';
142
        end if;
143
    end process;
144
    o_full <= full;
145
 
146
    --'Empty_out' logic for the reading port:
147
    PresetEmpty <= not Status and EqualAddresses;  --'Empty' Fifo.
148
 
149
    latch2 : process (i_rclk, PresetEmpty) begin --D Flip-Flop w/ Asynchronous Preset.
150
        if (PresetEmpty = '1') then
151
            empty <= '1';
152
        elsif (rising_edge(i_rclk)) then
153
            empty <= '0';
154
        end if;
155
    end process;
156
 
157
    o_empty <= empty;
158
end architecture;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.