况下就开始了(读操作逻辑不需要等待 FIFO 变满),因此这些条件不得不修改
来存储读指针和写指针的每一个值。
有这样一个想法,那就是我们可以将存储器组织成一个环形列表。因此,如
果写指针与读指针差值大于 1 或更多,就进行读操作,FIFO 为空,这种工作方
式对于用无符号(n-bit)结构来描述的临界状态非常适合。同样的,如果读指针
与写指针的差值大于 1,就进行写操作,直到 FIFO 为满。
这将带来如下的条件:
写操作无条件的清除空标志。
write_pointer=(read_pointer+1),读操作置空。
读操作无条件的清除满标志,
read_pointer= (write_pointer+1),写操作置满。
注意,读操作和写操作同时都在使其指针增加,但不改变空标志和满标志的
状态。在空或满的临界状态同时读操作和写操作都是不允许的。
综上所述,我们现在能够定义 FIFO 的 status 模块,这里提供了用 VHDL 编
写的代码,由于是同步的,很容易转换成 Verilog HDL 代码。
library IEEE, STD;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity status is
port (reset : in std_logic;
clk : in std_logic;
fifo_wr : in std_logic;
fifo_rd : in std_logic;
valid_rd : out std_logic;
valid_wr : out std_logic;
rd_ptr : out std_logic_vector(4 downto 0);
wr_ptr : out std_logic_vector(4 downto 0);
empty : out std_logic;
full : out std_logic
);
end status;
architecture status_A of status is
signal rd_ptr_s : std_logic_vector(4 downto 0);
signal wr_ptr_s : std_logic_vector(4 downto 0);
signal valid_rd_s : std_logic;
signal valid_wr_s : std_logic;
begin
empty_P : process(clk, reset)