FIFO错误:找不到控制信号 - VHDL

时间:2015-04-27 13:34:10

标签: vhdl fpga fifo

我找到了一个VHDL FIFO代码并尝试修改它以使用两个不同的时钟,一个用于写入,一个用于读取。 我已经尝试了代码并且似乎在模拟中工作,但是当我尝试合成它时,我得到了这个错误:

  

“找不到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;

如何解决此错误?

2 个答案:

答案 0 :(得分:0)

无论工具集如何,使用单个时钟读取FIFO进行读取和写入通常都很简单。推断具有用于读取和写入的单独时钟的FIFO可能是棘手的,这取决于您所针对的硬件以及用于合成HDL的工具。

首先检查综合工具的手册/用户指南,确保它支持使用单独的读/写时钟推断FIFO。如果是这样,它可能会建议您支持的HDL行为描述,您应该在之后为代码建模。

很常见的问题是使用两个时钟的单个进程来描述FIFO。通常这样做会推断出对两个时钟敏感的寄存器 - 硬件不支持,从而导致错误。如果没有关于工具的更具体的信息,将会猜测更具体的答案。

答案 1 :(得分:0)

尝试修改单个时钟FIFO以成为跨越FIFO的时钟域并非易事。它们是两种非常不同的野兽。

我试图绘制最简单的时钟域跨越FIFO设计的框图。请原谅我写意画技巧的粗鄙。我的例子是16字节FIFO,但只要深度是2的幂,它就可以扩展到任意深度和宽度。

我使用蓝色标记来突出显示必须应用供应商特定属性以防止合成优化的所有信号。

没有捷径。如果你想创建自己的时钟域跨越FIFO,那么这个方框图代表了你必须做的最低限度。

CDC FIFO block diagram