一、配置

模拟器开发板

(1). FPGA芯片:xc7k325t

(2). DSP 芯片:TM320C6747

代码:PCIeSDR-41625-FromBaiLi(内含DSP&FPGA)

二、EMIF简介

EMIF(External Memory Interface)是DSP外部存储器接口的简称,DSP访问片外存储器时必须通过EMIF控制。TM320C6747DSP具有两个EMIF:EMIFA和EMIFB。EMIFA数据总线位宽为8bit或16bit,EMIFB数据总线位宽为16bit或32bit,本文使用的是16bit数据总线位宽的EMIFA。

  1. EMIFA信号

EMIFA_D[15:0]:16bit位宽的数据总线

EMIFA_A[12:0]:13bit位宽的地址总线

EMIFA_BA[1:0]:2bit位宽的补位地址线

EMIFA_WE:写使能信号(低有效)

EMIFA_OE:读使能信号(低有效)

EMIFA_CS[2:5]:4个异步存储器片选信号CS2、CS3、CS4,CS5,本文使用的是片选4即CS4(低有效)(目前还不知道DSP怎样设置才能选择不同的片选信号,当前DSP代码直接选的CS4)。如下图所示,CS4寻址空间为32M

fpga EMMC控制逻辑 fpga emif程序_片选

参考《tms320c6747.pdf》23页

fpga EMMC控制逻辑 fpga emif程序_片选_02

 

参考《PCIE_SDR_V1P00-0424.pdf》模拟器PCB原理图 FPGA-EMIFA板块

 

fpga EMMC控制逻辑 fpga emif程序_fpga EMMC控制逻辑_03

参考《PCIE_SDR_V1P00-0424.pdf》模拟器PCB原理图 DSP-EMIFA板块

  1. EMIFA寄存器

fpga EMMC控制逻辑 fpga emif程序_寄存器_04

  1. EMIFA配置寄存器有三种:

(1). AWCCR(Asynchronous Wait Cycle Configuration Register)异步等待周期配置寄存器

       (2). CEnCFG(Asynchronous n Configuration Register)CEn配置寄存器(n=2/3/4/5)

       (3). NANDFCR(NAND Flash Control Register)NAND flash 控制寄存器

  1. 下面一一介绍这三种寄存器:

参考《EMIFA-User’sGuide》3.2/3.5/3.12小节

 

 

  1. AWCCR

AEMIF_AWCCR = 0xff;//(1111_1111)

fpga EMMC控制逻辑 fpga emif程序_fpga_05

fpga EMMC控制逻辑 fpga emif程序_寄存器_06

 

 

 

 

 

 

 

  1. CEnCFG(设置读写时序和选择数据总线位宽)

/* init CS4 - 8-bit normal async */

    AEMIF_A3CR = 0x9844C2D;//0x00a00505;

fpga EMMC控制逻辑 fpga emif程序_寄存器_07

fpga EMMC控制逻辑 fpga emif程序_dsp_08

fpga EMMC控制逻辑 fpga emif程序_fpga_09

fpga EMMC控制逻辑 fpga emif程序_片选_10

感兴趣的可以跳到文中Section2.5.3等对应小节for more details

 

 

 

 

 

 

 

 

读写时序:具体参考《EMIFA-User’sGuide》2.5.4小节

fpga EMMC控制逻辑 fpga emif程序_fpga_11

fpga EMMC控制逻辑 fpga emif程序_fpga EMMC控制逻辑_12

 

 

 

  1. NANDFCR

一开始以为是这个寄存器选择片选CSn,其实是EMIFA连接的外设是NAND flash 时配置片选信号,不用动程序最终选的就是片选4。

fpga EMMC控制逻辑 fpga emif程序_片选_13

fpga EMMC控制逻辑 fpga emif程序_fpga_14

fpga EMMC控制逻辑 fpga emif程序_fpga EMMC控制逻辑_15

三、地址映射

1.逻辑地址

       DSP写的数和读的数存放的地址,eg: 0x64000140;0x6400 0000是片选4起始地址

0x00000140是偏移量

fpga EMMC控制逻辑 fpga emif程序_dsp_16

2.物理地址

外设存储器的地址,cpu_addr[13:0] = {emif_a[12:0],emif_ba[1]};

当数据总线位宽为16bit,物理地址最低位是emif_ba[1]。

fpga EMMC控制逻辑 fpga emif程序_片选_17

  1. 地址映射关系

将逻辑地址和物理地址对应起来

当选择了片选之后,只要将逻辑地址的偏移量和物理地址相对应就行。

例1:

1100 00à emif_a[12:0]

例2:

100000àemif_a[12:0]

注:

       这个地址映射关系我没找到在哪里定义了,只是根据程序给出的对应关系推导得到的,可以直接拿来用。若知道怎么改对应关系可以改成更简单的映射关系。

//对应的情况64004000->1000000100000

//对应的情况64003000->0110000100000

//对应的情况64000000->0000000100000

//对应的情况64000002->0000000100000

//对应的情况64000004->0000000100001

//对应的情况64000008->0000000100010

//对应的情况6400000c->0000000100011

//对应的情况64000010->0000000100100

//对应的情况64000014->0000000100101

//对应的情况64000018->0000000100110

//对应的情况6400001c->0000000100111

四、FPGA-->DSP

1. FPGA向0x6400140和0x6400144地址分别写入411、211

always @(posedge cl)
 begin
    case(emif_a[12:0])
      //FPGA->DSP
      11'b0000001110000:            
           cpu_dr<=411;                   //64000140
     11'b0000001110001:
           cpu_dr<=211;                    //64000144
       endcase
end
assign emif_d[15:0]   = (~emif_oe) ? cpu_dr : {16{1'bZ}};

2.DSP将这两个地址的数打印出来

while(i++){
        short rdval1;
        short rdval2;
        rdval1 = (*((volatile unsigned short*)(0x64000140)));
        rdval2 = (*((volatile unsigned short*)(0x64000144)));
        printf("rdval1 = %d \r\n",rdval1);
        printf("rdval2 = %d \r\n",rdval2);
    }

五、DSP-->FPGA

1. FPGA将0x64000148和0x6400014c地址的数分别赋值给write_test1、write_test2

int i=1;
always @(posedge cl)
 begin
case(emif_a[12:0])
//FPGA->DSP
11'b0000001110010:
              write_test1<=emif_d[15:0]; // //64000148
11'b0000001110011:
              write_test2<=emif_d[15:0]; //6400014c
endcase
end

 

  1. DSP 向0x64000148和0x6400014c分别写入16位宽的数0x5555和0x6666
int i=1;
while(i++){
        short rdval3;
        short rdval4;
 
        rdval3 = (*((volatile unsigned short*)(0x64000148)));
        rdval4 = (*((volatile unsigned short*)(0x6400014c)));
 
        rdval3 = 0x5555;//注意是16位宽的数
        rdval4 = 0x6666;
    }

Or 在.h文件中声明好rdval1/2/3/4的地址

 

#define rdval1 (*((volatile unsigned short*)(0x64000140)))
#define rdval2 (*((volatile unsigned short*)(0x64000144)))
#define rdval3 (*((volatile unsigned short*)(0x64000148)))
#define rdval4 (*((volatile unsigned short*)(0x6400014c)))

 

 

 

参考文献

《tms320c6747.pdf》

《PCIE_SDR_V1P00-0424.pdf》

《EMIFA-User’sGuide》