??? 摘? 要:介紹一種Linux下的基于64位PCI總線(xiàn)和多片F(xiàn)PGA的高速計(jì)算平臺(tái)的設(shè)計(jì)和實(shí)現(xiàn),,利用Altera公司的PCI軟核——PCI_mt64構(gòu)建此平臺(tái)的PCI橋接口模塊,設(shè)計(jì)出一種兼容總線(xiàn)寬度64位/32位,、時(shí)鐘66MHz的PCI規(guī)范的接口模塊,以及與此相配合的DMA狀態(tài)機(jī),,并給出Linux驅(qū)動(dòng)的關(guān)鍵部分,。?
????關(guān)鍵詞: PCI_mt64; 現(xiàn)場(chǎng)可編程門(mén)陣列; DMA; Linux驅(qū)動(dòng)
?
??? PCI(Peripheral Component Interconnection)總線(xiàn)接口是目前一種應(yīng)用廣泛,、可兼容支持32/64位的局部總線(xiàn)接口,,它同時(shí)支持多組外圍設(shè)備,不受制于處理器,數(shù)據(jù)吞吐量大(32位時(shí)峰值高達(dá)132MB/s,,64位時(shí)峰值高達(dá)528MB/s)[1],。連接到PCI總線(xiàn)上的設(shè)備分為主設(shè)備和從設(shè)備,接口設(shè)計(jì)成為PCI總線(xiàn)與設(shè)備進(jìn)行數(shù)據(jù)傳輸?shù)臉蛄?。但是,,PCI總線(xiàn)協(xié)議十分復(fù)雜,不容易實(shí)現(xiàn),。目前實(shí)現(xiàn)PCI接口的有效方案有兩種:使用專(zhuān)用總線(xiàn)接口器件和專(zhuān)用PCI軟核IP-core,。?
??? 目前,業(yè)界基于32位PCI總線(xiàn)使用較多的接口芯片是AMCC公司的S59xx系列和PLX公司的PLX系列,。而對(duì)于64位的PCI總線(xiàn),,目前PLX公司的9656芯片雖然可以支持,但在設(shè)備本地端,,9656芯片只能提供32位的接口,,并不是完全的64位PCI接口芯片,數(shù)據(jù)的處理速度因此而受到限制,。?
??? 另一方面,,Linux操作系統(tǒng)是一種基于GNU通用公共許可證(GPL)架構(gòu)下、源碼公開(kāi)的免費(fèi)操作系統(tǒng),,繼承了Unix穩(wěn)定有效的特點(diǎn),,采用先進(jìn)的內(nèi)存管理機(jī)制,能有效地利用物理內(nèi)存,;與Windows相比,,Linux在安全性、漏洞修補(bǔ)上都具有其獨(dú)特的優(yōu)勢(shì),,因此,,目前Linux在工業(yè)、政府部門(mén)都有著廣泛的應(yīng)用,。?
??? 本文介紹一種在Linux操作系統(tǒng)下的,、64位66MHz高速PCI的FPGA通用并行計(jì)算平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)。該平臺(tái)采用Altera公司提供的IP軟核PCI_mt64[2-3],,自行設(shè)計(jì)本地端64位橋接口,;同時(shí),采用多片F(xiàn)PGA運(yùn)行不同的算法,,并在FPGA內(nèi)部實(shí)現(xiàn)算法的并行化,,從而大大提高了PC機(jī)對(duì)大運(yùn)算量的數(shù)字信號(hào)處理的能力。系統(tǒng)已成功應(yīng)用到MD5 的快速解密,。?
1 系統(tǒng)設(shè)計(jì)的目的?
??? 目前信號(hào)處理對(duì)于實(shí)時(shí)性要求的提高,,雖然也使CPU的運(yùn)算頻率日益提高,,可以大大提高某些大運(yùn)算量應(yīng)用計(jì)算的速度,但是獨(dú)占CPU資源并不是一個(gè)很好的選擇,;同時(shí)由于成本及其他因素的考慮,,也不可能專(zhuān)門(mén)使用多臺(tái)小型機(jī)進(jìn)行計(jì)算。在這種情況下,,將信號(hào)處理算法并行化,,運(yùn)行于高性能的FPGA,并通過(guò)適當(dāng)?shù)目偩€(xiàn)接口,,可以達(dá)到既不占用CPU資源,,同時(shí)又有多臺(tái)小型機(jī)同時(shí)運(yùn)算的性能。?
??? 本硬件平臺(tái)的設(shè)計(jì)目的是將64位66MHz的PCI接口與FPGA結(jié)合起來(lái),,使得該硬件平臺(tái)既可以保證數(shù)據(jù)量的高速吞吐和數(shù)據(jù)處理的實(shí)時(shí)性要求,,又可以在運(yùn)算處理過(guò)程中不占用CPU資源。另外,,由于采用多片高性能FPGA,,因此也可以選擇在該平臺(tái)上同時(shí)運(yùn)行多個(gè)算法,如陣列信號(hào)處理中的DOA算法,、波束形成算法等,。?
??? 以下對(duì)端口的定義及說(shuō)明均是基于實(shí)現(xiàn)該算法,而整個(gè)系統(tǒng)平臺(tái)適用于多種大計(jì)算量的數(shù)字信號(hào)處理,。?
2 系統(tǒng)硬件架構(gòu)?
??? 本系統(tǒng)利用1片Altera 公司的EP1S20F780C7芯片作為橋芯片,,負(fù)責(zé)加載本地橋模塊、配置算法FPGA,、DMA操作,、數(shù)據(jù)輪詢(xún)下發(fā)以及運(yùn)算結(jié)果上行接收和中斷;采用4片Altera公司的 EP2S60F484C5作為數(shù)據(jù)處理芯片,,可以加載不同的信號(hào)處理算法,,從而實(shí)現(xiàn)平臺(tái)的通用化。?
??? 在該系統(tǒng)架構(gòu)中,,PCI橋模塊的設(shè)計(jì)實(shí)現(xiàn),、DMA狀態(tài)機(jī)的操作流程和中斷的處理是其中的重點(diǎn)和難點(diǎn),下面分別予以說(shuō)明,。?
2.1 PCI橋模塊的設(shè)計(jì)?
??? 在本系統(tǒng)中,,為了縮短開(kāi)發(fā)周期,采用了Altera公司的IP軟核PCI_mt64,,這樣系統(tǒng)的設(shè)計(jì)就規(guī)避了PCI局部總線(xiàn)規(guī)范和PCI配置寄存器的實(shí)現(xiàn),,而能夠集中精力進(jìn)行本地橋模塊的設(shè)計(jì)。本地橋模塊結(jié)構(gòu)如圖1所示,,其基本設(shè)計(jì)思想如下:?
?
?
??? (1)橋模塊要實(shí)現(xiàn)對(duì)I/O空間與Memory空間的管理,、各種控制信號(hào)(包括中斷)的產(chǎn)生和數(shù)據(jù)流的處理,。其中,I/O空間定義一般寄存器和中斷寄存器,;Memory空間則包括了DMA寄存器和FIFO初始地址寄存器,其又包括以下子模塊:Interrupt模塊、FIFO管理模塊和DMA引擎(FIFO,、Memory空間實(shí)現(xiàn)方式),。其中FIFO管理模塊又可根據(jù)功能劃分為三個(gè)部分:橋FIFO(Bridge FIFO)、結(jié)果數(shù)據(jù)FIFO(Result FIFO)和FPGA配置FIFO(FPGA Configure FIFO),。?
??? 中斷模塊發(fā)出DMA傳輸?shù)南嚓P(guān)控制中斷,,如完成中斷、算法運(yùn)算結(jié)果的相關(guān)中斷,。在本系統(tǒng)中,,算法結(jié)果中斷分為三種,分別對(duì)應(yīng)于運(yùn)算有結(jié)果,、運(yùn)算中斷查詢(xún)和運(yùn)算無(wú)結(jié)果,,這三種類(lèi)型中斷由算法FPGA通過(guò)串行接口通知橋模塊。由于串行命令的可編碼,,因此中斷種類(lèi)可以根據(jù)不同的算法,、不同的場(chǎng)合而更改。?
??? 在橋模塊中,,最重要的部分是主從控制模塊的實(shí)現(xiàn),,其功能是執(zhí)行與PCI-core的交互、響應(yīng)PCI中的控制信號(hào),,并發(fā)出相應(yīng)的,、符合PCI時(shí)序的主從控制信號(hào)。?
??? (2)主從控制模塊中,,Local Target部分只負(fù)責(zé)對(duì)32位寄存器的讀寫(xiě),,功能較為簡(jiǎn)單,不需要啟動(dòng)DMA操作,,在Linux驅(qū)動(dòng)中可以在IOCTL中通過(guò)writeX( )和readX( )兩個(gè)函數(shù)對(duì)存儲(chǔ)空間進(jìn)行讀寫(xiě),,也可以通過(guò)inX( )和outX( )兩個(gè)函數(shù)對(duì)I/O空間讀寫(xiě)寄存器。其中X表示數(shù)據(jù)類(lèi)型:l表示long word,,w表示short word,,b表示byte[4]。?
??? (3) Local Master要進(jìn)行大數(shù)據(jù)量讀寫(xiě),,需要兼容32/64位,,同時(shí)與DMA模塊配合完成DMA數(shù)據(jù)傳輸,因此功能較為復(fù)雜,。具體說(shuō)明如下:?
??? 數(shù)據(jù)上行:上行數(shù)據(jù)(解密結(jié)果)由算法FPGA通過(guò)串行通信發(fā)送至橋模塊,,并經(jīng)過(guò)串并轉(zhuǎn)換存入Result FIFO,,同時(shí)通知中斷產(chǎn)生模塊產(chǎn)生中斷。PC機(jī)接收到中斷后即準(zhǔn)備讀取數(shù)據(jù):PC機(jī)端設(shè)置DMA寄存器(ACR,、BCR,、CSR),然后本地端根據(jù)DMA寄存器CSR的設(shè)置啟動(dòng)DMA操作,,完成Master寫(xiě)的流程,。?
??? 數(shù)據(jù)下行:由于下行數(shù)據(jù)(窮舉破解使用的密鑰)數(shù)據(jù)量大,而本地端的存儲(chǔ)空間有限,,因此系統(tǒng)采用由PC機(jī)端設(shè)置DMA寄存器(一般設(shè)置為16KB),,而本地端根據(jù)寄存器和存儲(chǔ)空間狀況,實(shí)現(xiàn)下列操作:?jiǎn)?dòng)DMA,、申請(qǐng)PCI總線(xiàn),、第一次PCI數(shù)據(jù)傳輸、傳輸完畢后判斷數(shù)據(jù)是否全部被傳輸,,如未全部完成則再次申請(qǐng)PCI傳輸直到所有數(shù)據(jù)傳輸完成,,此時(shí)申請(qǐng)DMA完成中斷。這個(gè)過(guò)程即是Master讀的流程,。?
??? 在上下行的數(shù)據(jù)通路中,,DMA的啟動(dòng)首先是由PC機(jī)端寫(xiě)入DMA控制寄存器(字節(jié)計(jì)數(shù)寄存器BCR,地址計(jì)數(shù)寄存器ACR)開(kāi)始,,再寫(xiě)入控制狀態(tài)寄存器CSR中的啟動(dòng)位,。主從控制模塊檢測(cè)到啟動(dòng)位置高后,即開(kāi)始DMA主模式狀態(tài)機(jī)的實(shí)現(xiàn),。?
2.2 主模式下?tīng)顟B(tài)機(jī)的實(shí)現(xiàn)?
??? 主動(dòng)傳輸時(shí)DMA狀態(tài)機(jī)的實(shí)現(xiàn)如圖2所示,,其各狀態(tài)說(shuō)明(DMA狀態(tài)機(jī)的編號(hào)與圖2相對(duì)應(yīng),如表1所示。其中重要的狀態(tài)轉(zhuǎn)移條件說(shuō)明如下:?
?
?
?
??? (1) WR_BUSY轉(zhuǎn)DONE:PC請(qǐng)求的數(shù)據(jù)全部傳輸完成,,或上行FIFO空,,或DMA從設(shè)備要求斷開(kāi)。?
??? (2) RETRY轉(zhuǎn)DONE:當(dāng)申請(qǐng)?jiān)僖淮蔚腜CI數(shù)據(jù)傳輸時(shí),,檢查下一次需要傳輸?shù)臄?shù)據(jù)量是否滿(mǎn)足PCI傳輸?shù)囊?,如條件不滿(mǎn)足,轉(zhuǎn)入DONE,。?
??? (3) RD_BUSY轉(zhuǎn)DONE:PCI數(shù)據(jù)傳輸尚未結(jié)束,,下行FIFO已滿(mǎn),或本次PCI傳輸結(jié)束,,并且DMA_BCR要求的數(shù)據(jù)已全部傳輸結(jié)束,,或DMA從設(shè)備要求斷開(kāi)?
??? (4) RD_BUSY轉(zhuǎn)RETRY:當(dāng)本次PCI進(jìn)入傳輸期、PCI總線(xiàn)要求重新申請(qǐng)時(shí),,或者當(dāng)前PCI的數(shù)據(jù)傳輸結(jié)束,,而未傳完DMA_BCR要求的數(shù)據(jù)量,。?
??? (5) IDLE轉(zhuǎn)LOAD:DMA_CSR寄存器啟動(dòng)位置位,DMA_BCR符合DMA傳輸要求,,本地端下行FIFO可寫(xiě)或上?
行FIFO內(nèi)有數(shù)據(jù),。?
2.3 DMA方式?
??? Altera公司的PCI_mt64對(duì)進(jìn)行內(nèi)存讀寫(xiě)的單次PCI傳輸數(shù)據(jù)量的限制:如果用總線(xiàn)Memory Read命令,則每次僅可以傳輸16個(gè)字節(jié)的數(shù)據(jù),;如果總線(xiàn)用Memory Read Multiple命令,,則每次最多可以傳輸4 096B的數(shù)據(jù)。由于本系統(tǒng)的目的在于運(yùn)行MD5快速解密算法,,PC經(jīng)PCI下發(fā)到設(shè)備的數(shù)據(jù)量是巨大的(GB量級(jí)),若由PC機(jī)端來(lái)進(jìn)行多次寫(xiě)DMA寄存器然后啟動(dòng)DMA,,則其軟件耗時(shí)不可忍受,;而當(dāng)該平臺(tái)應(yīng)用于實(shí)時(shí)數(shù)據(jù)處理時(shí),軟件耗時(shí)必須盡可能減小,。因此,,需要設(shè)計(jì)一種新的DMA傳輸方式:即由PC機(jī)端寫(xiě)一次DMA寄存器,而由本地端進(jìn)行多次DMA申請(qǐng),。?
??? 圖3給出了當(dāng)PC機(jī)申請(qǐng)16KB數(shù)據(jù)傳輸時(shí),,一次PCI傳輸即4 096字節(jié)傳輸完、等待7個(gè)時(shí)鐘周期后(狀態(tài)Retry,,mst_state = 6),,再次申請(qǐng)總線(xiàn)并開(kāi)始PCI傳輸?shù)倪^(guò)程。?
?
?
??? 鏈?zhǔn)?/a>DMA可以認(rèn)為是一組DMA的進(jìn)行,,并且每次DMA的數(shù)據(jù)包大小和地址可以不同[5],。同樣這里采用的DMA也可以認(rèn)為是一組DMA的進(jìn)行,與鏈?zhǔn)紻MA的區(qū)別在于DMA的讀寫(xiě)地址必須是連續(xù)的,,而相同點(diǎn)在于與每次傳輸?shù)臄?shù)據(jù)包的大小也是可以調(diào)節(jié)的,。在DMA數(shù)據(jù)地址是連續(xù)的情況下,與鏈?zhǔn)紻MA要寫(xiě)入多次DMA描述符相比,,本系統(tǒng)采用的DMA方式只需要寫(xiě)一次DMA描述符,,因此可以更有效率地完成DMA操作,其操作流程參如圖4所示,。同時(shí)由于本系統(tǒng)狀態(tài)機(jī)中已存在的LOAD狀態(tài),,若該狀態(tài)用于從DMA描述符FIFO中讀取描述符,則本文的DMA狀態(tài)機(jī)也可以用來(lái)實(shí)現(xiàn)鏈?zhǔn)紻MA,。?
?
?
2.4 Linux中斷處理?
??? Linux對(duì)于中斷的處理與Windows是不同的,,比較靈活,下面作簡(jiǎn)單介紹,。?
??? Windows中斷處理,,首先在中斷響應(yīng)函數(shù)中對(duì)PCI中斷做判斷,,如果是本設(shè)備的中斷則做簡(jiǎn)單操作(非數(shù)據(jù)處理),然后調(diào)用DPC(延時(shí)過(guò)程調(diào)用)例程,,在中斷處理函數(shù)中做中斷處理中未完成的操作,,如將數(shù)據(jù)由內(nèi)核緩沖區(qū)拷貝到用戶(hù)緩沖區(qū)。
??? 對(duì)比Windows,,Linux的中斷設(shè)計(jì)采用頂半部和底半部?jī)刹糠謱?shí)現(xiàn):頂半部相當(dāng)于中斷響應(yīng)函數(shù),;底半部相當(dāng)于Windows中的延時(shí)過(guò)程調(diào)用;Linux的底半部可以使用多種方式實(shí)現(xiàn),,使用tasklet或者workqueue即可以實(shí)現(xiàn)操作,。?
??? 普通的Linux中斷函數(shù)為void Demo_interrupt(int irq, void * dev_id, struct pt_regs * regs),如需要實(shí)現(xiàn)底半部(bottom half)時(shí),首先使用頂半部中斷處理函數(shù):?
??? Irqreturn_t Demo_bh_interrupt (int irq, void * dev_id,struct pt_regs * regs) {?
??? /* …… */?
??? Tasklet_schedule(&Demo_tasklet),;?//調(diào)用Demo_do_tasklet?
??? /* …… */?
??? Return IRQ_HANDLED,;??? }?
??? 底半部函數(shù):void Demo_do_tasklet (unsigned long)。?
??? 在使用tasklet之前,,首先需使用DECLARE_TASKLET(Demo_tasklet, Demo_do_tasklet, data)申明tasklet,,但也可以使用struct work_queue Demo_wq申明work queue(工作隊(duì)列);申明之后需要將后半部處理函數(shù)Demo_do_tasklet ( )放入工作隊(duì)列中,,可以使用下面的函數(shù):INIT_WORK(&Demo_wq, Demo_do_tasklet, NULL),。工作隊(duì)列的后半部函數(shù)與tasklet相同。?
3 設(shè)計(jì)結(jié)果與實(shí)測(cè)性能分析?
??? 使用VHDL編寫(xiě)代碼,,利用邏輯分析儀對(duì)運(yùn)行在實(shí)際硬件上的PCI橋代碼進(jìn)行分析,,圖5為邏輯分析儀上所截得時(shí)序圖、PCI關(guān)鍵信號(hào)(包括被動(dòng)模式和主動(dòng)模式的),。?
?
?
??? 使用Altera的Quartus II 7.1對(duì)程序進(jìn)行設(shè)計(jì)綜合,,PCI接口最低時(shí)鐘頻率為80MHz。綜合生成網(wǎng)表文件,,下載到FPGA,,經(jīng)過(guò)實(shí)際測(cè)試,系統(tǒng)運(yùn)行正常,,其橋模塊占用4 913邏輯單元和557 056位的存儲(chǔ)單元,。用安捷倫1 681AD型邏輯分析儀分析測(cè)試PCI關(guān)鍵信號(hào),其結(jié)果:系統(tǒng)每傳輸16KB數(shù)據(jù)的總時(shí)間為164.487μs,,數(shù)據(jù)傳輸時(shí)間為130.975μs,,系統(tǒng)開(kāi)銷(xiāo)為33.512μs,效率為79.5%,。而與普通非鏈?zhǔn)紻MA傳輸16KB數(shù)據(jù)的總時(shí)間比較,,以32位66MHz頻率的PCI系統(tǒng)為測(cè)試平臺(tái),可以得到如表2所示的結(jié)果。?
?
?
??? 從表2可以看出,本文所設(shè)計(jì)的DMA方法之所以效率會(huì)比傳統(tǒng)的非鏈?zhǔn)紻MA的方法要高,在于軟件響應(yīng)的時(shí)間大大縮短,,當(dāng)要傳送的數(shù)據(jù)量越大時(shí),,DMA的平均數(shù)據(jù)率就會(huì)越高。?
??? 本文設(shè)計(jì)的系統(tǒng)平臺(tái)已經(jīng)成功地應(yīng)用于MD5的解密,。通過(guò)實(shí)際性能的測(cè)試,,基于IP-core的64位接口設(shè)計(jì)完全達(dá)到了預(yù)期的性能目標(biāo),并且該平臺(tái)可以滿(mǎn)足大運(yùn)算量,、實(shí)時(shí)性要求高的數(shù)字信號(hào)處理算法的要求,。下一階段的工作,將在該平臺(tái)上實(shí)現(xiàn)陣列信號(hào)處理的算法,,以達(dá)到高速實(shí)時(shí)處理,,減少資源耗費(fèi)的目的。?
參考文獻(xiàn)?
[1]?Altera Corporation. PCI local bus?specification revison 2.2. 1998.?
[2]?Altera Corporation. PCI megacore?function user guide. 2003.?
[3]?Altera Corporation. PCI-MT64 megacore function reference design. 2003.?
[4] CORBET J,,RUBINI A,,HARTMAN?G K. Linux?device driver 3rd. O′Reilly, 2005.?
[5]?張浩,徐寧儀,,周祖成.基于PCI Core的鏈?zhǔn)紻MA控制器設(shè)計(jì). 計(jì)算機(jī)應(yīng)用, 2005,(3).