Я нашел код VHDL FIFO и попытался изменить его для использования с двумя разными часами: один для записи и один для чтения. Я судимый код и, кажется, работаю в симуляции, но когда я пытаюсь синтезировать я получаю эту ошибку:Ошибка FIFO: не удается найти управляющий сигнал - VHDL
"Can't find control signal for Full"
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 := 100
);
Port (
WCLOCK : in STD_LOGIC;
RCLOCK : 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 (WCLOCK, RCLOCK, ModuleRESET)
variable Looped : boolean;
begin
if ModuleRESET = '0' then
Head <= 0;
Tail <= 0;
Looped := false;
Full <= '0';
Empty <= '1';
DataOut <= (others => '0');
elsif ReadEn = '1' then
if rising_edge(RCLOCK) 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;
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;
elsif WriteEn = '1' then
if rising_edge(WCLOCK) 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;
-- 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 if;
end process;
end FIFO_archi;
Как я могу решить эту ошибку?
Вы не можете этого сделать. FIFO с другим CLK для чтения и записи сильно отличается от простого FIFO одним часом. Вы должны выполнить повторную синхронизацию указателей, используя сериальную логику счетчика, которая может быть вне зоны комфорта. Каждый инструмент синтеза имеет IP-ядра для двухфазного FIFO, почему бы вам не использовать его вместо этого? –
Действительно. Вы не можете просто изменить однократный FIFO и ожидать, что он станет CDC FIFO. Пересечение домена - это совсем другое зверь. –