《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 模擬設(shè)計(jì) > 業(yè)界動(dòng)態(tài) > 基于FPGA和USB3.0的通用數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)

基于FPGA和USB3.0的通用數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)

2017-04-27
作者:匡鵬,劉沖,王永綱
來(lái)源:2017年微型機(jī)與應(yīng)用第7期

  匡鵬,劉沖,王永綱

 ?。ㄖ袊?guó)科學(xué)技術(shù)大學(xué) 近代物理系,安徽 合肥 230026)

       摘要現(xiàn)場(chǎng)可編程門(mén)陣列(FPGA)的高度靈活性和強(qiáng)大的數(shù)據(jù)處理能力,使其在越來(lái)越多的領(lǐng)域得到應(yīng)用。USB 3.0也是目前主流的數(shù)據(jù)傳輸協(xié)議之一,具有速度快、功耗低等優(yōu)點(diǎn)。將USB 3.0接口應(yīng)用到FPGA上,能夠有效地解決FPGA與上位機(jī)之間的數(shù)據(jù)傳輸問(wèn)題,大大提高生產(chǎn)效率。文章利用USB 3.0的控制器芯片CYUSB3014實(shí)現(xiàn)了FPGA與上位機(jī)之間的高達(dá)390 MB/s的數(shù)據(jù)傳輸系統(tǒng)。

  關(guān)鍵詞高速數(shù)據(jù)傳輸系統(tǒng);現(xiàn)場(chǎng)可編程門(mén)陣列;USB 3.0;CYUSB3014

  中圖分類(lèi)號(hào):TP334.7;TN791文獻(xiàn)標(biāo)識(shí)碼:ADOI: 10.19358/j.issn.1674-7720.2017.07.008

  引用格式:匡鵬,劉沖,王永綱.基于FPGA和USB3.0的通用數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)[J].微型機(jī)與應(yīng)用,2017,36(7):26-28,34.

0引言

  現(xiàn)場(chǎng)可編程門(mén)陣列(FPGA)具有極高的靈活性以及強(qiáng)大的數(shù)據(jù)處理能力,在科學(xué)研究、大型實(shí)驗(yàn)儀器和商用醫(yī)療設(shè)備等諸多領(lǐng)域中早已被成熟使用。但是FPGA本身并沒(méi)有提供任何與上位機(jī)通信的接口,這使得FPGA與上位機(jī)之間傳輸數(shù)據(jù)變得很不方便。開(kāi)發(fā)者每次都必須根據(jù)具體外設(shè)重新開(kāi)發(fā)FPGA和上位機(jī)的數(shù)據(jù)傳輸系統(tǒng),從而降低了開(kāi)發(fā)效率。

  通用串行總線(xiàn)(USB)3.0標(biāo)準(zhǔn)早在2008年就已經(jīng)提出,現(xiàn)在已取代USB2.0成為USB主要使用版本。USB3.0比USB2.0有更高的傳輸速度和更低的功耗。USB3.0的協(xié)議速度高達(dá)5.0 Gb/s(625 MB/s),是USB2.0的10倍之多。CYUSB3014是賽普拉斯(CYPRESS)公司設(shè)計(jì)的一款USB3.0外設(shè)控制芯片,它的主要功能是在USB主機(jī)與外設(shè)之間傳輸高寬帶數(shù)據(jù)。該芯片提供一個(gè)第二代通用可編程接口(GPIF II),開(kāi)發(fā)者可以對(duì)GPIF II和FPGA編程,來(lái)實(shí)現(xiàn)從FPGA到USB控制器,再到上位機(jī)的數(shù)據(jù)傳輸通道。

  本文利用USB3.0外設(shè)控制器CYUSB3014,實(shí)現(xiàn)了基于FPGA與上位機(jī)之間的數(shù)據(jù)傳輸接口設(shè)計(jì)[13]。經(jīng)測(cè)試,本設(shè)計(jì)可以實(shí)現(xiàn)390 MB/s的FPGA到上位機(jī)的數(shù)據(jù)傳輸通道,以及355 MB/s的上位機(jī)到FPGA的數(shù)據(jù)傳輸通道,幾乎達(dá)到了該芯片支持的最高速度(400 MB/s)。

1系統(tǒng)結(jié)構(gòu)

001.jpg

  圖1為整個(gè)系統(tǒng)的結(jié)構(gòu)。上位機(jī)的軟件應(yīng)用程序(例如MATLAB)通過(guò)調(diào)用驅(qū)動(dòng)程序中的應(yīng)用程序編程接口(API),向CYUSB3014控制器發(fā)送數(shù)據(jù)或從它接收數(shù)據(jù);USB控制器芯片內(nèi)部通過(guò)直接內(nèi)存存?。―MA)互聯(lián)結(jié)構(gòu)建立USB端點(diǎn)到GPIF II的數(shù)據(jù)傳輸通道;FPGA內(nèi)部接口邏輯模塊負(fù)責(zé)其他邏輯模塊與GPIF之間的數(shù)據(jù)傳輸。

  圖1系統(tǒng)整體結(jié)構(gòu)本設(shè)計(jì)以FPGA接口邏輯為主設(shè)備,GPIF為從設(shè)備,接口邏輯負(fù)責(zé)控制整個(gè)系統(tǒng)的工作狀態(tài)。為了通用性起見(jiàn),本文設(shè)計(jì)了上位機(jī)對(duì)FPGA進(jìn)行FIFO讀寫(xiě)和寄存器讀寫(xiě)共4種功能。FIFO讀寫(xiě)可以完成高寬帶高速數(shù)據(jù)的雙向傳輸;寄存器讀寫(xiě)則可以完成控制和監(jiān)測(cè)的功能。這樣的設(shè)計(jì)能夠滿(mǎn)足大部分FPGA設(shè)計(jì)對(duì)上位機(jī)接口的需求。

2控制器芯片工作原理

  賽普拉斯公司設(shè)計(jì)生產(chǎn)的USB3.0外設(shè)控制芯片CYUSB3014具有高度集成的靈活特性,它具有一個(gè)可進(jìn)行完全配置的并行通用可編程接口GPIF II,可與任何處理器、ASIC或FPGA連接。芯片集成了USB 3.0和USB 2.0物理層(PHY)以及32位ARM926EJS微處理器,具有強(qiáng)大的數(shù)據(jù)處理能力,并可用于構(gòu)建定制應(yīng)用[1]。

  圖2表示了控制器芯片的數(shù)據(jù)輸入輸出。其中DMA描述符(DMA Descriptor)保存了DMA緩沖區(qū)的地址和大小,以及指向下一個(gè)DMA描述符的指針。套接字(Socket)是外設(shè)硬件模塊與RAM之間的連接點(diǎn),每個(gè)外設(shè)硬件模塊(如USB、GPIF、UART和SPI)具有各自固定的套接字?jǐn)?shù)量,簡(jiǎn)單來(lái)說(shuō)可以把套接字看成外設(shè)的接口。DMA緩沖區(qū)(DMA Buffer)是RAM的一部分,用來(lái)緩存外設(shè)間需要傳輸?shù)臄?shù)據(jù),這部分RAM的地址正是DMA描述符中保存的地址。

  

002.jpg

  當(dāng)外設(shè)之間進(jìn)行數(shù)據(jù)傳輸時(shí),例如將GPIF的數(shù)據(jù)傳輸?shù)経SB端點(diǎn),控制器會(huì)自動(dòng)加載相應(yīng)的DMA描述符,然后從GPIF的套接字接收數(shù)據(jù),保存到RAM中DMA描述符所指定的地址。當(dāng)前DMA描述符處理完后,系統(tǒng)會(huì)自動(dòng)加載下一個(gè)DMA描述符。DMA緩沖區(qū)的切換需要消耗幾個(gè)微秒的時(shí)間,在切換DMA緩沖區(qū)時(shí),當(dāng)前的DMA通道不能進(jìn)行數(shù)據(jù)傳輸[4]。當(dāng)某個(gè)DMA緩沖區(qū)被寫(xiě)滿(mǎn),或者GPIF主動(dòng)提交數(shù)據(jù)包時(shí),系統(tǒng)開(kāi)始把該緩沖區(qū)的數(shù)據(jù)發(fā)送到USB端點(diǎn)。從USB端點(diǎn)到GPIF的數(shù)據(jù)傳輸過(guò)程與之類(lèi)似,只不過(guò)數(shù)據(jù)傳輸?shù)姆较騽偤孟喾础?/p>

3系統(tǒng)設(shè)計(jì)

  3.1控制器芯片固件設(shè)計(jì)

  USB控制器芯片的固件設(shè)計(jì)包括GPIF II狀態(tài)機(jī)設(shè)計(jì)和運(yùn)行于芯片內(nèi)部ARM微處理器上的可執(zhí)行程序設(shè)計(jì)。其中,GPIF II狀態(tài)機(jī)的設(shè)計(jì)是關(guān)鍵,它描述了USB芯片如何響應(yīng)主設(shè)備FPGA接口邏輯模塊發(fā)出的請(qǐng)求。

  圖3給出了USB控制芯片與FPGA的接口連接。其中,CLK是由FPGA提供的頻率最高為100 MHz的時(shí)鐘信號(hào)。DATA信號(hào)是雙向數(shù)據(jù)線(xiàn),完成GPIF與FPGA之間的雙向數(shù)據(jù)傳輸。ADDR為地址線(xiàn),用于選擇使用哪個(gè)GPIF進(jìn)程傳輸數(shù)據(jù)。GPIF共有4個(gè)獨(dú)立進(jìn)程,每個(gè)進(jìn)程與相應(yīng)的DMA通道綁定。FPGA通過(guò)改變地址線(xiàn)ADDR,從而選擇使用哪個(gè)DMA通道進(jìn)行數(shù)據(jù)傳輸??刂菩盘?hào)均由FPGA發(fā)出,控制信號(hào)包括SLOE、SLCS、SLWR、SLRD、PKTEND,這些信號(hào)均為低電平有效。SLCS為片選信號(hào),系統(tǒng)工作時(shí),SLCS必須始終有效(即始終為0)。SLRD為讀請(qǐng)求信號(hào),該信號(hào)有效時(shí),GPIF會(huì)把緩存在RAM中的數(shù)據(jù)傳輸給FPGA。SLOE為輸出使能信號(hào),它的唯一作用是驅(qū)動(dòng)數(shù)據(jù)總線(xiàn)DATA翻轉(zhuǎn)。因?yàn)镕PGA發(fā)出讀請(qǐng)求后,USB芯片并不能立刻將有效數(shù)據(jù)傳遞到GPIF端點(diǎn),從SLRD有效到DATA有效有兩個(gè)時(shí)鐘周期的延遲[5],因此需要額外的數(shù)據(jù)總線(xiàn)驅(qū)動(dòng)信號(hào)SLOE。SLWR是寫(xiě)請(qǐng)求信號(hào),該信號(hào)有效時(shí),F(xiàn)PGA會(huì)發(fā)送數(shù)據(jù)給GPIF,GPIF隨之將這些數(shù)據(jù)緩存在RAM中。PKTEND為傳輸結(jié)束信號(hào),該信號(hào)用來(lái)標(biāo)志此次數(shù)據(jù)傳輸結(jié)束。

  

003.jpg

  另外,還有4個(gè)DMA標(biāo)志信號(hào)FLAGX。這些信號(hào)由USB芯片發(fā)出,F(xiàn)PGA接收。這些信號(hào)并不是由GPIF狀態(tài)機(jī)控制的,F(xiàn)LAG信號(hào)用來(lái)標(biāo)志指定DMA通道對(duì)應(yīng)的緩沖區(qū)的狀態(tài)。

  3.2FPGA接口設(shè)計(jì)

  FPGA接口既要完成與USB控制器GPIF II對(duì)接,同時(shí)也要提供對(duì)FPGA內(nèi)部邏輯模塊的數(shù)據(jù)傳輸接口。FPGA接口邏輯是本系統(tǒng)的核心,它作為主設(shè)備,控制著從設(shè)備GPIF的工作狀態(tài)。FPGA接口邏輯模塊內(nèi)部有一些標(biāo)志工作狀態(tài)的寄存器,用戶(hù)可以通過(guò)上位機(jī)軟件來(lái)配置這些寄存器,從而指定整個(gè)系統(tǒng)的工作模式。因此,在執(zhí)行某種操作之前,需要通過(guò)上位機(jī)軟件先對(duì)FPGA接口邏輯模塊進(jìn)行配置。

 

004.jpg

  FPGA接口邏輯除了具有3.1節(jié)中與GPIF II相連接的接口外,還提供了其他接口與FPGA內(nèi)部其他邏輯模塊相連接。圖4給出了這些接口信號(hào)。CLK是接口的工作時(shí)鐘(100 MHz),同時(shí)這個(gè)時(shí)鐘也是GPIF II的工作時(shí)鐘。RST是全局復(fù)位信號(hào)。剩下的信號(hào)則用來(lái)完成FIFO讀寫(xiě)和寄存器讀寫(xiě)的功能。

  在進(jìn)行FIFO讀操作時(shí),使用的接口信號(hào)是RD_ACK、RD_VALID和RD_DATA。當(dāng)RD_VALID有效時(shí),標(biāo)志著外部FIFO數(shù)據(jù)有效,RD_ACK作為應(yīng)答信號(hào)告知外部邏輯已經(jīng)完成對(duì)該有效數(shù)據(jù)的讀取。使用時(shí),先通過(guò)上位機(jī)軟件對(duì)接口邏輯模塊進(jìn)行配置,配置的信息確定了接口模塊將工作在讀FIFO模式,同時(shí)還確定了此次讀FIFO的數(shù)據(jù)個(gè)數(shù)。當(dāng)讀取FIFO的數(shù)據(jù)個(gè)數(shù)達(dá)到上位機(jī)所請(qǐng)求的個(gè)數(shù)時(shí),接口邏輯模塊停止讀取外部FIFO,同時(shí)停止向GPIF發(fā)送數(shù)據(jù),并且發(fā)出PKTEND信號(hào),標(biāo)志著此次傳輸結(jié)束。

  在進(jìn)行FIFO寫(xiě)操作時(shí),使用的接口信號(hào)是WR_ACK、WR_READY、WR_DATA。當(dāng)WR_READY有效時(shí),標(biāo)志著接口模塊可以向外部FIFO寫(xiě)入數(shù)據(jù),WR_ACK作為應(yīng)答信號(hào)告知外部邏輯已經(jīng)完成了數(shù)據(jù)的寫(xiě)入。與讀FIFO類(lèi)似,使用時(shí)先通過(guò)上位機(jī)軟件對(duì)接口模塊進(jìn)行配置。配置信息確定了接口模塊工作在FIFO寫(xiě)模式,同時(shí)確定了將要寫(xiě)入的數(shù)據(jù)個(gè)數(shù)。

005.jpg

  圖5FPGA接口邏輯狀態(tài)機(jī)圖5給出了FPGA接口邏輯模塊的狀態(tài)機(jī)向GPIF收發(fā)數(shù)據(jù)時(shí)的工作流程。系統(tǒng)最初處在空閑狀態(tài)(IDLE),然后根據(jù)配置信息確定的工作模式,以及DMA通道的FLAG標(biāo)志信號(hào),進(jìn)入相應(yīng)的狀態(tài)機(jī)流程中。

  此外,接口邏輯模塊還實(shí)現(xiàn)了寄存器讀寫(xiě)的功能,寄存器讀寫(xiě)使用的DMA通道與FIFO讀寫(xiě)的通道相同,只是傳輸?shù)臄?shù)據(jù)個(gè)數(shù)始終為1。

  3.3上位機(jī)軟件設(shè)計(jì)

  賽普拉斯官方提供了USB控制器芯片的驅(qū)動(dòng)程序,并且提供了相應(yīng)的應(yīng)用程序接口(API)。為了使用方便,本設(shè)計(jì)在官方提供的API基礎(chǔ)上,將主要功能(FIFO讀寫(xiě)和寄存器讀寫(xiě))用C++封裝成動(dòng)態(tài)鏈接庫(kù)(DLL)。這樣用戶(hù)可以直接在自己的C/C++工程中調(diào)用已經(jīng)封裝好的庫(kù)函數(shù)。在封裝庫(kù)函數(shù)時(shí),已經(jīng)將配置FPGA接口模塊這步工作封裝在了相應(yīng)的功能函數(shù)中,這樣用戶(hù)就不必先單獨(dú)配置FPGA邏輯模塊。

  考慮到現(xiàn)在大部分研究階段的數(shù)據(jù)處理工作都是使用MATLAB進(jìn)行,本設(shè)計(jì)進(jìn)一步將DLL函數(shù)封裝成MATLAB函數(shù),以便MATLAB能夠直接使用USB的相關(guān)功能。

4測(cè)試結(jié)果

  4.1測(cè)試環(huán)境


006.jpg

  測(cè)試環(huán)境如表1所示。

  4.2寄存器讀寫(xiě)測(cè)試

  寄存器讀寫(xiě)只涉及到正確性問(wèn)題,測(cè)試工程在FPGA內(nèi)部例化了16個(gè)32 bit的寄存器。測(cè)試時(shí)對(duì)某個(gè)寄存器隨機(jī)寫(xiě)入一個(gè)數(shù)值,然后再把該寄存器的值讀回來(lái),比較讀取的值是否等于寫(xiě)入的數(shù)值。經(jīng)循環(huán)對(duì)這16個(gè)寄存器進(jìn)行讀寫(xiě)測(cè)試,發(fā)現(xiàn)寄存器讀寫(xiě)功能能夠穩(wěn)定地正常工作。

  4.3FIFO回環(huán)測(cè)試

  FIFO回環(huán)測(cè)試是為了驗(yàn)證FIFO讀寫(xiě)的正確性。測(cè)試時(shí),MATLAB先將1 024個(gè)數(shù)據(jù)寫(xiě)入到FPGA的FIFO中,然后再將這些數(shù)據(jù)從該FIFO中讀出,驗(yàn)證讀出的數(shù)據(jù)是否是原來(lái)寫(xiě)入的數(shù)據(jù)。經(jīng)過(guò)測(cè)試,F(xiàn)IFO讀寫(xiě)也能正常穩(wěn)定地工作。

  4.4讀寫(xiě)FIFO速度測(cè)試

  測(cè)試讀FIFO時(shí),F(xiàn)PGA內(nèi)部一直將某個(gè)加1的計(jì)數(shù)器的值寫(xiě)入FIFO,MATLAB則從該FIFO中讀取數(shù)據(jù)。測(cè)試寫(xiě)FIFO時(shí),MATLAB一直將數(shù)據(jù)寫(xiě)入FPGA的FIFO中,F(xiàn)PGA內(nèi)部邏輯負(fù)責(zé)讀取該FIFO。MATLAB每次讀取或者寫(xiě)入5 000 000個(gè)數(shù)據(jù)(每個(gè)數(shù)據(jù)32 bit),循環(huán)操作50次,記錄這50次操作所消耗的總時(shí)間,記為t(單位為s)。則,讀寫(xiě)FIFO的速度為:

  50×5 000 000×328×1 000 000×t(MB/s)

  經(jīng)測(cè)試,本設(shè)計(jì)讀FIFO的速度能夠達(dá)到390 MB/s左右,而寫(xiě)FIFO的速度能夠達(dá)到355 MB/s左右。

5結(jié)論

  本設(shè)計(jì)利用USB 3.0控制器芯片CYUSB3014實(shí)現(xiàn)了FPGA與上位機(jī)之間的高寬帶數(shù)據(jù)傳輸系統(tǒng)。主要實(shí)現(xiàn)的功能包括上位機(jī)對(duì)FPGA的寄存器讀寫(xiě)和FIFO讀寫(xiě)。經(jīng)測(cè)試,這些功能都能穩(wěn)定地正常工作。上位機(jī)讀FIFO的速度能夠達(dá)到390 MB/s,寫(xiě)FIFO的速度能夠達(dá)到355 MB/s,接近于CYUSB3014芯片支持的理論最高速度400 MB/s。之所以讀FIFO的速度會(huì)比寫(xiě)FIFO的速度高出不少,主要原因是因?yàn)樵谠O(shè)計(jì)固件程序時(shí),讀FIFO使用了DMA雙通道,而寫(xiě)FIFO則只使用了DMA單通道。

  參考文獻(xiàn)

  [1] 陳松. 基于USB3.0的高速數(shù)據(jù)傳輸系統(tǒng)的研究與設(shè)計(jì)[D]. 成都: 電子科技大學(xué), 2014.

 ?。?] 徐超, 劉沖, 王永綱. 基于FPGA和USB2.0協(xié)議的通用數(shù)據(jù)傳輸設(shè)計(jì)[J]. 微型機(jī)與應(yīng)用, 2016,35(16): 41-43.

  [3] 王成儒, 李英偉. USB2.0原理與工程開(kāi)發(fā)[M]. 北京: 國(guó)防工業(yè)出版社, 2004.

 ?。?] 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.


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話(huà)通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話(huà):010-82306118;郵箱:aet@chinaaet.com。