<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 模擬技術(shù) > 設(shè)計應(yīng)用 > 基于MPC8260和FPGA的DMA接口設(shè)計

          基于MPC8260和FPGA的DMA接口設(shè)計

          作者:黃圣春 習(xí)勇 魏急波 趙海 國防科技大學(xué) 時間:2008-05-16 來源:單片機與嵌入式系統(tǒng)應(yīng)用 收藏

            1.2  CP命令控制的I傳輸

          本文引用地址:http://www.ex-cimer.com/article/82690.htm

            MPC8260的I還可以通過向CP命令寄存器中寫入START_I命令進(jìn)行內(nèi)部觸發(fā)。每次啟動傳輸以后PowerPC內(nèi)核就被釋放,傳輸?shù)脑吹刂?、目的地址和傳輸?shù)據(jù)長度等參數(shù)由CP按照在通道初始化的信息控制執(zhí)行。每次傳輸?shù)淖畲箝L度為4 GB。

            相比握手信號控制的傳輸,在這種方式下,PowerPC內(nèi)核除了需要初始化通道以外還要以命令的形式啟動每一次的傳輸,所以要占用多一些的內(nèi)核資源。不過,在一次傳輸啟動之后最多可以傳輸4 GB的數(shù)據(jù),所以只要每次傳輸?shù)臄?shù)據(jù)長度比較長,內(nèi)核寫一個寄存器的額外開銷就完全可以忽略不計。同時,由于內(nèi)部命令觸發(fā)方式不需要握手信號,不需要頻繁地每幾個字節(jié)就競爭一次總線控制權(quán),所以這種方式的傳輸效率更高、傳輸速度更快。內(nèi)部命令觸發(fā)方式是以空間換時間——用前端大的緩沖區(qū)來換取傳輸速度的提升。

            考慮到主控板上軟硬件系統(tǒng)的瓶頸都在于總線帶寬,而存儲資源相對比較豐富,所以選擇CP命令控制的IDMA傳輸作為數(shù)據(jù)流從到SDRAM的傳輸方式。

            2  DMA傳輸方案設(shè)計

            和MPC8260間的數(shù)據(jù)傳輸設(shè)計如圖3所示。圖中左側(cè),通過16位數(shù)據(jù)線、10位地址線、2根中斷請求線和一些讀寫控制信號線連接到右側(cè)的MPC8260。MPC8260通過64位數(shù)據(jù)線與本地內(nèi)存SDRAM相連。

                 

                    圖3  IDMA傳輸設(shè)計框圖

            FPGA內(nèi)部分配有兩個大的存儲空間,用于輪流緩沖從數(shù)據(jù)源接收到的數(shù)據(jù)。任何一個緩沖區(qū)收滿后,繼續(xù)接收的數(shù)據(jù)保存到下一個緩沖區(qū),同時以中斷的方式觸發(fā)MPC8260啟動相應(yīng)的IDMA通道把數(shù)據(jù)傳到SDRAM中。IDMA控制、數(shù)據(jù)同步和錯誤處理都由MPC8260完成,F(xiàn)PGA只負(fù)責(zé)收發(fā)數(shù)據(jù)和觸發(fā)中斷。下面分別介紹二者的程序設(shè)計。

            2.1  MPC8260程序設(shè)計

            MPC8260內(nèi)部的程序處理流程如圖4所示。MPC8260預(yù)先初始化兩個IDMA通道:通道的源地址和傳輸數(shù)據(jù)長度等信息與FPGA中的緩沖區(qū)一一對應(yīng)。當(dāng)收到FPGA的中斷信號之后,如果此時對應(yīng)的IDMA通道空閑,則在中斷處理程序中發(fā)出CP命令開始接收數(shù)據(jù),同時將對應(yīng)的IDMA通道置忙狀態(tài);否則,在FPGA中可能發(fā)生了未讀取的數(shù)據(jù)被覆蓋的情況,MPC8260進(jìn)入錯誤處理程序。在數(shù)據(jù)傳輸結(jié)束時由DMA控制器發(fā)送CPM內(nèi)部中斷到內(nèi)核,在中斷處理程序中一方面要恢復(fù)IDMA通道的參數(shù)設(shè)置,另一方面要把該IDMA通道置閑狀態(tài)等待下一次傳輸?shù)拈_始。

            MPC8260程序的核心部分是IDMA通道設(shè)置和中斷處理。

                 

                  圖4  MPC8260傳輸處理流程

            2.1.1  IDMA通道設(shè)置

            與一般的DMA通道設(shè)置一樣,IDMA通道設(shè)置的主要參數(shù)包括:源地址、目的地址和傳輸數(shù)據(jù)長度。除此之外,MPC8260的 IDMA通道設(shè)置還包括通道模式、緩沖區(qū)和中斷配置等,所涉及的寄存器比較多,配置比較復(fù)雜。IDMA通道設(shè)置的邏輯結(jié)構(gòu)如圖5所示。

                 

                              圖5  IDMA通道設(shè)置的邏輯結(jié)構(gòu)框圖

            BD(Buffer Descriptors)表是用于指定傳輸方式、源/目的地址和數(shù)據(jù)長度等基本信息的數(shù)據(jù)結(jié)構(gòu)。BD表的基地址由參數(shù)RAM中IBASE寄存器的值指定。除IDMA BD表的基地址之外,IDMA參數(shù)RAM內(nèi)還存放有IDMA BD指針、IDMA傳輸緩沖區(qū)的起始地址、IDMA傳輸緩沖區(qū)大小和DMA通道模式等IDMA通道信息。IDMA參數(shù)RAM的基地址由參數(shù)RAM中IDMAx_BASE寄存器的值指定。IDMAx_BASE寄存器的地址是固定的,如IDMA1_BASE在偏移RAM基地址0x87FE的位置。CP就是通過IDMAx_BASE寄存器找到IDMA參數(shù)RAM,再通過IBASE找到BD表的順序初始化IDMA通道的。具體的寄存器配置可以參考文獻(xiàn)[1]第19章的IDMA編程示例。

            為了提高通道的傳輸速率,系統(tǒng)中IDMA通道初始化應(yīng)該注意以下幾點:

            ①  需要在SIU中為FPGA配置UPM模式控制MPC8260和FPGA之間的突發(fā)讀寫。不要使用通用目的片選機(GeneralPurpose Chipselect Machine,GPCM)模式。因為MPC8260內(nèi)存控制的GPCM模式不支持突發(fā)傳輸,IDMA工作在GPCM模式下一方不論傳輸數(shù)據(jù)的長度是否滿足突發(fā)的要求,都只能以普通的單次讀寫進(jìn)行。

           ?、?nbsp; 把FPGA當(dāng)作存儲器操作,IDMA工作在內(nèi)存到內(nèi)存的雙地址模式下,緩沖區(qū)設(shè)為最大的2 KB。

           ?、?nbsp; BD表的配置應(yīng)該與FPGA中的緩沖區(qū)一一對應(yīng)。BD表結(jié)構(gòu)中的CM(Continuous Mode)位應(yīng)該設(shè)置為緩沖鏈模式,在每一個BD表傳輸完之后,清BD表的有效位;同時,CP根據(jù)下一個BD表的值自動裝載IDMA寄存器進(jìn)行后面的傳輸。

            IDMA通道初始化以后等待CP發(fā)出START_IDMA命令開始傳輸。在最后一個BD表傳輸結(jié)束時觸發(fā)中斷信號通知PowerPC內(nèi)核本次傳輸過程的完成。傳輸過程中會發(fā)生改變的通道設(shè)置寄存器包括IDMA BD表指針、源地址、目的地址和BD表有效位等,所以在BD表傳輸結(jié)束的中斷處理程序中需要恢復(fù)這些寄存器為下一次傳輸作準(zhǔn)備。



          關(guān)鍵詞: FPGA DMA 接口 微處理器 SDMA IDMA

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();