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