2015-02-23 56 views
0

我正在爲我的大學碩士論文在OpalKelly實現上編程Xilinx Spartan-6。 (XEM6010-LX45):https://www.opalkelly.com/products/xem6010/FPGA達到了USB的極限WireIns

它安裝在必須獲取多個信號(8+),處理它們並生成多個信號的板上(16個+)根據設置關閉一些反饋迴路。

它由用C#構建的用戶界面控制,我也編程自己,並且必須能夠在需要時更改反饋邏輯而無需重新開始實驗。這意味着USB接口連續發送數據來更新設置。

我剛剛遇到了我剛剛用完WireIns的經典(我想)問題,那就是Opal Kelly實現,用於將數據從C#程序傳輸到FPGA。

它們被限制爲16位數據,地址從0x00 - 0x1F(因此32 WireIns)。更多詳細的41頁http://assets00.opalkelly.com/library/FrontPanel-UM.pdf


這裏是問題:我怎樣才能增加我的數據可以發送到FPGA?

想到的第一個想法是一個大型的多路複用器在FPGA中只使用兩個WireIns,一個用於數據,另一個用作選擇器。然後觸發器激活FPGA,將數據存儲到正確的地址寄存器中。

這真的是可行的,或者它是令人難以置信的效率低下?我應該使用WireOR(請參閱我連接的FrontPanel手冊)?我是否應該使用PipeIn並以某種方式管理所需的多路複用器?

FPGA設計人員如何克服這種USB通信限制?

在此先感謝!

回答

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語句轉換成一個時鐘的過程。

+0

我沒有足夠的經驗來估計中期項目的可接受維度。目前我僅限於32位16位字,但至少需要三倍的數量,其中大部分應該是可修改的中間實驗,而不會影響其他值。我想知道是否有適當的/優化的方式來編碼這樣的多路複用器 – FlyerDragon 2015-02-26 14:23:37

+0

非常感謝代碼,我對觸發信號有疑問:爲什麼不是rising_edge(trigger_signal),因爲它是我可以使用的脈衝?我在設計中有許多不同的時鐘:2,38,40,80Mhz – FlyerDragon 2015-03-04 15:57:15

+1

只有在rising_edge語句中使用真正的時鐘信號。它是同步設計的第一條規則,寫了很多。並確保使用觸發器同步的時鐘(即,塊的clk端口中的觸發器)如果您有許多不同的時鐘,則需要非常小心地將在一個域中驅動的信號移動到另一個域 - 搜索時鐘域交叉 – 2015-03-04 20:56:28

1

良好的反應是使用okRegisterBridge,但我可以在你的主板的描述看,這只是在USB 3.0 :(

然後是的,你的情況,如果你想增加你的地址空間可用你所要做的多路複用器與一個okWireIn的地址寄存器,一個用於寫數據。

+0

除了需要帶USB 3.0的筆記本電腦進行實驗之外,我還需要做什麼才能在VHDL和C#中切換到USB 3.0?當我開始編寫這個電路板時,第一個固件版本已經編碼,所以我沒有任何初始化USB通信的經驗。 – FlyerDragon 2015-02-24 13:27:02

+1

問題出自您使用的套件:https://www.opalkelly.com/products/xem6010/ 它與USB2.0一起使用。在您的[手冊](http://assets00.opalkelly.com/library/FrontPanel-UM.pdf)(第60頁)中,我看到只有帶有USB3.0的套件支持okRegisterBridge。 – FabienM 2015-02-24 14:15:11