基于XILINX IP-AXI Memory Mapped to PCIe Gen2一、使用S_AXI_CTL总线进行配置S_AXI_CTL总线主要用于配置PCIE的配置CFG空间寄存器。1、读取RC端FPGA的PCIE配置空间RC设备使用TYPE1类型配置空间先进行读操作可以验证S_AXI_CTL总线通信是否正常使用S_AXI_CTL总线读取0x0, 0x4, 0x8地址读取数据如下供应商ID设备ID值0x712410EE命令状态寄存器值为0x00100000ClassCode ID版本ID值为0x060400002、配置RC端FPGA的PCIE配置空间①配置命令CMD寄存器(0x04)开启BUSM_EN 、MEM_EN、IO_EN、PARITY、SERR_EN.②配置设备枚举范围寄存器0x18将寄存器配置为0x00070100代表RC 主总线 Bus0 直接下游总线起点 Bus1 系统最多支持 7 级总线Bus1~Bus73、读取EP端NVME SSD的PCIE配置空间当 AXI 映射 PCIe 核配置为Root Port(RC)时通过ECAM 增强配置访问机制生成配置事务该功能仅 RC 模式可用。对一段特定内存窗口ECAM 窗口的 AXI 读写会自动转换成 PCIe 标准配置读 / 写 TLP。访问Primary Bus默认 Bus0生成 Type 1 桥配置头事务访问 FPGA 内置 RC 本地配置空间访问Secondary Bus次总线如 Bus1生成 Type 0 EP 配置事务用于 NVMe 等终端设备访问区间 Secondary Bus Bus ≤ Subordinate Bus多级桥下游总线生成 Type1 桥配置事务软件枚举阶段必须将主 / 次 / 从属总线号写入 RC 内置 Type1 配置头偏移 0x18 寄存器。ECAM的基地址为ECAM_OFFSETBus20 ∣ Dev 15 ∣ Func12。只有一块NVME SSD时默认Bus1Dev0Func0。基地址ECAM_OFFSET0x100000。NVME SSD配置空间使用type0类型读取0x1000000x1000040x100008地址查看ID等信息供应商ID设备ID值0x10011BC0命令状态寄存器值为0x00100000ClassCode ID版本ID值为0x010802014、配置EP端NVME SSD的PCIE配置空间①配置命令CMD寄存器(0x100004)开启BUSM_EN 、MEM_EN。②配置BAR空间地址寄存器0x100010、0x1000140x100010写入低32位地址0x80000004对应IP核中配置地址0x100014写入高32位地址0x000000005、配置IP核寄存器配置根端口状态 / 控制寄存器寄存器偏移地址0x148开启Bridge Enable 桥使能。Bridge Enable该位置 1 时AXI BAR 空间的读写流量可以转发到 PCIe 总线。软件完成 PCIe 枚举流程后必须向该位写 1 开启桥转发读取0x148寄存器值后BIT0置1后再写入。二、使用S_AXI总线进行配置S_AXI总线主要用于配置NVME SSD内部寄存器。NVME SSD内部寄存器位于BAR空间中完成地址映射后就可以进行访问了。1、读取寄存器获取CAP,VS,CC寄存器数据对应地址分别为0x80000000CAP低32位0x80000004CAP高32位0x800000080x80000014。acpl is FF0100FFacph is 00000020VS is 00010300CC is 000000002、配置寄存器初始化①等待CSTS寄存器0x8000001Cready位为0②配置CC寄存器0x80000014为0x00460000 配置Admin提交队列单条大小为64byte, Admin完成队列单条大小为16byte。③配置AQA寄存器0x80000024为0x00100010配置Admin提交、完成队列深度为16。④配置ASQ寄存器0x80000028、0x8000002C分别为0x101000000x00000000配置Admin提交队列基地址高32位为0低32位为0x10100000。⑤配置ACQ寄存器0x80000030、0x80000034分别为0x101010000x00000000配置Admin完成队列基地址高32位为0低32位为0x10101000。⑥配置CC寄存器设置EN地址0x80000014写0x00460001⑦等待CSTS寄存器0x8000001Cready位为13、提交和完成队列流程Admin和IO通用流程如下提交队列①指令写入内部DDR提交队列地址中这一步不会向NVME SSD发送数据只将指令存入指定内部空间等待NVME读取②发起提交门铃向提交门铃寄存器Admin为0x80001000写提交队列尾指针。完成队列①判断是否接收到完成命令根据P位相位翻转判断是否接受到新的完成指令。状态Status不为0表示出错。②发起完成门铃向完成门铃寄存器Admin为0x80001004写完成队列头指针。4、读取Identify中Controller信息Identify信息共4094字节。主要读取NVME SSD硬盘的ID、MDTS信息等①定义Identify存放地址如#define IDENTIFY_CTRL_BASE 0x10200000②提交队列信息sqe.cdw0 0x06;sqe.nsid 0;sqe.dptr[0] 0x10200000; //数据缓冲区地址sqe.dptr[1] 0;sqe.cdw10 1;将指令写入Admin提交队列中发起提交门铃向提交门铃寄存器Admin为0x80001000写提交队列尾指针。③等待完成队列向完成门铃寄存器Admin为0x80001004写完成队列头指针。获取MDTS计算出单次最大传输数据大小。控制器最小页 CAP.MPSMIN 4KB (4096B)5、设置IO队列数量设置IO队列数量使用设置特征命令DW11如上实际写入值为队列数量-1创建2个队列是NCQR和NSQR都为1①提交队列信息sqe.cdw0 0x09;sqe.cdw10 0x07sqe.cdw11 0x00010001;将指令写入Admin提交队列中发起提交门铃向提交门铃寄存器Admin为0x80001000写提交队列尾指针。③等待完成队列向完成门铃寄存器Admin为0x80001004写完成队列头指针。6、创建IO队列①定义IO队列基地址如#define IO_WR_SQ_BASE 0x10102000#define IO_WR_CQ_BASE 0x10103000#define IO_RD_SQ_BASE 0x10104000#define IO_RD_CQ_BASE 0x10105000②创建写完成队列sqe.cdw0 0x03000005;sqe.nsid 0;sqe.rsvd1 0;sqe.mptr 0;sqe.dptr[0] 0x10103000; // PRP1CQ物理基地址sqe.dptr[1] 0;sqe.cdw10 0x00070001;sqe.cdw11 0x00000001;sqe.cdw12 0;sqe.cdw13 0;sqe.cdw14 0;sqe.cdw15 0;将指令写入Admin提交队列中发起提交门铃向提交门铃寄存器Admin为0x80001000写提交队列尾指针。等待完成队列,判断是否创建成功。向完成门铃寄存器Admin为0x80001004写完成队列头指针。③创建读完成队列sqe.cdw0 0x03010005;sqe.nsid 0;sqe.rsvd1 0;sqe.mptr 0;sqe.dptr[0] 0x10105000; // PRP1CQ物理基地址sqe.dptr[1] 0;sqe.cdw10 0x00070002;sqe.cdw11 0x00000001;sqe.cdw12 0;sqe.cdw13 0;sqe.cdw14 0;sqe.cdw15 0;将指令写入Admin提交队列中发起提交门铃向提交门铃寄存器Admin为0x80001000写提交队列尾指针。等待完成队列,判断是否创建成功。向完成门铃寄存器Admin为0x80001004写完成队列头指针。④创建写提交队列sqe.cdw0 0x03020001;sqe.nsid 0;sqe.rsvd1 0;sqe.mptr 0;sqe.dptr[0] 0x10102000; // PRP1CQ物理基地址sqe.dptr[1] 0;sqe.cdw10 0x00070001;sqe.cdw11 0x00010001;sqe.cdw12 0;sqe.cdw13 0;sqe.cdw14 0;sqe.cdw15 0;将指令写入Admin提交队列中发起提交门铃向提交门铃寄存器Admin为0x80001000写提交队列尾指针。等待完成队列,判断是否创建成功。向完成门铃寄存器Admin为0x80001004写完成队列头指针。⑤创建读提交队列sqe.cdw0 0x03030001;sqe.nsid 0;sqe.rsvd1 0;sqe.mptr 0;sqe.dptr[0] 0x10104000; // PRP1CQ物理基地址sqe.dptr[1] 0;sqe.cdw10 0x00070002;sqe.cdw11 0x00020001;sqe.cdw12 0;sqe.cdw13 0;sqe.cdw14 0;sqe.cdw15 0;将指令写入Admin提交队列中发起提交门铃向提交门铃寄存器Admin为0x80001000写提交队列尾指针。等待完成队列,判断是否创建成功。向完成门铃寄存器Admin为0x80001004写完成队列头指针。7、写数据到NVME SSD①定义写数据基地址及链表地址#define WRITE_DATA_BUF 0x20000000#define PRP_LIST_BUF 0x10400000UL链表结构单条数据长度64B.typedef struct {u64 prp_entry[256];} PrpList;②提交队列信息单个LBA大小为512B. Nlb为写入LBA的个数SLBA为第一逻辑块地址// DW0: CID Write操作码sqe.cdw0 (((u32)cid) 16) | 0x01;sqe.nsid nsid;sqe.rsvd1 0;sqe.mptr 0;// DW10/DW1164位起始LBAsqe.cdw10 (u32)lba;sqe.cdw11 (u32)(lba 32);// DW12NLB nlb- 1 (NVMe标准)sqe.cdw12 (nlb - 1) 0xFFFF;sqe.cdw13 0;sqe.cdw14 0;sqe.cdw15 0;// dptr表示访问的内存空间地址向nvme中写数据只用提交队列告诉NVME数据存放在哪个地址nvme自行进行dma取数据sqe.dptr[0] cur_addr; //这里为0x20000000//仅1页4KBPRP2置0sqe-dptr[1] 0;//多页情况//剩余页数填充PRP链表sqe-dptr[1] PRP_LIST_BUF; // PRP2指向PRP列表首地址这里为0x10400000//在链表中填入需要写入的页地址while(remain 0)//剩余需要写入的数据大于0{prp_list-prp_entry[entry_idx] cur_addr;//实际地址填入链表0x20000000地址基础上进行4K累加后的地址cur_addr 4096; //地址按4K累加if(remain 4096)remain - 4096;elseremain 0;entry_idx;}// PRP链表最后一项填0标记结束prp_list-prp_entry[entry_idx] 0;将指令写入IO WR提交队列中发起提交门铃向提交门铃寄存器IO WR为0x80001008写提交队列尾指针。③等待完成队列返回的status为0表示写入成功。向完成门铃寄存器IO WR为0x8000100C写完成队列头指针。7、从NVME SSD读取数据①定义写数据基地址及链表地址#define READ_DATA_BUF 0x28000000#define PRP_LIST_BUF 0x10400000UL链表结构单条数据长度64B.typedef struct {u64 prp_entry[256];} PrpList;②提交队列信息// DW0: CID Read 操作码sqe.cdw0 (((u32)cid) 16) | 0x02;sqe.nsid nsid;sqe.rsvd1 0;sqe.mptr 0;// DW10/DW1164位起始LBAsqe.cdw10 (u32)lba;sqe.cdw11 (u32)(lba 32);// DW12NLB nlb- 1sqe.cdw12 (nlb - 1) 0xFFFF;sqe.cdw13 0;sqe.cdw14 0;sqe.cdw15 0;// dptr表示访问的内存空间地址向nvme中写数据只用提交队列告诉NVME数据存放在哪个地址nvme自行进行dma取数据sqe.dptr[0] cur_addr; //这里为0x28000000// 仅1页4KBPRP2置0sqe-dptr[1] 0;//多页情况// 剩余页数填充PRP链表sqe-dptr[1] PRP_LIST_BUF; // PRP2指向PRP列表首地址这里为0x10400000//在链表中填入需要写入的页地址while(remain 0)//剩余需要写入的数据大于0{prp_list-prp_entry[entry_idx] cur_addr;//实际地址填入链表0x28000000地址基础上进行4K累加后的地址cur_addr 4096; //地址按4K累加if(remain 4096)remain - 4096;elseremain 0;entry_idx;}// PRP链表最后一项填0标记结束prp_list-prp_entry[entry_idx] 0;将指令写入IO RD提交队列中发起提交门铃向提交门铃寄存器IO RD为0x80001010写提交队列尾指针。③等待完成队列返回的status为0表示写入成功。向完成门铃寄存器IO RD为0x80001014写完成队列头指针。三、M_AXI总线配置M_AXI总线由EP端NVME SSD发起主要用于NVME SSD进行DMA读写。将M_AXI总线与ZYNQ或DDR连接读、写操作时NVME SSD会自动通过M_AXI总线访问内存。
FPGA控制NVME开发流程
发布时间:2026/7/10 7:54:48
基于XILINX IP-AXI Memory Mapped to PCIe Gen2一、使用S_AXI_CTL总线进行配置S_AXI_CTL总线主要用于配置PCIE的配置CFG空间寄存器。1、读取RC端FPGA的PCIE配置空间RC设备使用TYPE1类型配置空间先进行读操作可以验证S_AXI_CTL总线通信是否正常使用S_AXI_CTL总线读取0x0, 0x4, 0x8地址读取数据如下供应商ID设备ID值0x712410EE命令状态寄存器值为0x00100000ClassCode ID版本ID值为0x060400002、配置RC端FPGA的PCIE配置空间①配置命令CMD寄存器(0x04)开启BUSM_EN 、MEM_EN、IO_EN、PARITY、SERR_EN.②配置设备枚举范围寄存器0x18将寄存器配置为0x00070100代表RC 主总线 Bus0 直接下游总线起点 Bus1 系统最多支持 7 级总线Bus1~Bus73、读取EP端NVME SSD的PCIE配置空间当 AXI 映射 PCIe 核配置为Root Port(RC)时通过ECAM 增强配置访问机制生成配置事务该功能仅 RC 模式可用。对一段特定内存窗口ECAM 窗口的 AXI 读写会自动转换成 PCIe 标准配置读 / 写 TLP。访问Primary Bus默认 Bus0生成 Type 1 桥配置头事务访问 FPGA 内置 RC 本地配置空间访问Secondary Bus次总线如 Bus1生成 Type 0 EP 配置事务用于 NVMe 等终端设备访问区间 Secondary Bus Bus ≤ Subordinate Bus多级桥下游总线生成 Type1 桥配置事务软件枚举阶段必须将主 / 次 / 从属总线号写入 RC 内置 Type1 配置头偏移 0x18 寄存器。ECAM的基地址为ECAM_OFFSETBus20 ∣ Dev 15 ∣ Func12。只有一块NVME SSD时默认Bus1Dev0Func0。基地址ECAM_OFFSET0x100000。NVME SSD配置空间使用type0类型读取0x1000000x1000040x100008地址查看ID等信息供应商ID设备ID值0x10011BC0命令状态寄存器值为0x00100000ClassCode ID版本ID值为0x010802014、配置EP端NVME SSD的PCIE配置空间①配置命令CMD寄存器(0x100004)开启BUSM_EN 、MEM_EN。②配置BAR空间地址寄存器0x100010、0x1000140x100010写入低32位地址0x80000004对应IP核中配置地址0x100014写入高32位地址0x000000005、配置IP核寄存器配置根端口状态 / 控制寄存器寄存器偏移地址0x148开启Bridge Enable 桥使能。Bridge Enable该位置 1 时AXI BAR 空间的读写流量可以转发到 PCIe 总线。软件完成 PCIe 枚举流程后必须向该位写 1 开启桥转发读取0x148寄存器值后BIT0置1后再写入。二、使用S_AXI总线进行配置S_AXI总线主要用于配置NVME SSD内部寄存器。NVME SSD内部寄存器位于BAR空间中完成地址映射后就可以进行访问了。1、读取寄存器获取CAP,VS,CC寄存器数据对应地址分别为0x80000000CAP低32位0x80000004CAP高32位0x800000080x80000014。acpl is FF0100FFacph is 00000020VS is 00010300CC is 000000002、配置寄存器初始化①等待CSTS寄存器0x8000001Cready位为0②配置CC寄存器0x80000014为0x00460000 配置Admin提交队列单条大小为64byte, Admin完成队列单条大小为16byte。③配置AQA寄存器0x80000024为0x00100010配置Admin提交、完成队列深度为16。④配置ASQ寄存器0x80000028、0x8000002C分别为0x101000000x00000000配置Admin提交队列基地址高32位为0低32位为0x10100000。⑤配置ACQ寄存器0x80000030、0x80000034分别为0x101010000x00000000配置Admin完成队列基地址高32位为0低32位为0x10101000。⑥配置CC寄存器设置EN地址0x80000014写0x00460001⑦等待CSTS寄存器0x8000001Cready位为13、提交和完成队列流程Admin和IO通用流程如下提交队列①指令写入内部DDR提交队列地址中这一步不会向NVME SSD发送数据只将指令存入指定内部空间等待NVME读取②发起提交门铃向提交门铃寄存器Admin为0x80001000写提交队列尾指针。完成队列①判断是否接收到完成命令根据P位相位翻转判断是否接受到新的完成指令。状态Status不为0表示出错。②发起完成门铃向完成门铃寄存器Admin为0x80001004写完成队列头指针。4、读取Identify中Controller信息Identify信息共4094字节。主要读取NVME SSD硬盘的ID、MDTS信息等①定义Identify存放地址如#define IDENTIFY_CTRL_BASE 0x10200000②提交队列信息sqe.cdw0 0x06;sqe.nsid 0;sqe.dptr[0] 0x10200000; //数据缓冲区地址sqe.dptr[1] 0;sqe.cdw10 1;将指令写入Admin提交队列中发起提交门铃向提交门铃寄存器Admin为0x80001000写提交队列尾指针。③等待完成队列向完成门铃寄存器Admin为0x80001004写完成队列头指针。获取MDTS计算出单次最大传输数据大小。控制器最小页 CAP.MPSMIN 4KB (4096B)5、设置IO队列数量设置IO队列数量使用设置特征命令DW11如上实际写入值为队列数量-1创建2个队列是NCQR和NSQR都为1①提交队列信息sqe.cdw0 0x09;sqe.cdw10 0x07sqe.cdw11 0x00010001;将指令写入Admin提交队列中发起提交门铃向提交门铃寄存器Admin为0x80001000写提交队列尾指针。③等待完成队列向完成门铃寄存器Admin为0x80001004写完成队列头指针。6、创建IO队列①定义IO队列基地址如#define IO_WR_SQ_BASE 0x10102000#define IO_WR_CQ_BASE 0x10103000#define IO_RD_SQ_BASE 0x10104000#define IO_RD_CQ_BASE 0x10105000②创建写完成队列sqe.cdw0 0x03000005;sqe.nsid 0;sqe.rsvd1 0;sqe.mptr 0;sqe.dptr[0] 0x10103000; // PRP1CQ物理基地址sqe.dptr[1] 0;sqe.cdw10 0x00070001;sqe.cdw11 0x00000001;sqe.cdw12 0;sqe.cdw13 0;sqe.cdw14 0;sqe.cdw15 0;将指令写入Admin提交队列中发起提交门铃向提交门铃寄存器Admin为0x80001000写提交队列尾指针。等待完成队列,判断是否创建成功。向完成门铃寄存器Admin为0x80001004写完成队列头指针。③创建读完成队列sqe.cdw0 0x03010005;sqe.nsid 0;sqe.rsvd1 0;sqe.mptr 0;sqe.dptr[0] 0x10105000; // PRP1CQ物理基地址sqe.dptr[1] 0;sqe.cdw10 0x00070002;sqe.cdw11 0x00000001;sqe.cdw12 0;sqe.cdw13 0;sqe.cdw14 0;sqe.cdw15 0;将指令写入Admin提交队列中发起提交门铃向提交门铃寄存器Admin为0x80001000写提交队列尾指针。等待完成队列,判断是否创建成功。向完成门铃寄存器Admin为0x80001004写完成队列头指针。④创建写提交队列sqe.cdw0 0x03020001;sqe.nsid 0;sqe.rsvd1 0;sqe.mptr 0;sqe.dptr[0] 0x10102000; // PRP1CQ物理基地址sqe.dptr[1] 0;sqe.cdw10 0x00070001;sqe.cdw11 0x00010001;sqe.cdw12 0;sqe.cdw13 0;sqe.cdw14 0;sqe.cdw15 0;将指令写入Admin提交队列中发起提交门铃向提交门铃寄存器Admin为0x80001000写提交队列尾指针。等待完成队列,判断是否创建成功。向完成门铃寄存器Admin为0x80001004写完成队列头指针。⑤创建读提交队列sqe.cdw0 0x03030001;sqe.nsid 0;sqe.rsvd1 0;sqe.mptr 0;sqe.dptr[0] 0x10104000; // PRP1CQ物理基地址sqe.dptr[1] 0;sqe.cdw10 0x00070002;sqe.cdw11 0x00020001;sqe.cdw12 0;sqe.cdw13 0;sqe.cdw14 0;sqe.cdw15 0;将指令写入Admin提交队列中发起提交门铃向提交门铃寄存器Admin为0x80001000写提交队列尾指针。等待完成队列,判断是否创建成功。向完成门铃寄存器Admin为0x80001004写完成队列头指针。7、写数据到NVME SSD①定义写数据基地址及链表地址#define WRITE_DATA_BUF 0x20000000#define PRP_LIST_BUF 0x10400000UL链表结构单条数据长度64B.typedef struct {u64 prp_entry[256];} PrpList;②提交队列信息单个LBA大小为512B. Nlb为写入LBA的个数SLBA为第一逻辑块地址// DW0: CID Write操作码sqe.cdw0 (((u32)cid) 16) | 0x01;sqe.nsid nsid;sqe.rsvd1 0;sqe.mptr 0;// DW10/DW1164位起始LBAsqe.cdw10 (u32)lba;sqe.cdw11 (u32)(lba 32);// DW12NLB nlb- 1 (NVMe标准)sqe.cdw12 (nlb - 1) 0xFFFF;sqe.cdw13 0;sqe.cdw14 0;sqe.cdw15 0;// dptr表示访问的内存空间地址向nvme中写数据只用提交队列告诉NVME数据存放在哪个地址nvme自行进行dma取数据sqe.dptr[0] cur_addr; //这里为0x20000000//仅1页4KBPRP2置0sqe-dptr[1] 0;//多页情况//剩余页数填充PRP链表sqe-dptr[1] PRP_LIST_BUF; // PRP2指向PRP列表首地址这里为0x10400000//在链表中填入需要写入的页地址while(remain 0)//剩余需要写入的数据大于0{prp_list-prp_entry[entry_idx] cur_addr;//实际地址填入链表0x20000000地址基础上进行4K累加后的地址cur_addr 4096; //地址按4K累加if(remain 4096)remain - 4096;elseremain 0;entry_idx;}// PRP链表最后一项填0标记结束prp_list-prp_entry[entry_idx] 0;将指令写入IO WR提交队列中发起提交门铃向提交门铃寄存器IO WR为0x80001008写提交队列尾指针。③等待完成队列返回的status为0表示写入成功。向完成门铃寄存器IO WR为0x8000100C写完成队列头指针。7、从NVME SSD读取数据①定义写数据基地址及链表地址#define READ_DATA_BUF 0x28000000#define PRP_LIST_BUF 0x10400000UL链表结构单条数据长度64B.typedef struct {u64 prp_entry[256];} PrpList;②提交队列信息// DW0: CID Read 操作码sqe.cdw0 (((u32)cid) 16) | 0x02;sqe.nsid nsid;sqe.rsvd1 0;sqe.mptr 0;// DW10/DW1164位起始LBAsqe.cdw10 (u32)lba;sqe.cdw11 (u32)(lba 32);// DW12NLB nlb- 1sqe.cdw12 (nlb - 1) 0xFFFF;sqe.cdw13 0;sqe.cdw14 0;sqe.cdw15 0;// dptr表示访问的内存空间地址向nvme中写数据只用提交队列告诉NVME数据存放在哪个地址nvme自行进行dma取数据sqe.dptr[0] cur_addr; //这里为0x28000000// 仅1页4KBPRP2置0sqe-dptr[1] 0;//多页情况// 剩余页数填充PRP链表sqe-dptr[1] PRP_LIST_BUF; // PRP2指向PRP列表首地址这里为0x10400000//在链表中填入需要写入的页地址while(remain 0)//剩余需要写入的数据大于0{prp_list-prp_entry[entry_idx] cur_addr;//实际地址填入链表0x28000000地址基础上进行4K累加后的地址cur_addr 4096; //地址按4K累加if(remain 4096)remain - 4096;elseremain 0;entry_idx;}// PRP链表最后一项填0标记结束prp_list-prp_entry[entry_idx] 0;将指令写入IO RD提交队列中发起提交门铃向提交门铃寄存器IO RD为0x80001010写提交队列尾指针。③等待完成队列返回的status为0表示写入成功。向完成门铃寄存器IO RD为0x80001014写完成队列头指针。三、M_AXI总线配置M_AXI总线由EP端NVME SSD发起主要用于NVME SSD进行DMA读写。将M_AXI总线与ZYNQ或DDR连接读、写操作时NVME SSD会自动通过M_AXI总线访问内存。