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

Vhdl 在Spartan 3中的进程之间移动数据,vhdl,xilinx,Vhdl,Xilinx,我有两个进程A和B,每个进程都有自己的时钟输入 时钟频率略有不同,因此不同步 进程A从一个IC采集数据,该数据需要传递给进程B,然后进程B需要将该数据写入另一个IC 我目前的解决方案是在进程A和进程B之间使用一些简单的握手信号。 内存已声明为进程A(非块内存)内的分布式RAM(128字节为std_逻辑_向量数组(7到0)) 我用的是Xilinx的斯巴达3AN和ISE网页 但这是正确的方法吗 我在某处读到斯巴达3有支持两个时钟的双端口块内存,那么这是否更正确 我之所以这么问,是因为我的设计表现得不

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

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

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

我目前的解决方案是在进程A和进程B之间使用一些简单的握手信号。 内存已声明为进程A(非块内存)内的分布式RAM(128字节为std_逻辑_向量数组(7到0))

我用的是Xilinx的斯巴达3AN和ISE网页

但这是正确的方法吗

我在某处读到斯巴达3有支持两个时钟的双端口块内存,那么这是否更正确


我之所以这么问,是因为我的设计表现得不可预测,在这种情况下,我就是讨厌魔法。:-)

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

在几乎所有的FPGA(包括您正在使用的Xilinx部件)中,您都可以使用供应商创建的FIFO——在Xilinx的情况下,您可以通过使用CoreGen工具生成FIFO来实现这一点

您也可以使用双端口RAM和适当的握手逻辑自己构造这样的FIFO,但与大多数事情一样,除非您有很好的理由这样做,否则您不应该自行重新设计FIFO


<>你也可以考虑你的设计是否真的需要多个时钟域。有时这是绝对必要的,但这比大多数刚开始相信的要少得多。例如,即使您需要以多种速率运行的逻辑,您通常也可以通过使用单个时钟和适当生成的同步时钟来处理此问题。

您正在体验的魔力很可能是因为您在合成中没有正确地约束您的设计,或者您没有正确地进行握手。您有两个选择:

  • 先进先出
  • 如wjl所述,使用多速率FIFO,这是一种非常常见的解决方案,总是可以正常工作(如果操作正确),并且资源巨大。此解决方案的最大优点是,您不必关心实际的时钟域交叉问题,而且您将获得两个域之间的最大带宽。千万不要尝试在VHDL中建立异步FIFO,因为这样做行不通;即使在VHDL中,也有一些事情是您无法正确完成的;使用Xilinx的适当发电机,我认为这是CoreGen

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

    要获得跨时钟域的“有效/ack”标志集,您可能希望查看和

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

    使用VHDL(以及限制跨越时钟域的信号之间偏差的时序约束),完全可以构造正确的异步FIFO。