Vhdl FPGA达到了USB总线的极限

Vhdl FPGA达到了USB总线的极限,vhdl,xilinx,spartan,Vhdl,Xilinx,Spartan,我正在为大学的硕士论文编写一个基于OpalKelly实现的Xilinx Spartan-6。 确切地说,这是我正在研究的FPGA(XEM6010-LX45): 它安装在一块板上,该板必须采集多个信号(8+),对其进行处理并生成多个信号(16+),以根据设置关闭一些反馈回路 它由一个内置于C#的用户界面控制,我也在自己编程,必须能够在需要时更改使用的反馈逻辑,而无需重新启动实验。这意味着USB接口持续发送数据以更新设置 我刚刚遇到了一个典型的(我想)问题,我刚刚用完了Wirein,这是用于将数据从

我正在为大学的硕士论文编写一个基于OpalKelly实现的Xilinx Spartan-6。 确切地说,这是我正在研究的FPGA(XEM6010-LX45):

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

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

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

它们被限制为16位数据,地址从0x00到0x1F(32线)。更多详情请参见第41页


这里有一个问题:如何增加可以发送到FPGA的数据量

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

这真的可行吗?还是效率极低?我是否应该使用接线器(请参阅我链接的前面板手册)?我是否应该使用PipeIn并以某种方式管理所需的多路复用器

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


提前谢谢

最好使用OkristerBridge,但正如我在您的电路板描述中所看到的,它仅在USB 3.0上可用:(


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

如果你有很多数据可以流,使用管道

如果你想随机访问数据,你必须使用一个多路复用器,由一个有线接口控制

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

---用一些代码更新

如果有一个名为
regs
的向量数组要更新,还有两个名为
address
data
的有线信号要更新,则只需执行以下操作:

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

regs(到整数(无符号(地址)))除了实验需要一台带有USB 3.0的笔记本电脑外,我还需要做哪些步骤才能在VHDL和C#中切换到USB 3.0?当我开始编程这块电路板时,第一个固件版本已经编码好了,所以我没有初始化USB通信的任何经验。问题在于你使用的工具包:它与USB2.0一起工作。一个d在你的报告中(第60页)我看到只有USB3.0支持OkristerBridge的工具包。我没有足够的经验来估计什么是可接受的维度mid项目。目前我仅限于32个16位字,但我需要至少三倍于该数量的字,并且大多数字应该是可修改的mid实验,而不会影响其他值。我想知道是否有一种合适的/优化的方法来编码这样的多路复用器。对于代码,我有一个关于触发信号的疑问:为什么不上升沿(触发信号)因为这是我可以使用的脉冲?我在设计中有很多不同的时钟:2、38、40、80MhzOnly在上升沿语句中使用过真实的时钟信号。这是同步设计的第一条规则,已经写了很多。并且确保使用的时钟触发器也是同步的(即块的clk端口中的触发器)如果你有很多不同的时钟,你需要非常小心地将在一个域中驱动的信号移动到另一个域-搜索时钟域交叉
regs(to_integer(unsigned(address))) <= data when rising_edge(clk) and trigger_signal = '1';