FPGA Notes

External Memory Controller (EMC) 的地址线计算

0
阅读(2722)

Situation: 用 EDK BSB Wizard 建 Spartan3A 的工程, NOR Flash 控制器的地址线接到了一个 Bus Split Utility 上。乍一眼看很正常,因为 Flash 的地址线就二十多根,而 XPS_MCH_EMC 的地址线定死了是32位,由于 MHS 的语法不支持分片功能,所以就要加个 Bus Split。但后来又发现不对劲了:一共32位地址线,为啥选出来第10到第30位呢?

Answer:仔细看了 XPS_MCH_EMC 的 Datasheet,才发现关于地址、数据线的接法在 Datasheet 的17页到22页有详细讲解。

下面做个简单的解释:

1. EDK使用Big Endian,而Memory是Little Endian,所以连接时的映射顺序需要颠倒一下,所以你会看到MEM_A[10:30] = Flash_A[21:1]

2. 因为NorFlash可以是x8模式也可以是x16模式,这里使用了x16模式,因此Flash_A的最地位就不需要了,它此时用作了DQ[15]

3. EMC Core Datasheet的第18页上面的连接表格显示,我们连接Address总线时,应该把EMC的MEM_A(HAW-MAW-AS:HAW-AS-1) 连接到Flash的A(MAW-1 : 0)

4. Datasheet 第17页有对上面HAW MAW等数字的说明


引用
BN = bank number 我们的设计中只有一个bank
DN = device number within a bank. 我们一共只使用了一片Flash,所以 DN = 1
MW = Memory Subsystem Width。因为我们只用了一片Flash并没有拼宽度,所以MW和DW一样都是16
DW = Data Width。 Flash数据宽度16
MAW = Memory Address Width. Flash使用21位地址线
AU = Address Unit. 给一个地址得到的数据就是16位
AS = Address Shift = log2((MW*AU/DW)/8) = log2(16*16/16/8)= 1
HAW = IP Address Width = 32


5. 根据以上数字,在第3点提到的地址线映射就应该是
MEM_A(HAW-MAW-AS:HAW-AS-1) = MEM_A((32 - 21 - 1):(32 - 1 - 1)) = MEM_A(20:30)
A(MAW-1 : 0) = A((21 - 1):0) = A(20:0)

Baidu
map