一、配置
模拟器开发板
(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。
- 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板块
- EMIFA寄存器
- 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 控制寄存器
- 下面一一介绍这三种寄存器:
参考《EMIFA-User’sGuide》3.2/3.5/3.12小节
- AWCCR
AEMIF_AWCCR = 0xff;//(1111_1111)
- CEnCFG(设置读写时序和选择数据总线位宽)
/* init CS4 - 8-bit normal async */
AEMIF_A3CR = 0x9844C2D;//0x00a00505;
感兴趣的可以跳到文中Section2.5.3等对应小节for more details
读写时序:具体参考《EMIFA-User’sGuide》2.5.4小节
- 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:
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
- 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》