DSP与FPGA之EMIF接口的调试说明

一、配置

模拟器开发板

(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

参考《tms320c6747.pdf》23页

 

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

 

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

  1. EMIFA寄存器

  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)

 

 

 

 

 

 

 

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

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

    AEMIF_A3CR = 0x9844C2D;//0x00a00505; //0000_1001_1000_0100_1100_0010_ 1101

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

 

 

 

 

 

 

 

 

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

 

 

 

  1. NANDFCR

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

三、地址映射

1.逻辑地址

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

0x00000140是偏移量

2.物理地址

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

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

  1. 地址映射关系

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

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

例1:

       偏移量à0x0140->0000 0001 0100 0000---(去掉最后两bit,且去除后第6位由0变为1)->000 0001 1100 00à emif_a[12:0]

例2:

       偏移量à0x4000->0100 0000 0000 0000---(去掉最后两bit,且去除后第6位由0变为1)->1000000100000à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位宽的数0x55550x6666

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》

  • 16
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值