我正在尝试使用两个单独的 Spartan 3E 套件进行 ADC-DAC。第一个套件将获得模拟信号并将其转换为数字信号。第二个套件将获取转换后的数字数据并再次将其转换为模拟数据。我成功地分别实现了 ADC 和 DAC,但是如何将 14 位数字数据从第一个套件发送到另一个套件?(我需要时钟同步吗?)
2 回答
您需要从一个 FPGA 获得三个信号到另一个
- 数据本身作为比特流
- 指示每个新数据位的时钟信号
- 用于将位流划分为单独的数据字的成帧信号(例如,指示下一个数据位是新字的第一位。
但是您只想使用一根电线(和一个接地连接!)
有标准的方法可以做到这一点;将三个不同的信息组合成一个信号。
将时钟和数据组合在一起的一种常用技术称为“曼彻斯特编码”(您可以搜索有关此的更多信息)。它从以两倍比特率运行的时钟开始。在每个偶数时钟沿上,您都会更改信号的状态。然后在奇数时钟沿,如果该数据位为“1”,则更改状态,否则保持状态不变。
接收器必须区分时钟和数据边沿以进行自身同步。它通过测量转换之间的时间来做到这一点:一旦检测到丢失的转换,它就知道有一个数据位,因此下一个转换必须是时钟;一旦同步,它就可以开始解码数据。
所以我们现在把时钟和数据结合在一起了;我们只需要添加框架。
Clock ^ ^ ^ ^ ^ ^ ^ ^ ^ ...
Data 0 0 1 0 1 1 0 0 ...
Sig 0 0 1 1 0 1 0 0 1 0 1 0 1 1 0 0 1 ...
做到这一点的一种方法是删除一个时钟边沿,以便至少有 2 个丢失的转换,然后是一个实际的时钟边沿。这个序列打破了曼彻斯特编码的正常规则,被称为前导码或成帧模式。
接收器可以检测到前导码,并知道下一位是数据字的开始。(前导也可以包含其他信息,例如区分立体声信号中的左右声道)。
Clock ^ ^ ^ ^ ^ ^ ^ ^ ^ ...
Data 0 x x 0 1 1 0 0 ...
Sig 0 0 1 0 0 0 1 1 0 1 0 1 0 0 1 1 0 ...
Pre 1 0 0 0 (note missing clock)
Count 1 2 3 4 5 ...
请注意,如果信号在前导码之前为 1,则您将反转前导码,然后它将是 0 1 1 1。
两个选项,具体取决于您处理的数据速率:
对于相对较低的数据速率(大约 10 到 100 kbps),对数据进行帧化和序列化,然后通过 RS-232 端口将其发送出去。另一方面,接收串行数据,反序列化,并寻找数据帧来挑选你的数据。只要不需要每个时钟周期都处理数据,在这种情况下您无需担心同步时钟。如果数据速率使得每个周期都处理样本,那么您将需要同步时钟,因为随着时间的推移,两个板之间时钟速率的微小变化会导致您丢失样本。
要获得更高的数据速率,请考虑使用具有差分输出 (LVDS) 的 FX2 连接器。将 14 位(28 根线)连同 ADC 板使用的时钟一起发送到另一块板。在 DAC 板上,接收时钟并使用它来生成本地系统时钟。然后,您可以使用生成的系统时钟对传入数据进行采样。这称为源同步设计。您可能需要使用时钟相位来在适当的时间对传入数据进行采样,以免违反 IOB 的建立/保持要求。另请注意,数据位之间的信号偏斜对于在高时钟速率下进行控制可能变得至关重要。如果您不小心,您可能会有一个或两个位滞后于样本,这实际上会破坏您的数据。