FPGA 达到了 USB WireIns 的极限

FPGA reached the limit of USB WireIns

我正在为我的大学硕士论文编写基于 OpalKelly 实现的 Xilinx Spartan-6。 准确地说,这是我正在研究的 FPGA (XEM6010-LX45):https://www.opalkelly.com/products/xem6010/

它安装在一块板上,必须获取多个信号(8+),处理它们并生成多个信号(16+)以根据设置关闭一些反馈回路。

它由 C# 内置的用户界面控制,我也在自己编程,并且必须能够在需要时更改使用的反馈逻辑,而无需重新启动实验。这意味着USB接口不断发送数据来更新设置。

我刚刚遇到了经典的(我想)问题,我刚刚 运行 出了 WireIns,这是用于从 C# 程序到 FPGA 的 USB 数据传输的 Opal Kelly 实现.

它们仅限于地址为 0x00 - 0x1F 的 16 位数据(因此有 32 个 WireIn)。更多详细信息,请参见第 41 页 http://assets00.opalkelly.com/library/FrontPanel-UM.pdf


这里是问题:如何增加可以发送到 FPGA 的数据?

第一个想到的想法是 FPGA 中的一个大多路复用器,它只使用两个 WireIn,一个用于数据,另一个作为选择器。然后触发器激活 FPGA,将数据存储到正确寻址的寄存器中。

这真的可行还是难以置信效率低下?我应该使用 WireORs(请参阅我链接的 FrontPanel 手册)吗?我应该使用 PipeIn 并以某种方式管理所需的多路复用器吗?

FPGA 设计人员如何克服 USB 通信限制?

提前致谢!

最好的办法是使用 okRegisterBridge,但正如我在您的电路板描述中看到的那样,它仅适用于 USB 3.0 :(

那么是的,在你的情况下,如果你想增加你的地址space,你必须做一个多路复用器,一个 okWireIn 寄存器用于地址,一个用于写入数据。

如果您有大量可以流式传输的数据,请使用管道。

如果您想随机访问数据,则必须使用由 WireIn 控制的多路复用器。

关于效率,您必须指定您感兴趣的效率维度以及可接受的值。例如,带宽、延迟、使用的 LUT。

--- 用一些代码更新

如果您有一个向量数组要更新,称为 regs 和 2 个 wirein 信号,称为 addressdata 那么您只需要做:

regs(to_integer(unsigned(address))) <= data when rising_edge(clk);

无论如何,这将非常有效。如果您需要更加小心寄存器上的故障,您可能还想使用 TriggerIn,这样您就可以设置地址和数据,然后触发传输。

regs(to_integer(unsigned(address))) <= data when rising_edge(clk) and trigger_signal = '1';

如果您的合成器不接受上面的代码,您将不得不记录一个错误并将其转换为一个时钟进程,在时钟部分内使用 if 语句。