我正在尝试使用两个独立的Spartan 3E套件进行ADC-DAC。第一个套件将获得模拟信号并将其转换为数字信号。第二个套件将获得此转换的数字数据并再次将其转换为模拟数据。我分别成功实现了ADC和DAC,但是如何将第一个套件中的14位数字数据发送到另一个套件? (我需要时钟同步吗?)
答案 0 :(得分:2)
您需要从一个FPGA到另一个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。
答案 1 :(得分:0)
两种选择,具体取决于您要处理的数据速率:
对于相对较低的数据速率(按10的顺序 - 100 kbps),对数据进行帧化和串行化,并通过RS-232端口发送出去。另一方面,接收串行数据,反序列化,并查找数据框架以选择数据。只要每个时钟周期不需要处理数据,在这种情况下就不必担心同步时钟。如果数据速率使得每个周期都处理采样,那么您将需要同步时钟,因为两个板之间的时钟速率的微小变化将导致您丢弃采样。
对于更高的数据速率,请考虑使用带差分输出(LVDS)的FX2连接器。将14位(28线)连接到另一块板,以及ADC板使用的时钟。在DAC板上,接收时钟并使用它来生成本地系统时钟。然后,您可以使用生成的系统时钟对传入数据进行采样。这称为源同步设计。您可能需要使用时钟定相来在适当的时间对输入数据进行采样,以避免违反IOB的建立/保持要求。另请注意,数据位之间的信号偏移对于以高时钟速率进行控制可能变得至关重要。如果你不小心,你可能会有一两个数据落后于样本,基本上会破坏你的数据。