首页 文章

在Spartan 3中的进程之间移动数据

提问于
浏览
2

我有两个进程A和B,每个进程都有自己的时钟输入 .

时钟频率略有不同,因此不同步 .

过程A从IC采样数据,该数据需要传递给过程B,然后过程B需要将该数据写入另一个IC .

我目前的解决方案是在进程A和B之间使用一些简单的握手信号 . 内存在进程A(非块内存)中被声明为分布式RAM(128Bytes作为std_logic_vector(7 downto 0)的数组) .

我正在使用Xilinx的Spartan 3AN和ISE Webpack .

但这是正确的方法吗?

我在某地读到Spartan 3有双端口块存储器支持两个时钟,所以这会更正确吗?

我问的原因是因为我的设计行为不可预测,在这种情况下我只是讨厌魔术 . :-)

3 回答

  • 1

    除了非常特殊的例外情况,在两个独立时钟域之间移动数据的唯一正确方法是使用异步FIFO(也称为多速率FIFO) .

    在几乎所有FPGA(包括您正在使用的Xilinx器件)中,您都可以使用供应商创建的FIFO - 在Xilinx的情况下,您可以使用CoreGen工具生成自己的FIFO .

    您也可以使用双端口RAM和适当的握手逻辑自己构建这样的FIFO,但是像大多数情况一样,除非您有充分的理由这样做,否则您不应该自己重新创建 .

    您还可以考虑您的设计是否确实需要具有多个时钟域 . 有时它会比大多数刚开始相信的人少得多 . 例如,即使您需要以多种速率运行的逻辑,您也可以通过使用单个时钟和适当生成的同步时钟使能来处理此问题 .

  • 1

    您遇到的魔力很可能是因为您没有在合成中正确约束您的设计,或者您没有正确地完成握手 . 您有两种选择:

    • FIFO

    使用wjl所述的多速率FIFO,这是一种非常常见的解决方案,始终有效(正确完成时)并且在资源方面是巨大的 . 此解决方案的一大优点是您不必关心实际的时钟域交叉问题,并且您将获得两个域之间的最大带宽 . 永远不要尝试在VHDL中 Build 异步FIFO,因为这不起作用;甚至在VHDL中也有一些你根本做不到的事情;使用Xilinx的相应发生器,我认为是CoreGen

    • 握手

    在两个域中至少有两个用于数据的寄存器,并构建一个完整的请求/确认握手逻辑,如果不包含这些寄存器,它将无法正常工作 . 通过在接收域中为握手信号添加至少两个寄存器,确保握手逻辑正确同步,因为否则由于亚稳态问题,您很可能会出现不可预测的行为 .

  • 5

    要获得跨时钟域的"valid/ack"标志集,您可能希望查看the Flancterhere's an application of it

    但在一般情况下,使用双时钟FIFO是一天的顺序 . 编写自己的将是一个有趣的练习,但验证所有潜在的时钟计时案例是一场噩梦 . 这是我将实例化Coregen块的少数几个地方之一 .

相关问题