6678EMIF地址映射关系
EMIF特征:
- 四个片选空间各64MB,组成256MB的异步地址寻址范围(不是全用)
- 8位和16位数据宽度
- 24位地址线,每个空间可寻址16M地址空间
- 可编程配置的时序周期
- 时钟为CPU/6
- 不支持32位数据宽度
- 不支持同步设备操作(DRAM、DDR)
6678EMIF可以在以下两种模式下操作:
- WE strobe mode(we 选通模式):CE3的默认模式,其他空间不支持该模式。
- Select strobe mode:四个空间都支持该模式,会覆盖we模式
EMIF可配置的参数主要为:
- Setup(R/W):默认16个周期
- Strobe(R/W):默认64个周期
- Hold(R/W):默认8个周期
(WE模式读)
(WE模式写)
(SS模式读)
(SS模式写)
地址线在FPGA中的映射关系
6678EMIF为每个CE空间分配了64MB的访问空间,CE0-CE3对应起始地址分别为70000000-74000000-78000000-7C000000,在16位数据宽度模式下,访问空间为(2^24 2)/1024/1024=32MB,8位数据宽度为(2^24 * 1)/1024/1024=16MB。
DSP生成的是32位地址,而EMIF只能发送其中的24位,是DSP的第1位到第24位,第0位不发送,DSP地址的*第1位连接在A23引脚**上,第2到第24位分别映射A0到A22。举个例子容易理解,运行以下程序:(这里直接用int16 int32代表不同数据宽度整型类型)
int16 data = 1;
*(int16*)78001003 = data;
在FPGA抓取EMIF总线可以看到地址为800800,对应【A23:A0】,将A23拼到最低位,整理得到的地址成为801。左移一位变为1002,所以可以看到发送的是78001003的第1位到第24位,0位没发送。
在FPGA中处理接收到地址首先将A23拼到最低位,即【A22:A0,A23】,将拼完后的十六进制地址左移一位,便是DSP实际发送的地址。
那么第0位干嘛用的,为什么不发送呢?据我研究,这一位主要用于8位数据模式下工作,0发送低八位,1发送高八位,对于16位数据模式这一位没有任何影响。举例说明,将emif配置为16位模式,发送一个十六位的数据给8位地址线
int16 data = 0x1007;
*(int8*)78001000 = data;//A
*(int8*)78001001 = data;//B
A语句后总线数据为0x0007
B语句后总线数据为0x0700
所以第0位控制八位数据放在高8位还是低8位。当然,如果emif配置为8位模式,也就不存在这个问题了,直接发送0x07到data线上。
那么,可以推理出在16位emif宽度下,发送或者接收32位数据时,第1bit起到了类似的作用,所以将其放在了最高位发送。