1. 程式人生 > >DSP EMIF 與FPGA 雙口BRAM

DSP EMIF 與FPGA 雙口BRAM

為實現DSP與FPGA之間實現交換資料,通常採用DSP的EMIF外部儲存器藉口與FPGA 片內的BRAM,

BRAM 採用雙口BRAM ,一個埠給DSP EMIF介面,另一個埠給 FPGA 片內邏輯。

FPGA 片內邏輯對BRAM 的讀寫在上一文中以實現,本文主要實現DSP 對 BRAM 的讀寫。

DSP 片內EMIF 介面訊號如下圖:

訊號說明:

————————————————共用訊號——————————————————

ECLKIN             EMIF外部輸入時鐘

ED[63:0]            EMIF 資料匯流排

EA[19:0]             ENIF 地址匯流排

BA[1:0]               當EMIF 配置為8位或是16為時,低兩位地址線

BE[7:0]              位元組使能

CE2                  CE2空間片選使能 ,低有效

CE3                  CE3空間片選使能  ,低有效               

CE4                  CE4空間片選使能 ,低有效

CE5                  CE5空間片選使能 ,低有效

————————————————非同步訊號——————————————————

ARDY               非同步Ready輸入訊號

R/W                  非同步讀寫訊號

AOE                  非同步輸出使能訊號

AWE                 非同步寫選通訊號

————————————————同步訊號——————————————————

ECLKOUT      EMIF輸出時鐘

SOE                 同步輸出使能

SADS/SRE      當暫存器CEnCFG中的R_ENABLE為1時,該訊號為同步讀使能訊號

                          當暫存器CEnCFG中的R_ENABLE為0時,該訊號為同步地址選通訊號

SWE                 同步寫使能訊號

————————————————保持訊號——————————————————

HOLD              匯流排保持請求訊號

HOLDA            應答請求訊號

BUSREQ         匯流排請求訊號

對於TMS320C6455的EMIF 儲存空間對映圖如下:

從上圖可看出,每個儲存空間有8M 的空間,都可以配置為同步和非同步介面

由於這裡FPGA內部的雙口RAM 採用了同步模式,並將BRAM掛接在CE4空間下,所以EMIF 的CE4 配置為同步模式

採用同步模式,首先是時鐘,將ECLKOUT 與雙口RAM 的時鐘引腳相連

使能訊號與雙口RAM 的時鐘引腳相連

讀寫訊號與雙口RAM 讀寫相連,地址匯流排,資料匯流排。

由上面的分析,FPGA 與DSP 之間的連線如下圖:

其中,FPGA 對雙口RAM 的讀寫上一篇中一實現,下面實現DSP對RAM 讀寫的實現

DSP 的配置,以實現EMIF 的CE4空間配置為同步模式,由於BRAM 掛接在CE4空間,所以要配置CE4CFG暫存器

先來看看該暫存器的說明,如下圖:

暫存器說明:

——————————————————————————————————

SSEL                  暫存器選擇,1同步儲存器,0非同步儲存器

RD_BE_EN      為1時在同步儲存器讀期間被驅動,為0時,在同步儲存器讀期間一直為高,

                            這個一般情況下都為0,也就是讀取是每個位元組都有效

CE_EXT             外部同步儲存器片選,為1

R_ENABLE       同步儲存器讀使能模式,為1時選擇ASRE,即同步讀使能訊號,為0時同步地址選通,所以這裡為1

W_LTNCY         為0時,0時鐘週期寫延時

                            為1時,1時鐘週期寫延時

                            為2時,2時鐘週期寫延時

                            為3時,3時鐘週期寫延時,從上一篇文中FPGA 內部雙口RAM 可知寫延時為0,這裡配置為0

R_LTNCY         為0時,0時鐘週期讀延時

                           為1時,1時鐘週期讀延時

                           為2時,2時鐘週期讀延時,從上一篇文中FPGA  內部雙口RAM 可知讀延時為2,這裡配置為2

SBSIZE             為0時,資料位寬為8

                           為1時,資料位寬為16                          

                           為2時,資料位寬為32

                           為3時,資料位寬為64

——————————————————————————————————

如何實現上述暫存器的配置,在DSP下,通常採用CSL(片上支援庫)

使用CSL配置EMIFA模組時,主要的步驟如下:

 1. 使能裝置EMIFA模組
 2. 配置CEnCFG暫存器
 3. 初始化EMIFA模組
 4. 開啟EMIFA模組
 5. 把2中配置的引數設定到開啟的EMIFA模組中

所須包含的標頭檔案:

#include <csl_emifa.h>
#include <cslr_dev.h>

CE4空間首地址的定義:

#define EMIFA_CE4_BASE_ADDR    (0xC0000000u)

儲存器型別的定義:

#define EMIFA_MEMTYPE_ASYNC    0
#define EMIFA_MEMTYPE_SYNC     1

定義EMIF例項控制代碼:

CSL_EmifaHandle    hEmifa;

使能EMIF:

 CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERCFG1, DEV_PERCFG1_EMIFACTL, ENABLE);

定義同步儲存器引數:

#define CSL_EMIFA_SYNCCFG_RLTNCY_PARAMETER  2//讀延時2週期
#define CSL_EMIFA_SYNCCFG_SBSIZE_PARAMETER  2//32位資料匯流排
#define CSL_EMIFA_SYNCCFG_READEN_PARAMETER 1//同步讀使能
定義CE4CFG暫存器引數巨集:
#define CSL_EMIFA_SYNCCFG_PARAMETER {\
    (Uint8)CSL_EMIFA_SYNCCFG_READBYTEEN_DEFAULT, \
    (Uint8)CSL_EMIFA_SYNCCFG_CHIPENEXT_DEFAULT, \
    (Uint8)CSL_EMIFA_SYNCCFG_READEN_PARAMETER, \
    (Uint8)CSL_EMIFA_SYNCCFG_WLTNCY_DEFAULT, \
    (Uint8)CSL_EMIFA_SYNCCFG_RLTNCY_PARAMETER, \
    (Uint8)CSL_EMIFA_SYNCCFG_SBSIZE_PARAMETER \
}

相關變數定義:

    CSL_EmifaObj           emifaObj;
    CSL_Status             status;
    CSL_EmifaHwSetup       hwSetup;
    CSL_EmifaHandle        hEmifa;
    CSL_EmifaMemType       syncVal;
    CSL_EmifaSync          syncMem = CSL_EMIFA_SYNCCFG_PARAMETER;//將上述引數填入儲存器變數 

配置CE4CFG暫存器:

    syncVal.ssel  = EMIFA_MEMTYPE_SYNC;
    syncVal.async  = NULL;
    syncVal.sync  = &syncMem;
    hwSetup.ceCfg[0] = NULL; //對應CE2  
    hwSetup.ceCfg[1] = NULL; //對應CE3
    hwSetup.ceCfg[2] = &syncVal; //對應CE4
    hwSetup.ceCfg[3] = NULL; //對應CE5

初始化EMIFA模組:

status = CSL_emifaInit(NULL);

開啟EMIFA模組:

hEmifa = CSL_emifaOpen(&emifaObj,CSL_EMIFA,NULL,&status);

將配置的引數設定到開啟的EMIFA模組中:

status = CSL_emifaHwSetup(hEmifa,&hwSetup);