基于FPGA的高速訪問USB設(shè)備設(shè)計
摘要:針對FPGA訪問USB設(shè)備存在傳輸速率低、資源消耗大、開發(fā)復雜的缺點,提出了一種將ARM處理器與FPGA相結(jié)合實現(xiàn)高速訪問USB設(shè)備的方案。該方案利用ARM處理器的USB Host讀取USB設(shè)備數(shù)據(jù)井緩存于高速內(nèi)存,采用乒乓機制通過SRAM接口將數(shù)據(jù)傳給FPGA。經(jīng)測試,數(shù)據(jù)傳輸速率可以達到48 Mbps。該方案具有開發(fā)難度小,資源占用率低和傳輸速率高的特點,適合于FPGA高速讀取大量外部數(shù)據(jù)。
本文引用地址:http://www.ex-cimer.com/article/263272.htm引言
目前FPGA通過USB接口獲取USB設(shè)備中數(shù)據(jù)的方案大致分為兩大類,一類為在FPGA內(nèi)部實現(xiàn)USB設(shè)備控制,另一類為在FPGA外部實現(xiàn)USB設(shè)備控制。在FPGA內(nèi)部實現(xiàn)的方案需要在FPGA內(nèi)部實現(xiàn)USB控制器,在內(nèi)部實現(xiàn)或者外接USB收發(fā)器。該方案的實現(xiàn)具有較大難度,同時由于USB協(xié)議和文件系統(tǒng)都相當復雜,需要使用相當多的FPGA資源,因此完全不能滿足快速開發(fā)和低FPGA資源占用率的要求。在FPGA外部實現(xiàn)的方案通常使用單芯片的USB解決方案,典型的方案有兩種:一種是集成了USB控制器和USB收發(fā)器,但需自行實現(xiàn)文件系統(tǒng),如美國Cypress公司的CY7C67300;另一種是實現(xiàn)了包括文件系統(tǒng)在內(nèi)的所有USB讀取U盤所需的軟硬件,只需要FPGA發(fā)送命令進行控制即可實現(xiàn)讀取U盤,如南京沁恒電子的CH376。在這兩類方案中,CY7C67300集成度高,但其只支持USB 1.1,傳輸速率較低;同時需要FPGA對其進行配置和控制及實現(xiàn)文件系統(tǒng),F(xiàn)PGA端的開發(fā)量較大。CH376支持USB2.0接口,是一個真正的單芯片解決方案;但CH376只支持FAT16/32文件系統(tǒng),不支持NTFS文件系統(tǒng),無法讀取大于4 GB的大文件。另外,CH376需要FPGA進行配置和控制,因此需要實現(xiàn)CH376的控制邏輯并占用一定的FPGA資源。
由于現(xiàn)有方案均存在數(shù)據(jù)傳輸速率低、FPGA開發(fā)量大的缺點,本文提出了一種使用ARM+FPGA的方案,通過ARM處理器讀取USB設(shè)備數(shù)據(jù)并傳輸給FPGA,從而實現(xiàn)FPGA從USB設(shè)備獲取數(shù)據(jù)。該方案既能達到較高的數(shù)據(jù)傳輸速率,又能降低FPGA開發(fā)量,同時還具有很高的靈活性。
1 系統(tǒng)設(shè)計
本方案的系統(tǒng)設(shè)計如圖1所示。該系統(tǒng)由ARM處理器、FPGA和USB設(shè)備構(gòu)成,F(xiàn)PGA通過內(nèi)部開辟的異步RAM空間接收數(shù)據(jù),ARM處理器負責將USB設(shè)備中數(shù)據(jù)通過并行總線轉(zhuǎn)發(fā)給FPGA,USB設(shè)備支持常見的U盤、照相機、移動硬盤等支持USB接口的從設(shè)備。本設(shè)計還將ARM處理器的兩個引腳與FPGA的通信。指令線用于ARM向FPGA發(fā)送準備進行數(shù)據(jù)傳輸?shù)闹噶?響應(yīng)線用于FPGA在接收到ARM的通知并準備好后響應(yīng)ARM。與FPGA相連的DDR存儲器用于高速緩存大量圖像數(shù)據(jù),支持常見的DDR、DDR2和DDR3等類型。
1.1 ARM處理器選擇
本方案選用的ARM處理器為韓國三星公司的S5PV210。S5PV210是一款基于ARM Cortex—A8內(nèi)核的RSIC處理器,該芯片擁有強大的計算能力、豐富的內(nèi)部資源和外部接口,主頻高達1 GHz,同時它還擁有優(yōu)化的外部存儲器接口。外部存儲器接口為異步接口,時鐘頻率為133MHz,位寬為16位,具有完善且可調(diào)的時序控制功能,可用于連接ROM、SRAM、oneNAND、NAND Flash等多種存儲器,能滿足在高端通信服務(wù)中的數(shù)據(jù)帶寬要求。本方案使用這個接口完成數(shù)據(jù)從ARM處理器到FPGA的高速傳輸。
1.2 ARM與FPGA接口設(shè)計
本方案將FPGA異步RAM連接在ARM處理器的XM0內(nèi)存總線上,作為一個位寬為16位的SRAM使用,其對應(yīng)的硬件地址為0x10000000到0x1000 1002,共4 098字節(jié)。由于異步RAM的位寬為16位,故只需使用地址線ADDR 1~ADDR 13。指令線連接ARM處理器的GPIO引腳,方向為輸出,高電平有效。響應(yīng)線連接ARM處理器的中斷引腳,方向為輸入,上升沿有效。
1.3 軟件設(shè)計
在本方案中,ARM處理器以幀為單位向FPGA傳輸數(shù)據(jù)。每幀長度為4 098字節(jié),其中,幀頭長度為2字節(jié),數(shù)據(jù)長度為4 096字節(jié)。幀格式如圖2所示。
幀類型的取值為:此幀不是最后幀為00,此幀是最后幀則為11。幀長度為幀數(shù)據(jù)的長度,以字節(jié)為單位。
本方案所設(shè)計的軟件分為兩個部分一一驅(qū)動程序和應(yīng)用程序,軟件總體框圖如圖3所示。驅(qū)動程序在Linux系統(tǒng)中注冊硬件并提供控制硬件的功能函數(shù),以供應(yīng)用程序調(diào)用。應(yīng)用程序使用驅(qū)動程序提供的功能函數(shù)控制硬件,完成整個傳輸過程。軟件總體流程圖如圖4所示。
1.3.1 驅(qū)動程序設(shè)計
本方案涉及3種驅(qū)動程序:USB驅(qū)動程序、文件系統(tǒng)驅(qū)動程序和FPGA驅(qū)動程序。
Linux系統(tǒng)有豐富完善的USB設(shè)備和文件系統(tǒng)支持。本方案使用Linux系統(tǒng)中自帶的USB Mass Storage驅(qū)動程序和文件系統(tǒng)驅(qū)動程序,自行編寫FPGA驅(qū)動程序。FPGA驅(qū)動程序基于Linux系統(tǒng)字符設(shè)備驅(qū)動程序模型進行編寫。FPGA驅(qū)動程序的主要函數(shù)有初始化函數(shù)init()、寫入中斷服務(wù)函數(shù)write_int()、寫入函數(shù)write()。
初始化函數(shù)init()首先將FPGA異步RAM對應(yīng)的硬件地址0x10000000~0x10001002映射為Linux系統(tǒng)中的內(nèi)存虛擬地址A到A+4098(設(shè)映射的內(nèi)存虛擬地址起始為A),實現(xiàn)在Linux系統(tǒng)中直接向異步RAM寫入數(shù)據(jù)。然后,設(shè)置指令線、響應(yīng)線所對應(yīng)的寄存器。將指令線的方向設(shè)置為輸出,并輸出低電平;響應(yīng)線的方向設(shè)置為中斷輸入。最后,函數(shù)將響應(yīng)線中斷服務(wù)函數(shù)設(shè)置為write_int()。
寫入函數(shù)write()與寫入中斷服務(wù)函數(shù)write_int()配合,完成一次數(shù)據(jù)傳輸:
①當應(yīng)用程序調(diào)用寫入函數(shù)后,函數(shù)首先設(shè)置指令線為高電平指示FPGA準備傳輸數(shù)據(jù),然后將驅(qū)動程序置于休眠狀態(tài),等待喚醒。
?、贔PGA收到指令后判斷現(xiàn)在能否傳輸數(shù)據(jù),如果能,則在中斷線上發(fā)送一個上升沿。ARM處理器捕捉到該上升沿后,調(diào)用write_int(),喚醒驅(qū)動程序。
?、垓?qū)動程序被喚醒后,繼續(xù)執(zhí)行write()。write()函數(shù)首先根據(jù)應(yīng)用程序提供的參數(shù)生成幀頭,并將幀頭寫入地址ADDR和ADDR+1,完成幀頭的傳輸。隨后將數(shù)據(jù)寫入地址ADDR+2及其后的地址,完成數(shù)據(jù)的傳輸。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
fpga相關(guān)文章:fpga是什么
linux相關(guān)文章:linux教程
評論