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