Browse Source

Correct full & empty flag deassertion, fixes #2

master
T. Meissner 4 years ago
parent
commit
c355c14409
1 changed files with 13 additions and 6 deletions
  1. +13
    -6
      fifo/fifo.vhd

+ 13
- 6
fifo/fifo.vhd View File

@ -37,6 +37,9 @@ architecture rtl of fifo is
type t_fifo_mem is array (t_fifo_pnt'low to t_fifo_pnt'high) of std_logic_vector(Din_i'range); type t_fifo_mem is array (t_fifo_pnt'low to t_fifo_pnt'high) of std_logic_vector(Din_i'range);
signal s_fifo_mem : t_fifo_mem; signal s_fifo_mem : t_fifo_mem;
signal s_almost_full : boolean;
signal s_almost_empty : boolean;
function incr_pnt (data : t_fifo_pnt) return t_fifo_pnt is function incr_pnt (data : t_fifo_pnt) return t_fifo_pnt is
begin begin
if (data = t_fifo_mem'high) then if (data = t_fifo_mem'high) then
@ -49,6 +52,12 @@ architecture rtl of fifo is
begin begin
s_almost_full <= (s_write_pnt = s_read_pnt - 1) or
(s_write_pnt = t_fifo_mem'high and s_read_pnt = t_fifo_mem'low);
s_almost_empty <= (s_read_pnt = s_write_pnt - 1) or
(s_read_pnt = t_fifo_mem'high and s_write_pnt = t_fifo_mem'low);
WriteP : process (Reset_n_i, Clk_i) is WriteP : process (Reset_n_i, Clk_i) is
begin begin
if (Reset_n_i = '0') then if (Reset_n_i = '0') then
@ -85,16 +94,14 @@ begin
Full_o <= '0'; Full_o <= '0';
Empty_o <= '1'; Empty_o <= '1';
elsif (rising_edge(Clk_i)) then elsif (rising_edge(Clk_i)) then
if (Wen_i = '1' and Ren_i = '0') then
if ((s_write_pnt = s_read_pnt - 1) or
(s_write_pnt = t_fifo_mem'high and s_read_pnt = t_fifo_mem'low)) then
if (Wen_i = '1') then
if (Ren_i = '0' and s_almost_full) then
Full_o <= '1'; Full_o <= '1';
end if; end if;
Empty_o <= '0'; Empty_o <= '0';
end if; end if;
if (Ren_i = '1' and Wen_i = '0') then
if ((s_read_pnt = s_write_pnt - 1) or
(s_read_pnt = t_fifo_mem'high and s_write_pnt = t_fifo_mem'low)) then
if (Ren_i = '1') then
if (Wen_i = '0' and s_almost_empty) then
Empty_o <= '1'; Empty_o <= '1';
end if; end if;
Full_o <= '0'; Full_o <= '0';


Loading…
Cancel
Save