代码之家  ›  专栏  ›  技术社区  ›  FlyerDragon

FPGA达到了USB WireIns的极限

  •  0
  • FlyerDragon  · 技术社区  · 11 年前

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

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

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

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

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


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

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

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

    FPGA设计者如何克服这种USB通信限制?

    提前感谢!

    2 回复  |  直到 11 年前
        1
  •  1
  •   Martin Thompson    11 年前

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

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

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

    ---使用某些代码更新

    如果您有一个要更新的向量数组 regs 和2个被称为 address 和 data 那么你只需要做:

    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';
    

    如果你的合成器不接受上面的代码,你必须记录一个bug,并用 if 计时部分内的语句。

        2
  •  1
  •   FabienM    11 年前

    好的反应是使用okRegisterBridge,但正如我在您的电路板描述中看到的,它仅在USB 3.0上可用:(

    那么是的,在您的情况下,如果您想增加地址空间,您必须使用一个okWireIn寄存器进行多路复用,其中一个用于地址,另一个用于写数据。