匡鵬,劉沖,王永綱
?。ㄖ袊茖W技術大學 近代物理系,安徽 合肥 230026)
摘要:現場可編程門陣列(FPGA)的高度靈活性和強大的數據處理能力,使其在越來越多的領域得到應用。USB 3.0也是目前主流的數據傳輸協(xié)議之一,具有速度快、功耗低等優(yōu)點。將USB 3.0接口應用到FPGA上,能夠有效地解決FPGA與上位機之間的數據傳輸問題,大大提高生產效率。文章利用USB 3.0的控制器芯片CYUSB3014實現了FPGA與上位機之間的高達390 MB/s的數據傳輸系統(tǒng)。
關鍵詞:高速數據傳輸系統(tǒng);現場可編程門陣列;USB 3.0;CYUSB3014
中圖分類號:TP334.7;TN791文獻標識碼:ADOI: 10.19358/j.issn.1674-7720.2017.07.008
引用格式:匡鵬,劉沖,王永綱.基于FPGA和USB3.0的通用數據傳輸系統(tǒng)設計[J].微型機與應用,2017,36(7):26-28,34.
0引言
現場可編程門陣列(FPGA)具有極高的靈活性以及強大的數據處理能力,在科學研究、大型實驗儀器和商用醫(yī)療設備等諸多領域中早已被成熟使用。但是FPGA本身并沒有提供任何與上位機通信的接口,這使得FPGA與上位機之間傳輸數據變得很不方便。開發(fā)者每次都必須根據具體外設重新開發(fā)FPGA和上位機的數據傳輸系統(tǒng),從而降低了開發(fā)效率。
通用串行總線(USB)3.0標準早在2008年就已經提出,現在已取代USB2.0成為USB主要使用版本。USB3.0比USB2.0有更高的傳輸速度和更低的功耗。USB3.0的協(xié)議速度高達5.0 Gb/s(625 MB/s),是USB2.0的10倍之多。CYUSB3014是賽普拉斯(CYPRESS)公司設計的一款USB3.0外設控制芯片,它的主要功能是在USB主機與外設之間傳輸高寬帶數據。該芯片提供一個第二代通用可編程接口(GPIF II),開發(fā)者可以對GPIF II和FPGA編程,來實現從FPGA到USB控制器,再到上位機的數據傳輸通道。
本文利用USB3.0外設控制器CYUSB3014,實現了基于FPGA與上位機之間的數據傳輸接口設計[13]。經測試,本設計可以實現390 MB/s的FPGA到上位機的數據傳輸通道,以及355 MB/s的上位機到FPGA的數據傳輸通道,幾乎達到了該芯片支持的最高速度(400 MB/s)。
1系統(tǒng)結構
圖1為整個系統(tǒng)的結構。上位機的軟件應用程序(例如MATLAB)通過調用驅動程序中的應用程序編程接口(API),向CYUSB3014控制器發(fā)送數據或從它接收數據;USB控制器芯片內部通過直接內存存?。―MA)互聯(lián)結構建立USB端點到GPIF II的數據傳輸通道;FPGA內部接口邏輯模塊負責其他邏輯模塊與GPIF之間的數據傳輸。
圖1系統(tǒng)整體結構本設計以FPGA接口邏輯為主設備,GPIF為從設備,接口邏輯負責控制整個系統(tǒng)的工作狀態(tài)。為了通用性起見,本文設計了上位機對FPGA進行FIFO讀寫和寄存器讀寫共4種功能。FIFO讀寫可以完成高寬帶高速數據的雙向傳輸;寄存器讀寫則可以完成控制和監(jiān)測的功能。這樣的設計能夠滿足大部分FPGA設計對上位機接口的需求。
2控制器芯片工作原理
賽普拉斯公司設計生產的USB3.0外設控制芯片CYUSB3014具有高度集成的靈活特性,它具有一個可進行完全配置的并行通用可編程接口GPIF II,可與任何處理器、ASIC或FPGA連接。芯片集成了USB 3.0和USB 2.0物理層(PHY)以及32位ARM926EJS微處理器,具有強大的數據處理能力,并可用于構建定制應用[1]。
圖2表示了控制器芯片的數據輸入輸出。其中DMA描述符(DMA Descriptor)保存了DMA緩沖區(qū)的地址和大小,以及指向下一個DMA描述符的指針。套接字(Socket)是外設硬件模塊與RAM之間的連接點,每個外設硬件模塊(如USB、GPIF、UART和SPI)具有各自固定的套接字數量,簡單來說可以把套接字看成外設的接口。DMA緩沖區(qū)(DMA Buffer)是RAM的一部分,用來緩存外設間需要傳輸的數據,這部分RAM的地址正是DMA描述符中保存的地址。
當外設之間進行數據傳輸時,例如將GPIF的數據傳輸到USB端點,控制器會自動加載相應的DMA描述符,然后從GPIF的套接字接收數據,保存到RAM中DMA描述符所指定的地址。當前DMA描述符處理完后,系統(tǒng)會自動加載下一個DMA描述符。DMA緩沖區(qū)的切換需要消耗幾個微秒的時間,在切換DMA緩沖區(qū)時,當前的DMA通道不能進行數據傳輸[4]。當某個DMA緩沖區(qū)被寫滿,或者GPIF主動提交數據包時,系統(tǒng)開始把該緩沖區(qū)的數據發(fā)送到USB端點。從USB端點到GPIF的數據傳輸過程與之類似,只不過數據傳輸的方向剛好相反。
3系統(tǒng)設計
3.1控制器芯片固件設計
USB控制器芯片的固件設計包括GPIF II狀態(tài)機設計和運行于芯片內部ARM微處理器上的可執(zhí)行程序設計。其中,GPIF II狀態(tài)機的設計是關鍵,它描述了USB芯片如何響應主設備FPGA接口邏輯模塊發(fā)出的請求。
圖3給出了USB控制芯片與FPGA的接口連接。其中,CLK是由FPGA提供的頻率最高為100 MHz的時鐘信號。DATA信號是雙向數據線,完成GPIF與FPGA之間的雙向數據傳輸。ADDR為地址線,用于選擇使用哪個GPIF進程傳輸數據。GPIF共有4個獨立進程,每個進程與相應的DMA通道綁定。FPGA通過改變地址線ADDR,從而選擇使用哪個DMA通道進行數據傳輸??刂菩盘柧蒄PGA發(fā)出,控制信號包括SLOE、SLCS、SLWR、SLRD、PKTEND,這些信號均為低電平有效。SLCS為片選信號,系統(tǒng)工作時,SLCS必須始終有效(即始終為0)。SLRD為讀請求信號,該信號有效時,GPIF會把緩存在RAM中的數據傳輸給FPGA。SLOE為輸出使能信號,它的唯一作用是驅動數據總線DATA翻轉。因為FPGA發(fā)出讀請求后,USB芯片并不能立刻將有效數據傳遞到GPIF端點,從SLRD有效到DATA有效有兩個時鐘周期的延遲[5],因此需要額外的數據總線驅動信號SLOE。SLWR是寫請求信號,該信號有效時,FPGA會發(fā)送數據給GPIF,GPIF隨之將這些數據緩存在RAM中。PKTEND為傳輸結束信號,該信號用來標志此次數據傳輸結束。
另外,還有4個DMA標志信號FLAGX。這些信號由USB芯片發(fā)出,FPGA接收。這些信號并不是由GPIF狀態(tài)機控制的,FLAG信號用來標志指定DMA通道對應的緩沖區(qū)的狀態(tài)。
3.2FPGA接口設計
FPGA接口既要完成與USB控制器GPIF II對接,同時也要提供對FPGA內部邏輯模塊的數據傳輸接口。FPGA接口邏輯是本系統(tǒng)的核心,它作為主設備,控制著從設備GPIF的工作狀態(tài)。FPGA接口邏輯模塊內部有一些標志工作狀態(tài)的寄存器,用戶可以通過上位機軟件來配置這些寄存器,從而指定整個系統(tǒng)的工作模式。因此,在執(zhí)行某種操作之前,需要通過上位機軟件先對FPGA接口邏輯模塊進行配置。
FPGA接口邏輯除了具有3.1節(jié)中與GPIF II相連接的接口外,還提供了其他接口與FPGA內部其他邏輯模塊相連接。圖4給出了這些接口信號。CLK是接口的工作時鐘(100 MHz),同時這個時鐘也是GPIF II的工作時鐘。RST是全局復位信號。剩下的信號則用來完成FIFO讀寫和寄存器讀寫的功能。
在進行FIFO讀操作時,使用的接口信號是RD_ACK、RD_VALID和RD_DATA。當RD_VALID有效時,標志著外部FIFO數據有效,RD_ACK作為應答信號告知外部邏輯已經完成對該有效數據的讀取。使用時,先通過上位機軟件對接口邏輯模塊進行配置,配置的信息確定了接口模塊將工作在讀FIFO模式,同時還確定了此次讀FIFO的數據個數。當讀取FIFO的數據個數達到上位機所請求的個數時,接口邏輯模塊停止讀取外部FIFO,同時停止向GPIF發(fā)送數據,并且發(fā)出PKTEND信號,標志著此次傳輸結束。
在進行FIFO寫操作時,使用的接口信號是WR_ACK、WR_READY、WR_DATA。當WR_READY有效時,標志著接口模塊可以向外部FIFO寫入數據,WR_ACK作為應答信號告知外部邏輯已經完成了數據的寫入。與讀FIFO類似,使用時先通過上位機軟件對接口模塊進行配置。配置信息確定了接口模塊工作在FIFO寫模式,同時確定了將要寫入的數據個數。
圖5FPGA接口邏輯狀態(tài)機圖5給出了FPGA接口邏輯模塊的狀態(tài)機向GPIF收發(fā)數據時的工作流程。系統(tǒng)最初處在空閑狀態(tài)(IDLE),然后根據配置信息確定的工作模式,以及DMA通道的FLAG標志信號,進入相應的狀態(tài)機流程中。
此外,接口邏輯模塊還實現了寄存器讀寫的功能,寄存器讀寫使用的DMA通道與FIFO讀寫的通道相同,只是傳輸的數據個數始終為1。
3.3上位機軟件設計
賽普拉斯官方提供了USB控制器芯片的驅動程序,并且提供了相應的應用程序接口(API)。為了使用方便,本設計在官方提供的API基礎上,將主要功能(FIFO讀寫和寄存器讀寫)用C++封裝成動態(tài)鏈接庫(DLL)。這樣用戶可以直接在自己的C/C++工程中調用已經封裝好的庫函數。在封裝庫函數時,已經將配置FPGA接口模塊這步工作封裝在了相應的功能函數中,這樣用戶就不必先單獨配置FPGA邏輯模塊。
考慮到現在大部分研究階段的數據處理工作都是使用MATLAB進行,本設計進一步將DLL函數封裝成MATLAB函數,以便MATLAB能夠直接使用USB的相關功能。
4測試結果
4.1測試環(huán)境
測試環(huán)境如表1所示。
4.2寄存器讀寫測試
寄存器讀寫只涉及到正確性問題,測試工程在FPGA內部例化了16個32 bit的寄存器。測試時對某個寄存器隨機寫入一個數值,然后再把該寄存器的值讀回來,比較讀取的值是否等于寫入的數值。經循環(huán)對這16個寄存器進行讀寫測試,發(fā)現寄存器讀寫功能能夠穩(wěn)定地正常工作。
4.3FIFO回環(huán)測試
FIFO回環(huán)測試是為了驗證FIFO讀寫的正確性。測試時,MATLAB先將1 024個數據寫入到FPGA的FIFO中,然后再將這些數據從該FIFO中讀出,驗證讀出的數據是否是原來寫入的數據。經過測試,FIFO讀寫也能正常穩(wěn)定地工作。
4.4讀寫FIFO速度測試
測試讀FIFO時,FPGA內部一直將某個加1的計數器的值寫入FIFO,MATLAB則從該FIFO中讀取數據。測試寫FIFO時,MATLAB一直將數據寫入FPGA的FIFO中,FPGA內部邏輯負責讀取該FIFO。MATLAB每次讀取或者寫入5 000 000個數據(每個數據32 bit),循環(huán)操作50次,記錄這50次操作所消耗的總時間,記為t(單位為s)。則,讀寫FIFO的速度為:
50×5 000 000×328×1 000 000×t(MB/s)
經測試,本設計讀FIFO的速度能夠達到390 MB/s左右,而寫FIFO的速度能夠達到355 MB/s左右。
5結論
本設計利用USB 3.0控制器芯片CYUSB3014實現了FPGA與上位機之間的高寬帶數據傳輸系統(tǒng)。主要實現的功能包括上位機對FPGA的寄存器讀寫和FIFO讀寫。經測試,這些功能都能穩(wěn)定地正常工作。上位機讀FIFO的速度能夠達到390 MB/s,寫FIFO的速度能夠達到355 MB/s,接近于CYUSB3014芯片支持的理論最高速度400 MB/s。之所以讀FIFO的速度會比寫FIFO的速度高出不少,主要原因是因為在設計固件程序時,讀FIFO使用了DMA雙通道,而寫FIFO則只使用了DMA單通道。
參考文獻
?。?] 陳松. 基于USB3.0的高速數據傳輸系統(tǒng)的研究與設計[D]. 成都: 電子科技大學, 2014.
?。?] 徐超, 劉沖, 王永綱. 基于FPGA和USB2.0協(xié)議的通用數據傳輸設計[J]. 微型機與應用, 2016,35(16): 41-43.
?。?] 王成儒, 李英偉. USB2.0原理與工程開發(fā)[M]. 北京: 國防工業(yè)出版社, 2004.
?。?] Manaskant Desai, Karthik Sivaramskrishnan. Optimizing USB 3.0 throughput with EZ USB FX3TM[EB/OL]. (2015 10 22)[2016-10-30]. http://www.cypress.com/file/125281.
[5] Rama Sai Krishna V. Designing with the EZ USB FX3 Slave FIFO Interface[EB/OL]. (2014 07 21)[2016 10 30]. http://www.cypress.com/file/136056.