一種基于MPC8260和FPGA的DMA接口設(shè)計(jì)與實(shí)現(xiàn)
引言
在基于軟件無(wú)線電的某無(wú)線通信信號(hào)偵收平臺(tái)的設(shè)計(jì)中,天線接收到的信號(hào)經(jīng)過(guò)變頻器處理和A/D變換之后,經(jīng)過(guò)高速通道把采集的信號(hào)送入主控板進(jìn)行數(shù)據(jù)分發(fā)處理。系統(tǒng)的結(jié)構(gòu)框圖如圖1所示。
圖1 主控板的系統(tǒng)結(jié)構(gòu)框圖
主控板的硬件核心是嵌入式微處理器MPC8260,負(fù)責(zé)系統(tǒng)軟件的加載、數(shù)據(jù)的分發(fā)以及與外界命令控制的交互。軟件上,采用高性能的VxWorks嵌入式實(shí)時(shí)操作系統(tǒng)。從天線接收到的射頻信號(hào)經(jīng)過(guò)變頻和A/D變換之后作為數(shù)據(jù)源連接到FPGA,F(xiàn)PGA對(duì)接收到的數(shù)據(jù)進(jìn)行中頻變換和信道估計(jì)等預(yù)處理后,在CPU的控制下將數(shù)據(jù)傳輸?shù)奖镜貎?nèi)存,最后CPU對(duì)數(shù)據(jù)打包后進(jìn)行快速分發(fā)。
嵌入式微控制器的典型代表是單片機(jī)(Microcontroller Unit),這種8位(8根數(shù)據(jù)線,8位指令)的電子器件目前在嵌入式設(shè)備中仍然有著極其廣泛的應(yīng)用。微控制器的最大特點(diǎn)是單片化,體積大大減小,從而使功耗和成本下降、可靠性提高。
嵌入式微處理器(Microprocessor Unit,MPU)由通用計(jì)算機(jī)中的CPU演變而來(lái)。與通用計(jì)算機(jī)中的CPU不同的是,在嵌入式應(yīng)用中,將微處理器裝配在專門設(shè)計(jì)的電路板上,只保留和嵌入式應(yīng)用緊密相關(guān)的功能硬件,去除其他的冗余功能部分,這樣就以最低的功耗和資源實(shí)現(xiàn)嵌入式應(yīng)用的特殊要求。此外,為了滿足嵌入式應(yīng)用的特殊要求,嵌入式微處理器在工作溫度、抗電磁干擾、可靠性等方面相對(duì)通過(guò)通用計(jì)算機(jī)中的CPU都做了各種增強(qiáng)。
如果每傳遞一個(gè)字節(jié)的數(shù)據(jù)都需要CPU的介入,那么不論是采用中斷驅(qū)動(dòng)還是采用程序查詢的方式,數(shù)據(jù)傳輸速率都會(huì)很低,無(wú)法滿足系統(tǒng)需求。MPC8260支持多種DMA實(shí)現(xiàn)方式,分別適用于不同數(shù)據(jù)傳輸源/目的設(shè)備、不同傳輸數(shù)據(jù)塊大小和存儲(chǔ)模式的需要,因此需要根據(jù)主控板的系統(tǒng)特點(diǎn)設(shè)計(jì)出合適的DMA傳輸接口。
1 MPC8260的 DMA系統(tǒng)結(jié)構(gòu)
圖2 CPM原理框圖
MPC8260是Freescale公司主要針對(duì)數(shù)據(jù)通信領(lǐng)域而設(shè)計(jì)的一種嵌入式PowerPC微處理器,具有雙核結(jié)構(gòu):1個(gè)高性能的MPC603e 64位RISC微處理器內(nèi)核和1個(gè)專為通信設(shè)計(jì)的32位RISC通信處理模塊(Communication Processor Module,CPM)。CPM的原理框圖如圖2所示。除了PowerPC內(nèi)核和CPM之外,MPC8260還包含一個(gè)靈活的系統(tǒng)接口單元(System Interface Unit,SIU)主要用于控制與外部總線的接口。
圖2中, CPM內(nèi)除了SDMA模塊以外,還包括通信控制器(Communications Processor,CP)、雙口RAM和一些串行外圍設(shè)備的控制接口等。SDMA和60x總線、本地總線相連,并且可以直接訪問(wèn)CPM內(nèi)部的雙口RAM。同時(shí),CPM還用這2個(gè)物理的SDMA通道模擬4個(gè)可編程控制的、獨(dú)立的DMA (Independent DMA,IDMA)通道,用于存儲(chǔ)器—存儲(chǔ)器及外設(shè)—存儲(chǔ)器之間的數(shù)據(jù)傳輸。
主控板上的FPGA和SDRAM都是掛接在MPC8260的60x總線上的,所以只能利用IDMA來(lái)實(shí)現(xiàn)二者之間的DMA傳輸。根據(jù)傳輸啟動(dòng)的觸發(fā)方式不同,IDMA可分為握手信號(hào)控制的IDMA傳輸和CP命令控制的IDMA傳輸兩種。下面分別介紹兩種方式的特點(diǎn)。
1.1 握手信號(hào)控制的IDMA傳輸
握手信號(hào)控制的IDMA傳輸主要用于外設(shè)和內(nèi)存之間的數(shù)據(jù)傳輸。每個(gè)IDMA通道都有3個(gè)握手信號(hào)用于傳輸握手控制:DMA請(qǐng)求信號(hào)DREQ[1~4]、DMA應(yīng)答信號(hào)DACK[1~4]和DMA結(jié)束信號(hào)DONE[1~4]。
在這種方式下,PowerPC內(nèi)核只需要參與IDMA通道初始化,之后的傳輸過(guò)程全部由CP按照通道參數(shù)設(shè)置和握手信號(hào)控制數(shù)據(jù)的收發(fā),在最大程度上釋放內(nèi)核。握手信號(hào)控制的缺點(diǎn)在于:① SDRAM中的數(shù)據(jù)和MPC8260的數(shù)據(jù)同步比較復(fù)雜。② 每次發(fā)出請(qǐng)求信號(hào)后都要進(jìn)行總線仲裁,并且在得到總線使用權(quán)之后一次只能夠傳輸外設(shè)端口大小或者32位的數(shù)據(jù),總線利用率低。③ 握手控制邏輯和時(shí)序比較復(fù)雜,加重了FPGA內(nèi)部控制邏輯設(shè)計(jì)的負(fù)擔(dān)。
雖然這種傳輸方式基本上不占用內(nèi)核資源,但是由于總線帶寬有限且利用率較低,所以在連續(xù)高速的通信條件下會(huì)造成內(nèi)核長(zhǎng)時(shí)間得不到總線使用權(quán)而一直處于等待狀態(tài)。因此,握手信號(hào)控制的IDMA一般只適用于由外設(shè)發(fā)起的、數(shù)據(jù)不是太頻繁的傳輸使用。
1.2 CP命令控制的IDMA傳輸
MPC8260的IDMA還可以通過(guò)向CP命令寄存器中寫(xiě)入START_IDMA命令進(jìn)行內(nèi)部觸發(fā)。每次啟動(dòng)傳輸以后PowerPC內(nèi)核就被釋放,傳輸?shù)脑吹刂?、目的地址和傳輸?shù)據(jù)長(zhǎng)度等參數(shù)由CP按照在IDMA通道初始化的信息控制執(zhí)行。每次傳輸?shù)淖畲箝L(zhǎng)度為4 GB。
相比握手信號(hào)控制的IDMA傳輸,在這種方式下,PowerPC內(nèi)核除了需要初始化IDMA通道以外還要以命令的形式啟動(dòng)每一次的傳輸,所以要占用多一些的內(nèi)核資源。不過(guò),在一次傳輸啟動(dòng)之后最多可以傳輸4 GB的數(shù)據(jù),所以只要每次傳輸?shù)臄?shù)據(jù)長(zhǎng)度比較長(zhǎng),內(nèi)核寫(xiě)一個(gè)寄存器的額外開(kāi)銷就完全可以忽略不計(jì)。同時(shí),由于內(nèi)部命令觸發(fā)方式不需要握手信號(hào),不需要頻繁地每幾個(gè)字節(jié)就競(jìng)爭(zhēng)一次總線控制權(quán),所以這種方式的傳輸效率更高、傳輸速度更快。內(nèi)部命令觸發(fā)方式是以空間換時(shí)間——用前端大的緩沖區(qū)來(lái)?yè)Q取傳輸速度的提升。
考慮到主控板上軟硬件系統(tǒng)的瓶頸都在于總線帶寬,而存儲(chǔ)資源相對(duì)比較豐富,所以選擇CP命令控制的IDMA傳輸作為數(shù)據(jù)流從FPGA到SDRAM的傳輸方式。
2 DMA傳輸方案設(shè)計(jì)
FPGA和MPC8260間的數(shù)據(jù)傳輸接口設(shè)計(jì)如圖3所示。圖中左側(cè)FPGA,通過(guò)16位數(shù)據(jù)線、10位地址線、2根中斷請(qǐng)求線和一些讀寫(xiě)控制信號(hào)線連接到右側(cè)的MPC8260。MPC8260通過(guò)64位數(shù)據(jù)線與本地內(nèi)存SDRAM相連。
圖3 IDMA傳輸設(shè)計(jì)框圖
FPGA內(nèi)部分配有兩個(gè)大的存儲(chǔ)空間,用于輪流緩沖從數(shù)據(jù)源接收到的數(shù)據(jù)。任何一個(gè)緩沖區(qū)收滿后,繼續(xù)接收的數(shù)據(jù)保存到下一個(gè)緩沖區(qū),同時(shí)以中斷的方式觸發(fā)MPC8260啟動(dòng)相應(yīng)的IDMA通道把數(shù)據(jù)傳到SDRAM中。IDMA控制、數(shù)據(jù)同步和錯(cuò)誤處理都由MPC8260完成,F(xiàn)PGA只負(fù)責(zé)收發(fā)數(shù)據(jù)和觸發(fā)中斷。下面分別介紹二者的程序設(shè)計(jì)。
2.1 MPC8260程序設(shè)計(jì)
MPC8260內(nèi)部的程序處理流程如圖4所示。MPC8260預(yù)先初始化兩個(gè)IDMA通道:通道的源地址和傳輸數(shù)據(jù)長(zhǎng)度等信息與FPGA中的緩沖區(qū)一一對(duì)應(yīng)。當(dāng)收到FPGA的中斷信號(hào)之后,如果此時(shí)對(duì)應(yīng)的IDMA通道空閑,則在中斷處理程序中發(fā)出CP命令開(kāi)始接收數(shù)據(jù),同時(shí)將對(duì)應(yīng)的IDMA通道置忙狀態(tài);否則,在FPGA中可能發(fā)生了未讀取的數(shù)據(jù)被覆蓋的情況,MPC8260進(jìn)入錯(cuò)誤處理程序。在數(shù)據(jù)傳輸結(jié)束時(shí)由DMA控制器發(fā)送CPM內(nèi)部中斷到內(nèi)核,在中斷處理程序中一方面要恢復(fù)IDMA通道的參數(shù)設(shè)置,另一方面要把該IDMA通道置閑狀態(tài)等待下一次傳輸?shù)拈_(kāi)始。
MPC8260程序的核心部分是IDMA通道設(shè)置和中斷處理。
圖4 MPC8260傳輸處理流程
2.1.1 IDMA通道設(shè)置
與一般的DMA通道設(shè)置一樣,IDMA通道設(shè)置的主要參數(shù)包括:源地址、目的地址和傳輸數(shù)據(jù)長(zhǎng)度。除此之外,MPC8260的 IDMA通道設(shè)置還包括通道模式、緩沖區(qū)和中斷配置等,所涉及的寄存器比較多,配置比較復(fù)雜。IDMA通道設(shè)置的邏輯結(jié)構(gòu)如圖5所示。
圖5 IDMA通道設(shè)置的邏輯結(jié)構(gòu)框圖
BD(Buffer Descriptors)表是用于指定傳輸方式、源/目的地址和數(shù)據(jù)長(zhǎng)度等基本信息的數(shù)據(jù)結(jié)構(gòu)。BD表的基地址由參數(shù)RAM中IBASE寄存器的值指定。IDMAx_BASE寄存器的地址是固定的,如IDMA1_BASE在偏移RAM基地址0x87FE的位置。CP就是通過(guò)IDMAx_BASE寄存器找到IDMA參數(shù)RAM,再通過(guò)IBASE找到BD表的順序初始化IDMA通道的。具體的寄存器配置可以參考文獻(xiàn)[1]第19章的IDMA編程示例。
為了提高通道的傳輸速率,系統(tǒng)中IDMA通道初始化應(yīng)該注意以下幾點(diǎn):
?、?需要在SIU中為FPGA配置UPM模式控制MPC8260和FPGA之間的突發(fā)讀寫(xiě)。不要使用通用目的片選機(jī)(GeneralPurpose Chipselect Machine,GPCM)模式。因?yàn)镸PC8260內(nèi)存控制的GPCM模式不支持突發(fā)傳輸,IDMA工作在GPCM模式下一方不論傳輸數(shù)據(jù)的長(zhǎng)度是否滿足突發(fā)的要求,都只能以普通的單次讀寫(xiě)進(jìn)行。
?、?把FPGA當(dāng)作存儲(chǔ)器操作,IDMA工作在內(nèi)存到內(nèi)存的雙地址模式下,緩沖區(qū)設(shè)為最大的2 KB。
?、?BD表的配置應(yīng)該與FPGA中的緩沖區(qū)一一對(duì)應(yīng)。BD表結(jié)構(gòu)中的CM(Continuous Mode)位應(yīng)該設(shè)置為緩沖鏈模式,在每一個(gè)BD表傳輸完之后,清BD表的有效位;同時(shí),CP根據(jù)下一個(gè)BD表的值自動(dòng)裝載IDMA寄存器進(jìn)行后面的傳輸。
IDMA通道初始化以后等待CP發(fā)出START_IDMA命令開(kāi)始傳輸。在最后一個(gè)BD表傳輸結(jié)束時(shí)觸發(fā)中斷信號(hào)通知PowerPC內(nèi)核本次傳輸過(guò)程的完成。傳輸過(guò)程中會(huì)發(fā)生改變的通道設(shè)置寄存器包括IDMA BD表指針、源地址、目的地址和BD表有效位等,所以在BD表傳輸結(jié)束的中斷處理程序中需要恢復(fù)這些寄存器為下一次傳輸作準(zhǔn)備。
2.1.2 中斷處理
中斷處理是與計(jì)算機(jī)專業(yè)有關(guān)的術(shù)語(yǔ)。引起中斷的事件稱為中斷源。中斷源向CPU提出處理的請(qǐng)求稱為中斷請(qǐng)求。發(fā)生中斷時(shí)被打斷程序的暫停點(diǎn)成為斷點(diǎn)。CPU暫?,F(xiàn)行程序而轉(zhuǎn)為響應(yīng)中斷請(qǐng)求的過(guò)程稱為中斷響應(yīng)。處理中斷源的程序稱為中斷處理程序。CPU執(zhí)行有關(guān)的中斷處理程序稱為中斷處理。
與一般中斷處理過(guò)程的區(qū)別在于:MPC8260中斷處理控制器采用分級(jí)結(jié)構(gòu)來(lái)擴(kuò)展中斷信號(hào)總數(shù)。CPM內(nèi)的中斷就是二級(jí)中斷,需要通過(guò)CPM中斷控制器和SIU中斷控制器兩級(jí)中斷控制。本設(shè)計(jì)中用來(lái)通知內(nèi)核本次傳輸過(guò)程結(jié)束的中斷是CPM內(nèi)最后一個(gè)BD表傳送結(jié)束的信號(hào)BC(BD Completed)。BC信號(hào)和命令結(jié)束等幾個(gè)信號(hào)一起通過(guò)SIU中斷掛起寄存器中的IDMA位向內(nèi)核發(fā)出中斷信號(hào)。所以在中斷初始化時(shí)要同時(shí)有效IDMA屏蔽寄存器和SIU中斷屏蔽寄存器對(duì)應(yīng)的比特位。具體的中斷初始化實(shí)例如下:
void IDMAint(void) {
*(long*)(IDMR1)=0x0F000000;/*使能IDMA1所有的二級(jí)中斷*/
*(long*)(IDMR2)=0x0F000000;/*使能IDMA2所有的二級(jí)中斷*/
*(long*)(SIMR_L)|=0x00000600;/*使能IDMA1和IDMA2在SIU中的中斷*/
*(long*)(SIMR_H)|=0x00006000;/*使能外部中斷IRQ1和IRQ2*/
*(long*)(SIEXR)|=0x00006000; /*設(shè)置IRQ1和IRQ2為下降沿觸發(fā)*/
*(long*)(SIUMCR)=0x81210000;/*配置SIU模式配置寄存器*/
/*連接中斷服務(wù)程序和中斷向量號(hào)*/
if((intConnect(INUM_TO_IVEC(INUM_IRQ1),(VOIDFUNCPTR)IRQ1Handler,0))==ERROR)
logMsg("intConnectIRQ1failedn",0,0,0,0,0,0);
if((intConnect(INUM_TO_IVEC(INUM_IRQ2),(VOIDFUNCPTR)IRQ2Handler,0))==ERROR)
logMsg("intConnectIRQ2failedn",0,0,0,0,0,0);
if((intConnect(INUM_TO_IVEC(INUM_IDMA1),(VOIDFUNCPTR)IDMA11Handler,0))==ERROR)
logMsg("intConnectIDMA1failedn",0,0,0,0,0,0);
if((intConnect(INUM_TO_IVEC(INUM_IDMA2),(VOIDFUNCPTR)IDMA2Handler,0))==ERROR)
logMsg("intConnectIDMA2failedn",0,0,0,0,0,0);
}
尤其要注意的是,中斷處理程序結(jié)束之前的清SIU中斷掛起寄存器,不能直接在SIU中斷掛起寄存器的IDMA位寫(xiě)1,而是要通過(guò)在IDMA事件寄存器的BC位寫(xiě)1來(lái)間接地清SIU中斷掛起寄存器。
2.2 FPGA部分程序
FPGA(Field-Programmable Gate Array),即現(xiàn)場(chǎng)可編程門陣列,它是在PAL、GAL、CPLD等可編程器件的基礎(chǔ)上進(jìn)一步發(fā)展的產(chǎn)物。它是作為專用集成電路(ASIC)領(lǐng)域中的一種半定制電路而出現(xiàn)的,既解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點(diǎn)
系統(tǒng)中的FPGA芯片選用Xilinx公司的VirtexII 3000。利用VirtexII內(nèi)嵌的大容量BlockRAM配置為單口RAM來(lái)做緩沖區(qū),在程序中可以用Xilinx的集成開(kāi)發(fā)環(huán)境ISE 7.1i內(nèi)部自帶的IP核生成。系統(tǒng)設(shè)計(jì)師可以根據(jù)需要通過(guò)可編輯的連接把FPGA內(nèi)部的邏輯塊連接起來(lái),就好像一個(gè)電路試驗(yàn)板被放在了一個(gè)芯片里。一個(gè)出廠后的成品FPGA的邏輯塊和連接可以按照設(shè)計(jì)者而改變,所以FPGA可以完成所需要的邏輯功能。
FPGA一般來(lái)說(shuō)比ASIC(專用集成芯片)的速度要慢,無(wú)法完成復(fù)雜的設(shè)計(jì),而且消耗更多的電能。但是他們也有很多的優(yōu)點(diǎn)比如可以快速成品,可以被修改來(lái)改正程序中的錯(cuò)誤和更便宜的造價(jià)。廠商也可能會(huì)提供便宜的但是編輯能力差的FPGA。因?yàn)檫@些芯片有比較差的可編輯能力,所以這些設(shè)計(jì)的開(kāi)發(fā)是在普通的FPGA上完成的,然后將設(shè)計(jì)轉(zhuǎn)移到一個(gè)類似于ASIC的芯片上。另外一種方法是用CPLD(復(fù)雜可編程邏輯器件備)。
FPGA設(shè)計(jì)的關(guān)鍵部分是和MPC8260的總線接口設(shè)計(jì)。通過(guò)適當(dāng)選擇緩沖區(qū)的起始地址和長(zhǎng)度,可以使MPC8260讀FPGA都以突發(fā)的方式進(jìn)行。設(shè)計(jì)中,MPC8260對(duì)FPGA的突發(fā)讀寫(xiě)遵循自己配置的UPM模式,所以要綜合考慮UPM模式設(shè)計(jì)和FPGA讀寫(xiě)邏輯設(shè)計(jì)。在設(shè)計(jì)UPM模式時(shí),可以在每次MPC8260鎖定數(shù)據(jù)總線數(shù)據(jù)之前由通用功能信號(hào)線(General Purpose Line,GPL)產(chǎn)生一個(gè)下降沿通知FPGA往數(shù)據(jù)總線上寫(xiě)新數(shù)據(jù);或者通過(guò)GPL把總線時(shí)鐘送到FPGA達(dá)到收發(fā)同步來(lái)完成MPC8260與FPGA之間的讀寫(xiě)。
3 總結(jié)
結(jié)合MPC8260的中斷處理和IDMA傳輸機(jī)制,設(shè)計(jì)了一種MPC8260和FPGA之間的高速數(shù)據(jù)傳輸接口。測(cè)試結(jié)果顯示:采用循環(huán)讀的方式把FPGA中的數(shù)據(jù)復(fù)制到SDRAM中,數(shù)據(jù)傳輸速率只有11 Mbps左右;而采用本文介紹的IDMA方式,最高速率能夠達(dá)到500 Mbps,并且內(nèi)核占用率較低,實(shí)驗(yàn)結(jié)果完全能夠滿足系統(tǒng)設(shè)計(jì)需求。本研究對(duì)于PowerPC系列CPU的接口設(shè)計(jì)有一定的參考價(jià)值。
評(píng)論