两台斯巴达3E之间的数据传输



我正在尝试使用两个独立的Spartan 3E套件进行ADC-DAC。第一个套件将获得模拟信号并将其转换为数字信号。第二个套件将获得转换后的数字数据,并将其再次转换为模拟数据。我成功地分别实现了ADC和DAC,但如何将14位数字数据从第一个套件发送到另一个套件?(我需要时钟同步吗?)

您需要从一个FPGA到另一个获得三个信号

  1. 数据本身是一个比特流
  2. 指示每个新数据位的时钟信号
  3. 将比特流划分为单独的数据字的成帧信号(例如,指示下一个数据比特是新字的第一个比特)

但你只想使用一根电线(和一个接地连接!)

有标准的方法可以做到这一点;将这三条不同的信息组合成单个信号。

将时钟和数据组合在一起的一种常见技术被称为"曼彻斯特编码"(您可以搜索更多信息)。它从一个以两倍比特率运行的时钟开始。在每个偶数时钟边沿上,您都会更改信号的状态。然后在奇数时钟边缘,如果数据位为"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。

对于使用此技术的完整示例,请查看AES/EBU音频接口标准或SP/DIF(其消费级衍生产品)。

根据处理的数据速率,有两个选项:

对于相对较低的数据速率(大约为10-100 kbps),对数据进行帧化和串行化,并通过RS-232端口发送。另一方面,接收串行数据,进行反序列化,并查找数据帧以提取数据。只要不需要在每个时钟周期处理数据,在这种情况下就不必担心同步时钟。如果数据速率是这样的,即每个周期都要处理样本,那么您将需要同步时钟,因为随着时间的推移,两块板之间的时钟速率的微小变化将导致您丢弃样本。

对于更高的数据速率,请考虑使用带有差分输出(LVDS)的FX2连接器。将您的14位(28线)与ADC板使用的时钟一起发送到另一个板。在DAC板上,接收时钟并使用它生成本地系统时钟。然后,您可以使用生成的系统时钟对传入数据进行采样。这被称为源同步设计。为了不违反IOB的设置/保持要求,您可能需要调整时钟相位,以便在适当的时间对传入数据进行采样。还要注意,数据位之间的信号偏斜对于以高时钟速率进行控制可能变得至关重要。如果你不小心,你可能会有一两个比特落后于一个样本,从而破坏你的数据。

最新更新