Edit online

查找表 (LUT) 功能

3 Sep 2024
Read time: 12 minute(s)

xSPI 支持查找表功能,每个 command 有 6 bits 控制执行的操作类型,2 bits 定义输出 IO 为 1/ 2/ 4/ 8 线,8 bits 定义操作数。

1. 指令
查找表指令 (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) 结束命令
以下为 ID 生成和触发规则:
注: 为了供访问外部不同 device 使用,比如 Flash 与 PSRAM,在 AXI 访问中:
  • 若为写访问,从 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 即可触发,
关于各类协议的 LUT 配置可查看下列对应的章节:

Xccela LUT 配置

举例 Xccela 行为配置如下(xSPI_CTL[5:4] 配置为 Xccela 模式):

3. Xccela 行为配置
指令(6 bits) IO 数(2 bits) 操作数(8 bits) 说明
CMD_DDR 0x3 0x2 八个 IO 输出 8 bits CMD,并且 CMD 为 0x2,DDR 模式。
注: 由于配置了 Xccela 模式,CMD 会占两个采样沿。
  • 若为 AXI 通道访问,读写信息 CMD bit[7]、Burst 类型信息 CMD bit[5] 以及地址信息由 AXI 决定,此处只保留 CMD bit[6] 的访问空间(内存/ 寄存器)信息。
  • 若为 AHB 通道访问,则此处 0x2 即为 CMD。
ADDR_DRR 0x3 0x18 8 个 IO 输出 ADDR,并且 ADDR 为 24 bits,DDR 模式。
  • 若是 AXI 通道访问,则此地址由 AXI 访问 Memory Mapping 映射生成。
  • 若是 AHB 通道访问,则由用户配置 xSPI_ADDR 生成。
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。

  1. Xccela 执行查找表,CMD 为 0x2,DDR 模式八个 IO 输出。ADDR 为 24 bits 寻址,DDR 模式八个 IO 输出。
    • 如果为 AHB 通道访问,则 ADDR[23:0] 由 XSPI_ADDR 寄存器决定。
    • 如果为 AXI 通道访问,则 ADDR[23:0] 由访问的 Memory Mapping 决定。
  2. 接着等待四个 DUMMY Cycles。
    • 如果为 AHB 访问,则写 10 bytes DATA。
    • 如果为 AXI 访问,则由 AXI 决定写数据长度。
  3. DDR 模式八个 IO 输出。
  4. 执行 STOP 命令结束传输。

xwrite_example

1. Xccela 执行查找表

Hyperbus LUT 配置

举例 Hyperbus 行为配置如下(xSPI_CTL[5:4] 配置为 Hyperbus 模式)

4. Hyperbus 行为配置
指令 (6 bits) IO 数 (2 bits) 操作数 (8 bits) 说明
CMD_DDR 0x3 0x40 8 个 IO 输出 8-bits CMD 以及 CMD_EX,DDR 模式。
注: 由于配置了 Hyperbus 模式:
  • 若为 AXI 通道访问,读写信息、Burst 类型信息以及地址信息由 AXI 决定,此处只保留 CA bit[46] 的访问空间(内存/寄存器)信息。
  • 若为 AHB 通道访问,则此处 0x4003 即为 CA bit[47:32]
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。

  1. 执行 Hyperbus 执行查找表,CMD 为配置为 0x40,DDR 模式 8 个 IO 输出,为图示 CA0。
    • 若为 AHB 访问,则 CA0 的值即为 0x40。
    • 若为 AXI 访问,则 CA0 的值只保留 bit[6],此位代表寄存器或者内存访问信息,由用户决定。
  2. CA0 的 bit[7] 与 bit[5] 代表的读写信息,Burst Type 信息则由 AXI 决定,即此时 0x40 有可能会被 AXI 改写。
  3. CMD_EX 为配置为 0x03,DDR 模式 8 个 IO 输出,为图示 CA1
    • 若为 AHB 访问,则 CA1 的值即为 0x03。
    • 若为 AXI 访问,则由 AXI 访问的映射地址改写。
  4. ADDR 为 32 bits 寻址,DDR 模式 8 个 IO 输出。
    • 如果为 AHB 通道访问,CA2/ CA3/ CA4/ CA5 由 xSPI_ADDR 寄存器决定。
    • 如果为 AXI 通道访问,CA2/ CA3/ CA4/ CA5 由 AXI 访问的 Memory Mapping 决定。
  5. 接着等待 3 个或 6 个 DUMMY Cycles,查找表配置为 3 个,图示 CA 期间 RWDS 电平检测为高,因此等待 2x3 个 DUMMY Cycles。
    • 如果为 AHB 通道访问,则接着读 256 bytes DATA。
    • 如果为 AXI 通道访问,则由 AXI 决定读数据长度,DDR 模式 8 个 IO 输入。
  6. 最后执行 STOP 命令结束传输。

hread_example

2. Hyperbus 执行查找表
注:

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 模式)

5. 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。

  1. 执行 OPI 执行查找表图示,CMD 为 0x2,DDR 模式 8 个 IO 输出。
  2. ADDR 为 24 bits 寻址,DDR 模式 8 个 IO 输出。
    • 如果为 AHB 通道访问,ADDR[23:0] 由 xSPI_ADDR 寄存器决定。
    • 如果为 AXI 通道访问,ADDR[23:0] 由访问的 Memory Mapping 决定。
  3. 接着 4 个 DUMMY Cycles.
    • 如果为 AHB 访问则写 10 bytes DATA。
    • 如果为 AXI 访问则由 AXI 决定写数据长度。
  4. DDR 模式 8 个 IO 输出。
  5. 最后 STOP 命令结束传输。

owrite_example

3. OPI 执行查找表图示

SPI LUT 配置

举例 SPI 配置(AHB 模式)如下(xSPI_CTL[5:4]配置为 SPI 模式)

6. SPI AHB 行为配置
指令(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]。

  1. 执行 AHB 通道 SPI 执行查找表,CMD 为 0xa0,SDR 模式 1 个 IO 输出。
  2. ADDR 为 32 bits 寻址,SDR 模式 1 个 IO 输出,ADDR[31:0] 由 xSPI_ADDR 寄存器决定。
  3. 接着 5 个 DUMMY Cycles。
  4. 接着读 256 bytes DATA, SDR 模式 8 个 IO 输入。
  5. 最后 STOP 命令结束传输。

QSPI_example_ahb

4. AHB 通道 SPI 执行查找表

举例 SPI 配置(AXI 模式)如下(xSPI_CTL[5:4] 配置为 SPI 模式)

7. SPI AXI 行为配置
指令(6 bits) IO 数(2 bits) 操作数(8 bits) 说明
CMD 0x0 0x77 一个 IO 输出 8 bits CMD,SDR 模式。CMD 为 0xa0
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]。

  1. 执行 AXI 通道 SPI 执行查找表,如果为 AXI 访问,则执行一个 CMD 0x77,SDR 模式 1 个 IO 输出。
  2. 接着 6 个 Cycles,3 个 bytes 时间。
  3. 接着写 1 个 byte,SDR 模式 4 个 IO 输出。
    • 如果 Burst Type 为 Linear,则这个 byte 为 0x10(可在 xSPI_RTR 寄存器配置)。
    • 如果 Burst Type 为 Wrapped,则这个 byte 为 0x40(可在 xSPI_RTR 寄存器配置配置)。
  4. 接着跳转到 4 号 ID 开始执行 CMD 0xa0,SDR 模式 1 个 IO 输出。
  5. ADDR 为 32 bits 寻址,SDR 模式 1 个 IO 输出,ADDR[31:0] 由访问的 Memory Mapping 决定。
  6. 接着 5 个 DUMMY Cycles。
  7. 接着由 AXI 决定读数据长度, SDR 模式 8 个 IO 输入。
  8. 最后 STOP 命令结束传输。

QSPI_example_axi

5. AXI 通道 SPI 执行查找表