摘 要:采用IP核的設(shè)計方法,將外設(shè)組件互連標(biāo)準(zhǔn)(PCI)總線接口與具體功能應(yīng)用集成在一個FPGA上芯片, 提高了系統(tǒng)的集成度。在對PCI IP核進(jìn)行概述的基礎(chǔ)上,介紹了IP核的設(shè)計方法,實現(xiàn)了PCI總線接口,并設(shè)計DMA 控制器解決了接口和主機(jī)間的數(shù)據(jù)傳輸瓶頸問題,最后說明了驅(qū)動程序的設(shè)計方法。通過在PCI機(jī)箱的實驗測試,設(shè)計在功能和時序上均符合PCI技術(shù)規(guī)范,而且硬件工作穩(wěn)定可靠,達(dá)到預(yù)期目標(biāo)。
0引言
外設(shè)組件互連標(biāo)準(zhǔn)(PeripheralComponentInterconnection,PCI)是一種由Intel公司1991年推出的用于局部總線的標(biāo)準(zhǔn)。PCI總線位寬32bit工作頻率33MHz,數(shù)據(jù)速率132Mbps,同時支持總線寬度擴(kuò)展到64bit, 工作頻率66MHz,數(shù)據(jù)速率528Mbps。PCI總線具有即插即用,中斷共享,高速 數(shù)據(jù)傳輸?shù)裙δ?[1,2] 。
PCI總線系統(tǒng)可以滿足通信與網(wǎng)絡(luò)的需求,在 嵌入式系統(tǒng)中具有廣泛的應(yīng)用前景。尤其是很多其 他的總線,如PXI和PCIE都是由PCI總線發(fā)展而來的。嵌入式系統(tǒng)可以在PCI總線上安裝各種擴(kuò)展卡以實現(xiàn)不同的功能??偩€的定義對協(xié)議、時序、負(fù)載、電器性能和機(jī)械性能都有嚴(yán)格的規(guī)定,充分保證運(yùn)行的可靠性和兼容性。
PCI總線接口的主要完成不同信號環(huán)境間的轉(zhuǎn)換,使得數(shù)據(jù)傳輸可以順暢進(jìn)行。
1PCI總線接口
PCI總線接口的實現(xiàn)方法有很多種。設(shè)計者可 以根據(jù)實現(xiàn)的難度, 成本以及板卡的尺寸限制等實際情況加以選擇[3,4]
1.1 專用接口芯片
如PLX公司的PCI9054、 PCI9656等。采用這些芯片的優(yōu)點是可靠性高,設(shè)計者可以避開復(fù)雜的PCI 總線接口關(guān)系。缺點是用戶可能只是用到部分功能, 會造成一定的資源浪費(fèi),并且設(shè)計上也缺乏靈活性。
1.2 專用IP核
優(yōu)點是開發(fā)速度快,靈活性好,縮短開發(fā)周期。缺點是IP核價格昂貴。例如Xilinx公司的LogiCore。
1.3自行開發(fā)
CPLD或FPGA自行設(shè)計。優(yōu)點是可以靈活實現(xiàn)PCI功能。節(jié)省系統(tǒng)的邏輯資源,方便系統(tǒng)升級。缺點是需要詳細(xì)了解PCI總線協(xié)議,實現(xiàn)難度大。
2 XilinxPCIIP核概述
Xilinx公司的PCIIP核版本是Initiator/Target v4.13forPCI。此IP核支持存儲器讀寫、I/O讀寫、配置空間讀寫3種讀寫方式。其最多有3個地址空間,每個大小都可根據(jù)用戶需要具體設(shè)置。如果有 不使用的BAR最好被禁用,以優(yōu)化其性能 [5,6] 。
PCIIP核對FPGA設(shè)備是預(yù)先實現(xiàn)和經(jīng)過驗證的模型。在FPGA芯片內(nèi)的管腳定義和資源的相關(guān)位置是定義好的,利用用戶約束文件控制關(guān)鍵路徑以確保設(shè)計的PCI接口的時序滿足要求。用戶通過選擇合適的芯片和用戶約束文件,包括管腳定義約 束和時序約束, 以滿足運(yùn)行在33/66MHzPCI時鐘下的時序要求。每種芯片和封裝都有特定的時序約束來保證接口的性能,所以用戶約束文件最好是在IP核推薦文件的基礎(chǔ)上增加用戶部分的時序約束。
此IP核文件還提供仿真測試文件,用戶可以改 變參數(shù)和時序, 完成應(yīng)用設(shè)計后對頂層文件進(jìn)行仿真驗證設(shè)計功能的正確性。
其主要的功能是將左邊復(fù)雜的PCI接口信號轉(zhuǎn)換成右邊的用戶接口數(shù)據(jù)和控制信號,完成用戶設(shè)備與PCI總線的信息傳遞。具體應(yīng)用時只需要關(guān)心 用戶側(cè)的信號, 具有很強(qiáng)的靈活性。根據(jù)用戶性質(zhì)的不同,用戶側(cè)的信號分為相對簡單的2組獨(dú)立的Target(被動)模式和Initiator(主動)模式的信號。用戶根據(jù)實際需要來確定應(yīng)用哪種模式,并選用相應(yīng)控制信號和狀態(tài)機(jī)信號作為接口。
3 應(yīng)用說明
3.1 Target操作
PCIIP核支持Target模式下的單個數(shù)據(jù)傳輸和多個數(shù)據(jù)傳輸。而且只要涉及到Initiator模式的數(shù)據(jù)傳輸就必須用到Target模式的接口,反之是不需要的。下面對Target模式下用戶側(cè)重要信號進(jìn)行簡 單介紹[6] 。
ADDR_VLD:地址總線上的地址有效;
S_DATA_VLD:ADIO_OUT總線上的數(shù)據(jù)有效;
S_WREN:‘1’標(biāo)志Target寫,‘0’標(biāo)志Target讀;
S_CBE[3:0]:總線命令和字節(jié)有效;
BASE_HIT[7:0]:基地址寄存器譯碼;
S_READY:數(shù)據(jù)傳輸準(zhǔn)備好; S_DATA:設(shè)備處于數(shù)據(jù)傳輸狀態(tài)。
3.2 Initiator操作
IP核作為PCI總線主設(shè)備進(jìn)行Initiator寫操作時, DMA控制器與Initiator控制邏輯模塊共同將FIFO緩存輸出的數(shù)據(jù)通過DMA操作發(fā)送到IP核 的本地端;Initiator讀操作時, Initiator控制邏輯模塊將IP核本地端的數(shù)據(jù)通過DMA操作發(fā)送到FIFO緩存的輸入端。下面對Initiator模式下用戶側(cè)重要信號進(jìn)行簡單介紹。
REQUEST:用來請求Initiator傳輸;
M_DATA_VLD:總線發(fā)生數(shù)據(jù)傳輸;
M_SRC_EN:數(shù)據(jù)指針增加;
M_READY:準(zhǔn)備好傳輸數(shù)據(jù);
M_ADDR_N:表示當(dāng)前操作的地址;
M_DATA:表示數(shù)據(jù)傳輸?shù)臓顟B(tài)。
4 IP核在FPGA上的具體實現(xiàn)
在Xilinx公司芯片XC5VLX50T-1I上利用PCI的IP核實現(xiàn)PCI接口的讀寫。FPGA的內(nèi)部結(jié)構(gòu)如 圖1所示。
圖1FPGA內(nèi)部結(jié)構(gòu)圖
4.1 寄存器讀寫
在Target模式下進(jìn)行數(shù)據(jù)傳輸,設(shè)備能做的就是響應(yīng)主設(shè)備的命令,接收數(shù)據(jù)完全處于被動狀態(tài)。設(shè)計只實現(xiàn)Target模式的單個數(shù)據(jù)傳輸,因此時序相對簡單。
4.2DMA操作
在Initiator模式下進(jìn)行數(shù)據(jù)傳輸必須嚴(yán)格按照PCI局部總線規(guī)范進(jìn)行。實際應(yīng)用時,將FPGA的數(shù)據(jù)通過PCI總線寫入到計算機(jī)內(nèi)存,若傳輸要求的速度高,通常以DMA方式實現(xiàn),由硬件設(shè)備代替CPU接管總線并負(fù)責(zé)數(shù)據(jù)傳輸,省去了由CPU負(fù)責(zé)傳輸時所必須的尋址指令。DMA控制器在IP核Initiatorburst寫操作基礎(chǔ)上完成。
DMA部分的設(shè)計是本地邏輯的重要部分,設(shè)計的優(yōu)劣會影響到數(shù)據(jù)的傳輸速率。參看參考文 獻(xiàn)[ 6]中的具體的控制流程狀態(tài)機(jī),如圖2所示。
圖2DMA控制狀態(tài)機(jī)
REQ_S:主設(shè)備開始向總線仲裁器申請總線;然后根據(jù)DIR確定進(jìn)入讀狀態(tài)還是寫狀態(tài)。
WRITE_S:寫狀態(tài);數(shù)據(jù)傳輸結(jié)束時,判斷是否需要重新申請總線。
READ_S:讀狀態(tài);數(shù)據(jù)傳輸結(jié)束時,判斷是否需要重新申請總線。
DEAD_S:致命錯誤的終結(jié)狀態(tài);OOPS_S:傳輸評估狀態(tài)。
根據(jù)DMA控制器程序的設(shè)計,需要設(shè)置的參數(shù)有目標(biāo)初始地址(START_ADDR)、目標(biāo)結(jié)束地址(END_ADDR)、讀寫設(shè)置(DIR)、burst長度(BURST_LENGTH)和開始標(biāo)志(START)。
Initiatorburstwrite模式實際工作時,在ChipScope軟件中觀察到的時序圖如圖3所示。
圖3用戶端DMA接口時序
4.3 驅(qū)動程序開發(fā)
在WindowsXP操作系統(tǒng)下,以VC++6.0為 開發(fā)環(huán)境, 利用WinDriver工具開發(fā)PCI接口的驅(qū)動程序。寄存器寫操作直接采用WinDriver提供的函數(shù)XXX_WriteDword();寄存器讀操作采用函數(shù)XXX_ReadDword()。
DMA操作分為2部分:①申請一段連續(xù)的內(nèi)存, 用函數(shù)WD_DMALock()申請指定大小的連續(xù)數(shù)據(jù)緩沖區(qū);②寫參數(shù)至FPGA相應(yīng)寄存器中,最后 啟動傳輸, 傳輸結(jié)束后,用DMA->pUserAddr訪問存放數(shù)據(jù)的數(shù)據(jù)緩沖區(qū)。
由此可見,利用Windriver開發(fā)PCI的驅(qū)動程序是較為方便的。另外,在驅(qū)動程序開發(fā)完成后,還可以很方便地打包成安裝文件,從而使驅(qū)動程序可以獨(dú)立運(yùn)行。
5結(jié)束語
基于PCI總線的接口設(shè)計已經(jīng)不是一個新鮮的課題,但隨著設(shè)計開發(fā)提出的指標(biāo)越來越高,開發(fā)的難度并未減弱。Xilinx公司的PCIIP核集成在FPGA中,完成接口功能,并與用戶邏輯配合工作,實現(xiàn)數(shù)據(jù)的緩存和傳輸。相比較采用專用處理芯片的方法,雖然增加了設(shè)計的復(fù)雜度,但是系統(tǒng)的可移植性好,系統(tǒng)升級也容易。經(jīng)過實踐測試,大大縮小 電路板面積, 更有靈活、穩(wěn)定、可靠的特點。對于DMA控制器的設(shè)計能提高數(shù)據(jù)傳輸?shù)乃俾剩?PCI總線的性能得到充分發(fā)揮,相信以后會得到更廣泛的應(yīng)用。
評論
查看更多