0

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

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

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

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

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


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

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

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

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

提前致谢!

4

2 回答 2

1

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

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

于 2015-02-24T13:22:46.357 回答
1

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

如果要随机访问数据,则必须使用由 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在时钟部分内添加一条语句。

于 2015-02-26T11:54:23.963 回答