匡 鵬,劉 沖,王永綱
(中國科學技術(shù)大學 近代物理系,安徽 合肥 230026)
基于FPGA和USB3.0的通用數(shù)據(jù)傳輸系統(tǒng)設(shè)計
匡 鵬,劉 沖,王永綱
(中國科學技術(shù)大學 近代物理系,安徽 合肥 230026)
現(xiàn)場可編程門陣列(FPGA)的高度靈活性和強大的數(shù)據(jù)處理能力,使其在越來越多的領(lǐng)域得到應(yīng)用。USB 3.0也是目前主流的數(shù)據(jù)傳輸協(xié)議之一,具有速度快、功耗低等優(yōu)點。將USB 3.0接口應(yīng)用到FPGA上,能夠有效地解決FPGA與上位機之間的數(shù)據(jù)傳輸問題,大大提高生產(chǎn)效率。文章利用USB 3.0的控制器芯片CYUSB3014實現(xiàn)了FPGA與上位機之間的高達390 MB/s的數(shù)據(jù)傳輸系統(tǒng)。
高速數(shù)據(jù)傳輸系統(tǒng);現(xiàn)場可編程門陣列;USB 3.0;CYUSB3014
現(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è)計[1-3]。經(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)。上位機的軟件應(yīng)用程序(例如MATLAB)通過調(diào)用驅(qū)動程序中的應(yīng)用程序編程接口(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è)計對上位機接口的需求。
賽普拉斯公司設(shè)計生產(chǎn)的USB3.0外設(shè)控制芯片CYUSB3014具有高度集成的靈活特性,它具有一個可進行完全配置的并行通用可編程接口GPIF II,可與任何處理器、ASIC或FPGA連接。芯片集成了USB 3.0和USB 2.0物理層(PHY)以及32位ARM926EJ-S微處理器,具有強大的數(shù)據(jù)處理能力,并可用于構(gòu)建定制應(yīng)用[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描述符中保存的地址。
圖2 DMA通道示意圖
當外設(shè)之間進行數(shù)據(jù)傳輸時,例如將GPIF的數(shù)據(jù)傳輸?shù)経SB端點,控制器會自動加載相應(yīng)的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.1 控制器芯片固件設(shè)計
USB控制器芯片的固件設(shè)計包括GPIF II狀態(tài)機設(shè)計和運行于芯片內(nèi)部ARM微處理器上的可執(zhí)行程序設(shè)計。其中,GPIF II狀態(tài)機的設(shè)計是關(guān)鍵,它描述了USB芯片如何響應(yīng)主設(shè)備FPGA接口邏輯模塊發(fā)出的請求。
圖3給出了USB控制芯片與FPGA的接口連接。其中,CLK是由FPGA提供的頻率最高為100 MHz的時鐘信號。DATA信號是雙向數(shù)據(jù)線,完成GPIF與FPGA之間的雙向數(shù)據(jù)傳輸。ADDR為地址線,用于選擇使用哪個GPIF進程傳輸數(shù)據(jù)。GPIF共有4個獨立進程,每個進程與相應(yīng)的DMA通道綁定。FPGA通過改變地址線ADDR,從而選擇使用哪個DMA通道進行數(shù)據(jù)傳輸??刂菩盘柧蒄PGA發(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é)束。
圖3 FPGA與GPIF之間的接口連接
另外,還有4個DMA標志信號FLAGX。這些信號由USB芯片發(fā)出,F(xiàn)PGA接收。這些信號并不是由GPIF狀態(tài)機控制的,F(xiàn)LAG信號用來標志指定DMA通道對應(yīng)的緩沖區(qū)的狀態(tài)。
3.2 FPGA接口設(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接口邏輯模塊進行配置。
圖4 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作為應(yīng)答信號告知外部邏輯已經(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作為應(yīng)答信號告知外部邏輯已經(jīng)完成了數(shù)據(jù)的寫入。與讀FIFO類似,使用時先通過上位機軟件對接口模塊進行配置。配置信息確定了接口模塊工作在FIFO寫模式,同時確定了將要寫入的數(shù)據(jù)個數(shù)。
圖5 FPGA接口邏輯狀態(tài)機
圖5給出了FPGA接口邏輯模塊的狀態(tài)機向GPIF收發(fā)數(shù)據(jù)時的工作流程。系統(tǒng)最初處在空閑狀態(tài)(IDLE),然后根據(jù)配置信息確定的工作模式,以及DMA通道的FLAG標志信號,進入相應(yīng)的狀態(tài)機流程中。
此外,接口邏輯模塊還實現(xiàn)了寄存器讀寫的功能,寄存器讀寫使用的DMA通道與FIFO讀寫的通道相同,只是傳輸?shù)臄?shù)據(jù)個數(shù)始終為1。
3.3 上位機軟件設(shè)計
賽普拉斯官方提供了USB控制器芯片的驅(qū)動程序,并且提供了相應(yīng)的應(yīng)用程序接口(API)。為了使用方便,本設(shè)計在官方提供的API基礎(chǔ)上,將主要功能(FIFO讀寫和寄存器讀寫)用C++封裝成動態(tài)鏈接庫(DLL)。這樣用戶可以直接在自己的C/C++工程中調(diào)用已經(jīng)封裝好的庫函數(shù)。在封裝庫函數(shù)時,已經(jīng)將配置FPGA接口模塊這步工作封裝在了相應(yīng)的功能函數(shù)中,這樣用戶就不必先單獨配置FPGA邏輯模塊。
考慮到現(xiàn)在大部分研究階段的數(shù)據(jù)處理工作都是使用MATLAB進行,本設(shè)計進一步將DLL函數(shù)封裝成MATLAB函數(shù),以便MATLAB能夠直接使用USB的相關(guān)功能。
4.1 測試環(huán)境
測試環(huán)境如表1所示。
表1 測試環(huán)境
4.2 寄存器讀寫測試
寄存器讀寫只涉及到正確性問題,測試工程在FPGA內(nèi)部例化了16個32 bit的寄存器。測試時對某個寄存器隨機寫入一個數(shù)值,然后再把該寄存器的值讀回來,比較讀取的值是否等于寫入的數(shù)值。經(jīng)循環(huán)對這16個寄存器進行讀寫測試,發(fā)現(xiàn)寄存器讀寫功能能夠穩(wěn)定地正常工作。
4.3 FIFO回環(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速度測試
經(jīng)測試,本設(shè)計讀FIFO的速度能夠達到390 MB/s左右,而寫FIFO的速度能夠達到355 MB/s左右。
本設(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.
[2] 徐超, 劉沖, 王永綱. 基于FPGA和USB2.0協(xié)議的通用數(shù)據(jù)傳輸設(shè)計[J]. 微型機與應(yīng)用, 2016,35(16): 41-43.
[3] 王成儒, 李英偉. USB2.0原理與工程開發(fā)[M]. 北京: 國防工業(yè)出版社, 2004.
[4] Manaskant Desai, Karthik Sivaramskrishnan. O-ptimizing 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.
Design of universal data transmission system based on FPGA and USB3.0
Kuang Peng, Liu Chong, Wang Yonggang
(Department of Modern Physics, University of Science and Technology of China, Hefei 230026, China)
Field-programmable gate array (FPGA) is used more and more in various fields due to the highly flexible and powerful ability of data processing. USB 3.0 is one of the mainstream data transmission protocols, with the advantages of fast speed and low power consumption. Implementing USB 3.0 interface on FPGA can effectively solve the problem of data transmission between FPGA and the host computer, greatly improve production efficiency. In this paper, a data transmission system between FPGA and the host computer is designed and implemented with the USB 3.0 controller CYUSB3014, which achieves transmission speed of up to 390 MB/s.
high throughput data transmission system; FPGA; USB 3.0; CYUSB3014
TP334.7;TN791
A
10.19358/j.issn.1674- 7720.2017.07.008
匡鵬,劉沖,王永綱.基于FPGA和USB3.0的通用數(shù)據(jù)傳輸系統(tǒng)設(shè)計[J].微型機與應(yīng)用,2017,36(7):26-28,34.
2016-11-14)
匡鵬(1991-),通信作者,男,碩士研究生,主要研究方向:FPGA邏輯設(shè)計。E-mail: kp77@mail.ustc.edu.cn。
劉沖(1989-),男,博士,主要研究方向:基于FPGA的高精度TDC系統(tǒng)研究與設(shè)計。
王永綱(1965-),男,博士,教授,博士生導師,主要研究方向:正電子斷層掃描(PET)系統(tǒng)研究與設(shè)計。