FIFO单时钟头和尾错误-VHDL

FIFO单时钟头和尾错误-VHDL,vhdl,fpga,fifo,Vhdl,Fpga,Fifo,在这个网站上提出一些建议后,我决定使用单时钟FIFO。在合成之前我模拟了它,没有错误,合成之后我模拟了代码,我得到了这个错误: **警告:同时读取和写入同一地址。RD是不可预测的,将RD驱动到X 时间:200877700 ps迭代:1个实例:/testbench/FIFO/memory\u tile\u I\u 1 但模拟工作与预期一样。编译后,我再次模拟代码,我没有得到这个错误,模拟工作如预期 我的代码是: library IEEE; USE IEEE.STD_LOGIC_1164.ALL;

在这个网站上提出一些建议后,我决定使用单时钟FIFO。在合成之前我模拟了它,没有错误,合成之后我模拟了代码,我得到了这个错误:

**警告:同时读取和写入同一地址。RD是不可预测的,将RD驱动到X 时间:200877700 ps迭代:1个实例:/testbench/FIFO/memory\u tile\u I\u 1 但模拟工作与预期一样。编译后,我再次模拟代码,我没有得到这个错误,模拟工作如预期

我的代码是:

library IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;

entity FIFO is
    Generic (
        constant DATA_WIDTH  : positive := 8;
        constant FIFO_DEPTH : positive := 500
    );
    Port ( 
        Clock       : in  STD_LOGIC;
        WriteEn : in  STD_LOGIC;
        DataIn  : in  STD_LOGIC_VECTOR (DATA_WIDTH - 1 downto 0);
        ReadEn  : in  STD_LOGIC;
        DataOut : out STD_LOGIC_VECTOR (DATA_WIDTH - 1 downto 0);
        Empty   : out STD_LOGIC;
        Full    : out STD_LOGIC;
        ModuleRESET : in STD_LOGIC
    );
end FIFO;

architecture FIFO_archi of FIFO is
    type FIFO_Memory is array (0 to FIFO_DEPTH - 1) of STD_LOGIC_VECTOR (DATA_WIDTH - 1 downto 0);
    signal Memory : FIFO_Memory;
    signal Head : natural range 0 to FIFO_DEPTH - 1;
    signal Tail : natural range 0 to FIFO_DEPTH - 1;


    begin
         -- Memory Pointer Process
        process (Clock, ModuleRESET)
            variable Looped : boolean;
        begin
            if ModuleRESET = '0' then
                Head <= 0;
                Tail <= 0;
                Looped := false;
                Full  <= '0';
                Empty <= '1';
                DataOut <= (others => '0');
            elsif rising_edge(Clock) then  
                if ReadEn = '1' then             
                    if ((Looped = true) or (Head /= Tail)) then
                        -- Update data output
                        DataOut <= Memory(Tail);
                        -- Update Tail pointer as needed
                        if (Tail = FIFO_DEPTH - 1) then
                            Tail <= 0;
                            Looped := false;
                            else
                                Tail <= Tail + 1;
                            end if;
                     end if;
                elsif WriteEn = '1' then
                        if ((Looped = false) or (Head /= Tail)) then
                            -- Write Data to Memory
                            Memory(Head) <= DataIn;
                            -- Increment Head pointer as needed
                            if (Head = FIFO_DEPTH - 1) then
                                Head <= 0;
                                Looped := true;
                            else
                                Head <= Head + 1;
                            end if;
                        end if;
                end if;
                -- Update Empty and Full flags
                if (Head = Tail) then
                    if Looped then
                        Full <= '1';
                    else
                        Empty <= '1';
                    end if;
                else
                    Empty   <= '0';
                    Full    <= '0';
                end if;
            end if;
        end process;

end FIFO_archi;
在使用synplify pro合成后,每次在模拟中写入第一个数据时,我都会出现此错误:

当我初始化代码并写入第一个数据时 每次我清空FIFO缓冲区并写入第一个数据时
当然,当缓冲区为空时,尾部和头部位于位置0,但由于我有两个带有if-elseif-istance的标志,我怎么可能在读取和写入同一地址时出错?

您可以尝试询问从您那里获得此代码的人,您绝对不应该为您的写入启用使用elsif。对于FIFO,读写操作可以在同一个时钟周期内进行,您的模型应该能够处理这个问题。我建议您看看ReadEn是如何合成的。对于您的体系结构,它似乎没有直接连接到RAM块,并且当尾=头时发生写入时,仿真模型会抱怨,因为内存总是在读取。我忘了指定我从不同时写入和读取,因此,当可编辑性为1时,可编辑性为0,当可编辑性为0时,可编辑性为1。您可以忽略此警告。它看起来像是合成的方式,实际内存块在每个周期读取,但该值仅在ReadEn为“1”时使用。当您第一次执行写入时,读取值是不可预测的X,但您不在乎,因为该值无论如何都不会传播。