DSP

DSP EMIF 与FPGA 双口BRAM

2019-07-13 10:28发布

为实现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 #include 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);