查找表 (LUT) 功能
xSPI 支持查找表功能,每个 command 有 6 bits 控制执行的操作类型,2 bits 定义输出 IO 为 1/ 2/ 4/ 8 线,8 bits 定义操作数。
查找表指令 (6 bits) | 定义 |
---|---|
CMD (0x1) | 指示为 SDR Command |
CMD_EX (0x2) | 指示为 SDR Command Extension |
ADDR (0x3) | 指示为 SDR Address |
WRITE (0x4) | 指示为 SDR 写操作 |
READ (0x5) | 指示为 SDR 读操作 |
CMD_DDR (0x11) | 指示为 DDR Command |
CMD_EX_DDR (0x12) | 指示为 DDR Command Extension |
ADDR_DDR (0x13) | 指示为 DDR Address |
WRITE_DDR (0x14) | 指示为 DDR 写操作 |
READ_DDR (0x15) | 指示为 DDR 读操作 |
DUMMY (0x10) | 指示为 Dummy Cycles |
JUMP_ID (0x20) | 跳转 ID 号命令 (AXI 通道使用) |
JUMP_INS (0x30) | 跳转指令命令(同个 ID 内跳转指令,AXI 通道使用) |
STOP (0x0) | 结束命令 |
- 若为写访问,从 0 号 ID 开始执行
- 若为读访问,从 4 号 ID 开始执行
- 寄存器 LUTn (n=0~31),每个寄存器配置两个 commands,可存放 64 个 commands。一个完整的 xSPI 读写操作通常需要使用多个
commands 设置组成,因此四个 LUT 寄存器划为一组并赋予一个 ID 号,即 LUT[0~3] 的 ID 号为 0, LUT[4~7] 的 ID 号为
1,以此类推共有八个 ID 号,如下表所示。
表 2. 寄存器 LUTn(n=0~31) 分组及其 ID 映射表 LUTn(n=0~31) ID LUT[0~3] 0 LUT[4~7] 1 LUT[8~11] 2 LUT[12~15] 3 LUT[16~19] 4 LUT[20~23] 5 LUT[24~27] 6 LUT[28~31] 7 - AHB 通道读写操作由写入寄存器 xSPI_START 的 ID 触发。
- AXI 通道读写 Memory Mapping 即可触发,
Xccela LUT 配置
举例 Xccela 行为配置如下(xSPI_CTL[5:4] 配置为 Xccela 模式):
指令(6 bits) | IO 数(2 bits) | 操作数(8 bits) | 说明 |
---|---|---|---|
CMD_DDR | 0x3 | 0x2 | 八个 IO 输出 8 bits CMD,并且 CMD 为 0x2,DDR 模式。 注: 由于配置了 Xccela 模式,CMD 会占两个采样沿。
|
ADDR_DRR | 0x3 | 0x18 | 8 个 IO 输出 ADDR,并且 ADDR 为 24 bits,DDR 模式。
|
DUMMY | 0x0 | 0x4 | 等待四个 xSPI_CLK Cycles |
WRITE_DDR | 0x3 | 0x9 | 8 个 IO 输出 10-byte 数据,DDR 模式 |
STOP | 0x0 | 0x0 | 结束此写命令。 |
其中 ADDR/ ADDR_DDR 的操作数只支持配置为 0x18/ 0x20,即 24 位/ 32 位地址访问,其他配置会出现 Error 状态。READ/ READ_DDR/ WRITE/ WRITE_DDR 的操作数配置为 N,则实际数据长度为 N+1。
- Xccela 执行查找表,CMD 为 0x2,DDR 模式八个 IO 输出。ADDR
为 24 bits 寻址,DDR 模式八个 IO 输出。
- 如果为 AHB 通道访问,则 ADDR[23:0] 由 XSPI_ADDR 寄存器决定。
- 如果为 AXI 通道访问,则 ADDR[23:0] 由访问的 Memory Mapping 决定。
- 接着等待四个 DUMMY Cycles。
- 如果为 AHB 访问,则写 10 bytes DATA。
- 如果为 AXI 访问,则由 AXI 决定写数据长度。
- DDR 模式八个 IO 输出。
- 执行 STOP 命令结束传输。
Hyperbus LUT 配置
举例 Hyperbus 行为配置如下(xSPI_CTL[5:4] 配置为 Hyperbus 模式)
指令 (6 bits) | IO 数 (2 bits) | 操作数 (8 bits) | 说明 |
---|---|---|---|
CMD_DDR | 0x3 | 0x40 | 8 个 IO 输出 8-bits CMD 以及 CMD_EX,DDR 模式。 注: 由于配置了 Hyperbus 模式:
|
CMD_EX_DDR | 0x3 | 0x03 | 见上描述 |
ADDR_DDR | 0x3 | 0x20 | 8 个 IO 输出 ADDR,并且 ADDR 为 32 bits,DDR 模式,如果配置为 24 bits 模式,则高 8 位自动补 0。 |
DUMMY | 0x0 | 0x3 | 等待 3 或者 6 个 xSPI_CLK Cycles,注意由于配置了 Hyperbus 模式,在 CA 期间检测的 RWDS 电平决定此处为 3 或者 6 个 cycles。 |
READ_DDR | 0x3 | 0xff | 8 个 IO 输入 256 bytes 数据,DDR 模式 |
STOP | 0x0 | 0x0 | 结束此写命令。 |
其中 ADDR/ ADDR_DDR 的操作数只支持配置为 0x18/ 0x20,即 24 位/ 32 位地址访问,其他配置会出现 Error 状态。READ/ READ_DDR/ WRITE/ WRITE_DDR 的操作数配置为 N,则实际数据长度为 N+1。
- 执行 Hyperbus 执行查找表,CMD 为配置为 0x40,DDR 模式 8 个
IO 输出,为图示 CA0。
- 若为 AHB 访问,则 CA0 的值即为 0x40。
- 若为 AXI 访问,则 CA0 的值只保留 bit[6],此位代表寄存器或者内存访问信息,由用户决定。
- CA0 的 bit[7] 与 bit[5] 代表的读写信息,Burst Type 信息则由 AXI 决定,即此时 0x40 有可能会被 AXI 改写。
- CMD_EX 为配置为 0x03,DDR 模式 8 个 IO 输出,为图示 CA1
- 若为 AHB 访问,则 CA1 的值即为 0x03。
- 若为 AXI 访问,则由 AXI 访问的映射地址改写。
- ADDR 为 32 bits 寻址,DDR 模式 8 个 IO 输出。
- 如果为 AHB 通道访问,CA2/ CA3/ CA4/ CA5 由 xSPI_ADDR 寄存器决定。
- 如果为 AXI 通道访问,CA2/ CA3/ CA4/ CA5 由 AXI 访问的 Memory Mapping 决定。
- 接着等待 3 个或 6 个 DUMMY Cycles,查找表配置为 3 个,图示 CA 期间 RWDS 电平检测为高,因此等待 2
x
3 个 DUMMY Cycles。
- 如果为 AHB 通道访问,则接着读 256 bytes DATA。
- 如果为 AXI 通道访问,则由 AXI 决定读数据长度,DDR 模式 8 个 IO 输入。
- 最后执行 STOP 命令结束传输。
Hyperbus CA 的特殊性,若为 AXI 通道读写行为,则读写以及 Burst 类型信息由 AXI 决定,地址由 Memory Mapping 映射决定,此时 LUT 中配置的 CMD 以及 CMD_EX 只需要配置内存或者寄存器访问信息(bit46)。若为 AHB 通道读写,在 Hyperbus CA 的 bit[47:32] 由 CMD 以及 CMD_EX 决定,bit[31:0] 由寄存器 xSPI_ADDR 决定。
OPI LUT 配置
举例 OPI 行为配置如下(xSPI_CTL[5:4] 配置为 OPI 模式)
指令 (6 bits) | IO 数 (2 bits) | 操作数(8 bits) | 说明 |
---|---|---|---|
CMD_DDR | 0x3 | 0x2 | 8 个 IO 输出 8 bits CMD,并且 CMD 为 0x2,DDR 模式。注意此时由于配置了 OPI 模式,若为 AXI 通道访问,读写信息 CMD bit[7]、Burst 类型信息 CMD bit[5] 以及地址信息由 AXI 决定,此处只保留 CMD bit[6] 的访问空间(memory or register access)信息。若为 AHB 通道访问,则此处 0x2 即为 CMD |
ADDR_DDR | 0x3 | 0x18 | 8 个 IO 输出 ADDR,并且 ADDR 为 24 bits,DDR 模式。若是 AXI 通道访问,则此地址由 AXI 访问 Memory Mapping 映射生成。若是 AHB 通道访问,则由用户配置 xSPI_ADDR 生成 |
DUMMY | 0x0 | 0x4 | 等待 4 个 xSPI_CLK Cycles |
WRITE_DDR | 0x3 | 0x9 | 8 个 IO 输出 10 bytes 数据,DDR 模式 |
STOP | 0x0 | 0x0 | 结束此写命令 |
其中 ADDR/ ADDR_DDR 的操作数只支持配置为 0x18/ 0x20,即 24 位/ 32 位地址访问,其他配置会出现 Error 状态。READ/ READ_DDR/ WRITE/ WRITE_DDR 的操作数配置为 N,则实际数据长度为 N+1。
- 执行 OPI 执行查找表图示,CMD 为 0x2,DDR 模式 8 个 IO 输出。
- ADDR 为 24 bits 寻址,DDR 模式 8 个 IO 输出。
- 如果为 AHB 通道访问,ADDR[23:0] 由 xSPI_ADDR 寄存器决定。
- 如果为 AXI 通道访问,ADDR[23:0] 由访问的 Memory Mapping 决定。
- 接着 4 个 DUMMY Cycles.
- 如果为 AHB 访问则写 10 bytes DATA。
- 如果为 AXI 访问则由 AXI 决定写数据长度。
- DDR 模式 8 个 IO 输出。
- 最后 STOP 命令结束传输。
SPI LUT 配置
举例 SPI 配置(AHB 模式)如下(xSPI_CTL[5:4]配置为 SPI 模式)
指令(6 bits) | IO 数(2 bits) | 操作数(8 bits) | 说明 |
---|---|---|---|
CMD | 0x0 | 0xa0 | 1 个 IO 输出 8 bits CMD,SDR 模式。CMD 为 0xa0 |
ADDR | 0x0 | 0x20 | 1 个 IO 输出 ADDR,并且 ADDR 为 32 bits,SDR 模式 |
DUMMY | 0x0 | 0x5 | 等待 5 个 xSPI_CLK Cycles |
READ | 0x2 | 0xff | 4 个 IO 输入 256 bytes 数据,SDR 模式 |
STOP | 0x0 | 0x0 | 结束命令 |
其中 ADDR/ ADDR_DDR 的操作数只支持配置为 0x18/ 0x20,即 24 位/ 32 位地址访问,其他配置会出现 Error 状态。READ/ READ_DDR/ WRITE/ WRITE_DDR 的操作数配置为 N,则实际数据长度为 N+1。READ/ READ_DDR/ WRITE/ WRITE_DDR 的 IO 数配置为 0,则为单线 SPI 模式,此时输入为 D[1]。
- 执行 AHB 通道 SPI 执行查找表,CMD 为 0xa0,SDR 模式 1 个 IO 输出。
- ADDR 为 32 bits 寻址,SDR 模式 1 个 IO 输出,ADDR[31:0] 由 xSPI_ADDR 寄存器决定。
- 接着 5 个 DUMMY Cycles。
- 接着读 256 bytes DATA, SDR 模式 8 个 IO 输入。
- 最后 STOP 命令结束传输。
举例 SPI 配置(AXI 模式)如下(xSPI_CTL[5:4] 配置为 SPI 模式)
指令(6 bits) | IO 数(2 bits) | 操作数(8 bits) | 说明 |
---|---|---|---|
CMD | 0x0 | 0x77 | 一个 IO 输出 8 bits CMD,SDR 模式。CMD 为 0x77 |
DUMMY | 0x0 | 0x6 | 等待六个 xSPI_CLK Cycles |
WRITE | 0x2 | 0x1 | 写一个 byte,AXI Burst Type 自动触发,xSPI Burst Type 预先配置值,默认 Linear 为 0x10,Wrapped 为 0x40 |
JUMP_ID | 0x0 | 0x4 | 跳转 4 号 ID 执行 Burst 读操作 |
CMD | 0x0 | 0xa0 | 一个 IO 输出 8 bits CMD,SDR 模式。CMD 为 0xa0 |
ADDR | 0x0 | 0x20 | 一个 IO 输出 ADDR,并且 ADDR 为 32 bits,SDR 模式 |
DUMMY | 0x0 | 0x5 | 等待五个 xSPI_CLK Cycles |
READ | 0x2 | 0xff | 四个 IO 输入 256 bytes 数据,SDR 模式 |
STOP | 0x0 | 0x0 | 结束命令 |
其中 ADDR/ ADDR_DDR 的操作数只支持配置为 0x18/ 0x20,即 24 位/ 32 位地址访问,其他配置会出现 Error 状态。READ/ READ_DDR/ WRITE/ WRITE_DDR 的操作数配置为 N,则实际数据长度为 N+1。READ/ READ_DDR/ WRITE/ WRITE_DDR 的 IO 数配置为 0,则为单线 SPI 模式,此时输入为 D[1]。
- 执行 AXI 通道 SPI 执行查找表,如果为 AXI 访问,则执行一个 CMD 0x77,SDR 模式 1 个 IO 输出。
- 接着 6 个 Cycles,3 个 bytes 时间。
- 接着写 1 个 byte,SDR 模式 4 个 IO 输出。
- 如果 Burst Type 为 Linear,则这个 byte 为 0x10(可在 xSPI_RTR 寄存器配置)。
- 如果 Burst Type 为 Wrapped,则这个 byte 为 0x40(可在 xSPI_RTR 寄存器配置配置)。
- 接着跳转到 4 号 ID 开始执行 CMD 0xa0,SDR 模式 1 个 IO 输出。
- ADDR 为 32 bits 寻址,SDR 模式 1 个 IO 输出,ADDR[31:0] 由访问的 Memory Mapping 决定。
- 接着 5 个 DUMMY Cycles。
- 接着由 AXI 决定读数据长度, SDR 模式 8 个 IO 输入。
- 最后 STOP 命令结束传输。