3

我对 vhdl 分配有疑问。我需要在一条 500MHz 的总线和另一条 30MHz 的总线之间创建一个 FIFO 缓冲区。

我设计了一个基本的FIFO缓冲区

输入:Data_in、Write_EN、CLK_500、Read_EN、CLK_30、FlushFIFO。

输出:Data_out、FULL、EMPTY。

此缓冲区是使用 2D 数组设计的:

type fifo_arr is array (0 to 63) of std_logic_vector(39 downto 0);
signal FIFO : fifo_arr := (others => (others => '0'));

问题如下:我应该如何编写进程并在它们之间维护一个指针以进行同步?用我试过的方法,代码不会合成(ERROR:XST:827 Signal ptr cannot be synthesis)

有任何想法吗?

谢谢并恭祝安康

4

3 回答 3

6

向我们展示它实际抱怨的代码可能是一个想法!

跨时钟域的 FIFO 很棘手,不能轻易尝试……

话虽如此 - 因为它看起来像家庭作业,所以可以在这里找到一个很好的阅读:

http://eda.ee.nctu.edu.tw/jdhuang/courses/ipcd04/paper/alfke_final.pdf

(其中一位作者是已故的伟大的 Peter Alfke - 他在 1969 年设计了第一个 FIFO 芯片,并被广泛认为是 FIFO 大师,甚至FIFO 大师)

于 2013-05-02T11:49:23.393 回答
2

您可以查看这些可用的 FIFO 内核,尤其是双时钟版本的 fifo。它会给你一个同步指针的公平想法

http://opencores.org/project,generic_fifos

于 2013-05-02T14:08:28.627 回答
1

我认为您将需要一个均以 64 为模的读指针和写指针,因此 fifo 基本上是一个循环缓冲区。使用格雷编码进行寻址,因为格雷编码的数字在相邻值之间仅更改 1 位。这可用于错误检查。读指针在读域上,写指针在写域上。也许将每个指针交叉到相反的域以进行完整和空检查?

于 2013-05-02T17:20:09.620 回答