FIFO单时钟头和尾错误-VHDL
在这个网站上提出一些建议后,我决定使用单时钟FIFO。在合成之前我模拟了它,没有错误,合成之后我模拟了代码,我得到了这个错误: **警告:同时读取和写入同一地址。RD是不可预测的,将RD驱动到X 时间:200877700 ps迭代:1个实例:/testbench/FIFO/memory\u tile\u I\u 1 但模拟工作与预期一样。编译后,我再次模拟代码,我没有得到这个错误,模拟工作如预期 我的代码是: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;
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,但您不在乎,因为该值无论如何都不会传播。