带有2个VHDL时钟的FIFO

时间:2013-05-02 10:40:38

标签: vhdl fifo clock-synchronization clock

我的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'));

问题如下:我应该如何编写进程并在它们之间维护指针以进行同步?使用我尝试的方法,代码将不会合成(错误:XST:827信号ptr无法合成)

有什么想法吗?

感谢和问候

3 个答案:

答案 0 :(得分:6)

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

跨越时钟域的FIFO非常棘手,不能轻易尝试......

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

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

(其中一位作者是已故的,伟大的,彼得·阿尔克克 - 他在1969年设计了第一个FIFO芯片,被广泛认为是,甚至 ,FIFO-guru)< / p>

答案 1 :(得分:2)

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

http://opencores.org/project,generic_fifos

答案 2 :(得分:1)

我认为你需要一个读指针和写指针,它们都是模64,所以fifo基本上是一个循环缓冲区。使用灰色编码进行寻址,因为灰色编码数字仅在相邻值之间改变1位。这可用于错误检查。读指针位于读取域上,写入指针位于写入域上。也许将每个指针交叉到相反的域上进行完全和空检查?