我的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无法合成)
有什么想法吗?
感谢和问候
答案 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。它会给你一个同步指针的公平想法
答案 2 :(得分:1)
我认为你需要一个读指针和写指针,它们都是模64,所以fifo基本上是一个循环缓冲区。使用灰色编码进行寻址,因为灰色编码数字仅在相邻值之间改变1位。这可用于错误检查。读指针位于读取域上,写入指针位于写入域上。也许将每个指针交叉到相反的域上进行完全和空检查?