总线宽度配置
ASIZE
字段用于确定异步接口的数据总线宽度,这直接影响到EMIFA(Enhanced Multi-Function Integrated Flash Controller)如何与外部异步设备进行通信。具体来说:
ASIZE字段的设置
- ASIZE = 0:选择8位数据总线。
- ASIZE = 1:选择16位数据总线。
//-----------------------------------------------------------------------------
// Register Structure & Defines
//-----------------------------------------------------------------------------
typedef struct
{
volatile uint32_t REVID; // 0x0000
volatile uint32_t AWCC; // 0x0004
volatile uint32_t SDCR; // 0x0008
volatile uint32_t SDRCR; // 0x000C
volatile uint32_t CE2CFG; // 0x0010
volatile uint32_t CE3CFG; // 0x0014
volatile uint32_t CE4CFG; // 0x0018
volatile uint32_t CE5CFG; // 0x001C
volatile uint32_t SDTIMR; // 0x0020
volatile uint32_t RSVD0[6]; // 0x0024
volatile uint32_t SDSRETR; // 0x003C
volatile uint32_t INTRAW; // 0x0040
volatile uint32_t INTMASK; // 0x0044
volatile uint32_t INTMASKSET; // 0x0048
volatile uint32_t INTMASKCLR; // 0x004C
volatile uint32_t RSVD1[4]; // 0x0050
volatile uint32_t NANDFCR; // 0x0060
volatile uint32_t NANDFSR; // 0x0064
volatile uint32_t PMCR; // 0x0068
volatile uint32_t NANDF1ECC; // 0x0070
volatile uint32_t NANDF2ECC; // 0x0074
volatile uint32_t NANDF3ECC; // 0x0078
volatile uint32_t NANDF4ECC; // 0x007C
volatile uint32_t RSVD2[15]; // 0x0080
volatile uint32_t NAND4BITECCLOAD; // 0x00BC
volatile uint32_t NAND4BITECC1; // 0x00C0
volatile uint32_t NAND4BITECC2; // 0x00C4
volatile uint32_t NAND4BITECC3; // 0x00C8
volatile uint32_t NAND4BITECC4; // 0x00CC
volatile uint32_t NANDERRADDR1; // 0x00D0
volatile uint32_t NANDERRADDR2; // 0x00D4
volatile uint32_t NANDERRVAL1; // 0x00D8
volatile uint32_t NANDERRVAL2; // 0x00DC
} emifa_regs_t;
#define EMIFA ((emifa_regs_t *)EMIFA_REG_BASE)
对EMA_A和EMA_BA引脚功能的影响
根据ASIZE
的配置,EMA_A和EMA_BA引脚的功能会有所不同:
-
8位数据总线(ASIZE = 0):
- EMA_BA[0]:提供字节地址的最低有效位(LSB),用于区分每个字节的位置。
- EM_A[0]:参与整体地址的构成,但不再是最低有效位。
-
16位数据总线(ASIZE = 1):
- EMA_BA[1]:提供半字地址的最低有效位,用于区分每个16位半字的位置。
- EMA_BA[0]:可以作为上层地址线
EM_A[22]
使用,以扩展地址空间。 - EM_A[0]:同样参与整体地址的构成,但具体作用取决于总线宽度和配置。
地址映射
- 地址映射关系(https://www.ti.com/lit/ug/sprugz3a/sprugz3a.pdf):FPGA地址 —A23放到最低位置—> —左移一位—> DSP地址 (忽略第0位的不同)
- 0x 7 4 0 0 1 0 0 3 DSP地址
0111' 0100 ' 0000 ' 0000 ' 0001 ' 0000 ' 0000 ' 0011
- 8 0 0 4 0 0 FPGA地址
1000' 0000 ' 0000 ' 0100 ' 0000 ' 0000
0000' 0000 ' 0000 ' 1000 ' 0000 ' 0001 <= 000' 0000 ' 0000 ' 0100 ' 0000 ' 00001 A23放到最低位置
0000' 0000 ' 0001 ' 0000 ' 0000 ' 0010 <= 000' 0000 ' 0000 ' 1000 ' 0000 ' 00010 左移一位
- 所以EMIFA向FPGA(作为异步存储器)写入数据示例中的地址应为:
- 0x 6 4 4 0 0 0 0 0
- 0110' 0100' 0100' 0000' 0000' 0000' 0000' 0000
- 0100' 0000' 0000' 0000' 0000' 0000
00100' 0000' 0000' 0000' 0000' 000 右移一位
- 000100' 0000' 0000' 0000' 0000' 00 A23放到最高位置