我在大学的硕士论文中使用OpalKelly实现Xilinx Spartan-6编程。 准确地说,这是我正在研究的FPGA(XEM6010-LX45):https://www.opalkelly.com/products/xem6010/
它安装在必须获取多个信号(8+)的板上,处理它们并生成多个信号(16+)以根据设置关闭一些反馈回路。
它由C#内置的用户界面控制,我自己也编程,必须能够在不重新启动实验的情况下更改所需的反馈逻辑。这意味着USB接口连续发送数据以更新设置。
我刚刚遇到经典(我猜)问题,我刚刚用完了WireIns,这是用于从C#程序到FPGA的USB传输数据的Opal Kelly实现。 / p>
它们仅限于16位数据,地址为0x00 - 0x1F(因此为32个WireIns)。更多细节请参见第41页http://assets00.opalkelly.com/library/FrontPanel-UM.pdf
以下是问题:如何增加可以发送到FPGA的数据?
首先想到的是FPGA中的一个大多路复用器,它只使用两个WireIns,一个用于数据,另一个用作选择器。然后触发器激活FPGA,将数据存储到正确的寻址寄存器中。
这真的可行还是非常低效?我应该使用 WireOR (请参阅我链接的FrontPanel手册)?我应该使用 PipeIn 并以某种方式管理所需的多路复用器吗?
FPGA设计人员如何克服此USB通信限制?
提前致谢!
答案 0 :(得分:1)
好的反应是使用okRegisterBridge,但正如我在你的主板描述中看到的,它只能在USB 3.0上使用:(
然后是的,在你的情况下,如果你想增加你的地址空间,你必须用一个okWireIn寄存器为地址和一个writedata做一个多路复用器。
答案 1 :(得分:1)
如果您有大量可以流式传输的数据,请使用管道。
如果您想随机访问数据,您必须使用由WireIn控制的多路复用器。
关于效率,您必须指定您感兴趣的效率维度,以及可接受的值。例如,带宽,延迟,使用的LUT。
---用一些代码更新
如果您要更新名为regs
的向量数组和名为address
和data
的2个有线信号,那么您只需执行以下操作:
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
语句。