三、实战篇-NVME SSD控制之FPGA实现(二)
本章节讲述如何使用FPGA纯verilog语言实现NVME SSD硬盘的读写控制。参考三、实战篇-NVME SSD控制之FPGA实现一-CSDN博客二、实战篇-NVME SSD控制之ZYNQ实现三-CSDN博客前面完成了FPGA和NVME SSD的PCIE CFG空间的配置。下面进行NVME SSD的寄存器配置NVME SSD内部寄存器位于BAR空间中。上一节通过S_AXI_CTL总线完成了PCIE配置空间的配置本节通过控制S_AXI总线完成NVME SSD内部寄存器配置。S_AXI_CTL总线采用AXI_FULL接口AXI_FUL接口信号比较多这里使用一个本地转AXI_FUL接口的模块LOCAL_2_AXI方便读写。通过这个模块这样我们通过本地接口就可以进行S_AXI总线接口的访问module LOCAL_2_AXI # ( parameter C_M_TARGET_SLAVE_BASE_ADDR 32h40000000, parameter integer C_M_AXI_ID_WIDTH 1, parameter integer C_M_AXI_ADDR_WIDTH 32, parameter integer C_M_AXI_DATA_WIDTH 128, parameter integer C_M_AXI_AWUSER_WIDTH 0, parameter integer C_M_AXI_ARUSER_WIDTH 0, parameter integer C_M_AXI_WUSER_WIDTH 0, parameter integer C_M_AXI_RUSER_WIDTH 0, parameter integer C_M_AXI_BUSER_WIDTH 0 ) ( // 本地读写接口 input wire local_wr_en, input wire [C_M_AXI_ADDR_WIDTH-1:0]local_wr_addr, input wire [C_M_AXI_DATA_WIDTH-1:0]local_wr_data, input [C_M_AXI_DATA_WIDTH/8-1:0] i_WSTRB, output reg local_wr_done, input wire local_rd_en, input wire [C_M_AXI_ADDR_WIDTH-1:0]local_rd_addr, output reg [C_M_AXI_DATA_WIDTH-1:0]local_rd_data, output reg local_rd_valid, // AXI4 时钟复位 input wire M_AXI_ACLK, input wire M_AXI_ARESETN, // 写地址通道 output wire [C_M_AXI_ID_WIDTH-1 : 0] M_AXI_AWID, output wire [C_M_AXI_ADDR_WIDTH-1 : 0] M_AXI_AWADDR, output wire [7 : 0] M_AXI_AWLEN, output wire [2 : 0] M_AXI_AWSIZE, output wire [1 : 0] M_AXI_AWBURST, output wire M_AXI_AWLOCK, output wire [3 : 0] M_AXI_AWCACHE, output wire [2 : 0] M_AXI_AWPROT, output wire [3 : 0] M_AXI_AWQOS, output wire [C_M_AXI_AWUSER_WIDTH-1 : 0] M_AXI_AWUSER, output wire M_AXI_AWVALID, input wire M_AXI_AWREADY, // 写数据通道 output wire [C_M_AXI_DATA_WIDTH-1 : 0] M_AXI_WDATA, output wire [C_M_AXI_DATA_WIDTH/8-1 : 0] M_AXI_WSTRB, output wire M_AXI_WLAST, output wire [C_M_AXI_WUSER_WIDTH-1 : 0] M_AXI_WUSER, output wire M_AXI_WVALID, input wire M_AXI_WREADY, // 写响应通道 input wire [C_M_AXI_ID_WIDTH-1 : 0] M_AXI_BID, input wire [1 : 0] M_AXI_BRESP, input wire [C_M_AXI_BUSER_WIDTH-1 : 0] M_AXI_BUSER, input wire M_AXI_BVALID, output wire M_AXI_BREADY, // 读地址通道 output wire [C_M_AXI_ID_WIDTH-1 : 0] M_AXI_ARID, output wire [C_M_AXI_ADDR_WIDTH-1 : 0] M_AXI_ARADDR, output wire [7 : 0] M_AXI_ARLEN, output wire [2 : 0] M_AXI_ARSIZE, output wire [1 : 0] M_AXI_ARBURST, output wire M_AXI_ARLOCK, output wire [3 : 0] M_AXI_ARCACHE, output wire [2 : 0] M_AXI_ARPROT, output wire [3 : 0] M_AXI_ARQOS, output wire [C_M_AXI_ARUSER_WIDTH-1 : 0] M_AXI_ARUSER, output wire M_AXI_ARVALID, input wire M_AXI_ARREADY, // 读数据通道 input wire [C_M_AXI_ID_WIDTH-1 : 0] M_AXI_RID, input wire [C_M_AXI_DATA_WIDTH-1 : 0] M_AXI_RDATA, input wire [1 : 0] M_AXI_RRESP, input wire M_AXI_RLAST, input wire [C_M_AXI_RUSER_WIDTH-1 : 0] M_AXI_RUSER, input wire M_AXI_RVALID, output wire M_AXI_RREADY );将LOCAL_2_AXI模块的M_AXI连接到S_AXI总线本地信号引出到外部进行控制。新建一个nvme_reg_cfg模块用于控制LOCAL_2_AXI模块的本地接口进行NVME SSD寄存器读写module nvme_reg_cfg#( parameter integer C_M_AXI_ADDR_WIDTH 32, parameter integer C_M_AXI_DATA_WIDTH 128, parameter NVME_ADMIN_QSIZE 16d16, parameter ADMIN_SQ_BASE 32h1010_0000, parameter ADMIN_CQ_BASE 32h1010_1000 )( input wire i_aclk, input wire i_aresetn, input i_cfg_start, output o_cfg_done, input i_wr_door_req, input [2:0] i_wr_door_type, input [31:0] i_wr_door_data, output o_wr_door_done, // 本地写接口 output o_wr_en, // 写使能高有效 output [C_M_AXI_ADDR_WIDTH-1:0] o_wr_addr, // 本地写地址偏移地址 output [C_M_AXI_DATA_WIDTH-1:0] o_wr_data, // 本地待写入数据 output [C_M_AXI_DATA_WIDTH/8-1:0] o_WSTRB, input i_wr_done, // 读接口 output o_rd_en, // 读使能高有效 output [C_M_AXI_ADDR_WIDTH-1:0] o_rd_addr, // 本地读地址偏移地址 input [C_M_AXI_DATA_WIDTH-1:0] i_rd_data, // 读回数据 input i_rd_valid // 读数据有效标志 );寄存器偏移地址都是固定的可以将其定义为parameterparameter RegOffset_CAP_L 32h0000_0000; parameter RegOffset_CAP_H 32h0000_0004; parameter RegOffset_VS 32h0000_0008; parameter RegOffset_CC 32h0000_0014; parameter RegOffset_CSTS 32h0000_001C; parameter RegOffset_AQA 32h0000_0024; parameter RegOffset_ASQ_L 32h0000_0028; parameter RegOffset_ASQ_H 32h0000_002C; parameter RegOffset_ACQ_L 32h0000_0030; parameter RegOffset_ACQ_H 32h0000_0034; parameter RegOffset_Admin_SQTDBL 32h0000_1000; parameter RegOffset_Admin_CQHDBL 32h0000_1004; parameter RegOffset_IO_SQ0TDBL 32h0000_1008; parameter RegOffset_IO_CQ0HDBL 32h0000_100C; parameter RegOffset_IO_SQ1TDBL 32h0000_1010; parameter RegOffset_IO_CQ1HDBL 32h0000_1014;主要状态流程如下// cstate always(posedge i_aclk or negedge i_aresetn)begin if(!i_aresetn)begin cstate0; end else begin cstatenstate; end end always(*)begin case(cstate) 0:begin if(start_pdg) nstate1; else nstate0;end 1:begin if(rd_cnt4) nstate2;//RD RC ID else nstate1;end 2:begin if(i_rd_valid) nstate3;//rd ready else nstate2;end 3:begin if(rd_vaild rdata[0]0) nstate4;// else nstate2;end 4:begin if(i_wr_done) nstate5;//wr cc else nstate4;end 5:begin if(i_wr_done) nstate6;//wr AQA else nstate5;end 6:begin if(i_wr_done) nstate7;//wr ASQ_L else nstate6;end 7:begin if(i_wr_done) nstate8;//wr ASQ_H else nstate7;end 8:begin if(i_wr_done) nstate9;//wr ACQ_L else nstate8;end 9:begin if(i_wr_done) nstate10;//wr ACQ_H else nstate9;end 10:begin if(i_wr_done) nstate11;//wr cc else nstate10;end 11:begin if(i_rd_valid) nstate12;//rd ready else nstate11;end 12:begin if(rd_vaild rdata[0]1) nstate13;// else nstate11;end //------ 13:begin if(wr_door_req) nstate14; else nstate13;end 14:begin if(i_wr_done) nstate15; else nstate14;end 15:begin nstate13;end endcase end读寄存器//rd always(posedge i_aclk or negedge i_aresetn)begin if(!i_aresetn)begin rd_en0; rd_addr0; end else begin if(cstate1)begin if(rd_cnt0)begin rd_addrRegOffset_CAP_L; if(i_rd_valid) rd_en0; else rd_en1; end else if(rd_cnt1)begin rd_addrRegOffset_CAP_H; if(i_rd_valid) rd_en0; else rd_en1; end else if(rd_cnt2)begin rd_addrRegOffset_VS; if(i_rd_valid) rd_en0; else rd_en1; end else if(rd_cnt3)begin rd_addrRegOffset_CC; if(i_rd_valid) rd_en0; else rd_en1; end else rd_en0; end else if(cstate2||cstate11)begin rd_addrRegOffset_CSTS; if(i_rd_valid) rd_en0; else rd_en1; end else begin rd_en0; end end end写寄存器//wr always(posedge i_aclk or negedge i_aresetn)begin if(!i_aresetn)begin wr_en0; wr_addr0; wr_data0; end else begin if(cstate4)begin wr_addrRegOffset_CC; wr_data32h0046_0000; if(i_wr_done) wr_en0; else wr_en1; end else if(cstate5)begin wr_addrRegOffset_AQA; wr_data{NVME_ADMIN_QSIZE,NVME_ADMIN_QSIZE}; if(i_wr_done) wr_en0; else wr_en1; end else if(cstate6)begin wr_addrRegOffset_ASQ_L; wr_dataADMIN_SQ_BASE; if(i_wr_done) wr_en0; else wr_en1; end else if(cstate7)begin wr_addrRegOffset_ASQ_H; wr_data32h0000_0000; if(i_wr_done) wr_en0; else wr_en1; end else if(cstate8)begin wr_addrRegOffset_ACQ_L; wr_dataADMIN_CQ_BASE; if(i_wr_done) wr_en0; else wr_en1; end else if(cstate9)begin wr_addrRegOffset_ACQ_H; wr_data32h0000_0000; if(i_wr_done) wr_en0; else wr_en1; end else if(cstate10)begin wr_addrRegOffset_CC; wr_data32h0046_0001; if(i_wr_done) wr_en0; else wr_en1; end else if(cstate14)begin wr_datai_wr_door_data; case(i_wr_door_type) 0:wr_addrRegOffset_Admin_SQTDBL; 1:wr_addrRegOffset_Admin_CQHDBL; 2:wr_addrRegOffset_IO_SQ0TDBL; 3:wr_addrRegOffset_IO_CQ0HDBL; 4:wr_addrRegOffset_IO_SQ1TDBL; 5:wr_addrRegOffset_IO_CQ1HDBL; default:wr_addrRegOffset_Admin_SQTDBL; endcase if(i_wr_done)begin wr_en0; end else begin wr_en1; end end else begin wr_en0; end end end主要寄存器配置流程和ZYNQ控制NVME SSD配置一致。

相关新闻

2026年MBA联考报名时间和流程是什么?只能报一所学校吗?

2026年MBA联考报名时间和流程是什么?只能报一所学校吗?

一、联考报名时间MBA全国联考报名时间由教育部统一规定。以下为2027年入学MBA的关键时间节点(参考近年安排):1.1 报名时间轴阶段时间内容预报名2026年9月最后一周研招网开放正式报名2026年10月中下旬(约15天)全国统一&…

2026/7/31 11:21:53阅读更多 →
2026年企业GEO优化全景指南:构建AI时代品牌信源资产

2026年企业GEO优化全景指南:构建AI时代品牌信源资产

生成式AI正在取代传统搜索引擎成为用户决策第一入口,企业必须将生成式引擎优化纳入核心营销战略。据中国信通院2026年一季度企业数字化营销调研数据显示,超过72%的企业反映在生成式AI平台存在品牌信息"失语"现象,即用户提出相关问题时AI回答未提及该品牌。当豆包、De…

2026/7/31 11:21:53阅读更多 →
Python TCP编程实战:从基础到健壮网络通信框架构建

Python TCP编程实战:从基础到健壮网络通信框架构建

在网络编程的世界里,TCP协议就像一座连接不同设备的桥梁,而Python则是建造这座桥梁最顺手的工具之一。很多开发者以为TCP编程很复杂,需要掌握大量底层知识,但实际上Python的socket模块已经封装了大部分繁琐细节,让初学…

2026/7/31 11:19:53阅读更多 →
自制简易函数信号发生器:从运放电路到PCB设计的完整实践

自制简易函数信号发生器:从运放电路到PCB设计的完整实践

1. 项目缘起:从“买不起”到“自己做”的转变几年前,我在调试一个音频放大电路时,急需一个能产生特定频率和幅度的正弦波、方波信号源。当时手头只有一台笨重的台式信号发生器,每次搬动都费劲,而且功能复杂&#xff0c…

2026/7/31 12:36:31阅读更多 →
成都全屋定制源头厂家

成都全屋定制源头厂家

在成都,装修新房或是改造旧房时,全屋定制成为了众多业主的首选。然而,市面上的全屋定制品牌参差不齐,让人眼花缭乱,许多业主在选择时都面临着各种困扰。今天,就为大家介绍一家来自成都的专业全屋定制源头厂…

2026/7/31 12:36:31阅读更多 →
硬盘选购指南:SATA与NVMe协议、M.2接口详解与实战避坑

硬盘选购指南:SATA与NVMe协议、M.2接口详解与实战避坑

1. 从一块硬盘的“自我介绍”说起如果你刚接触电脑硬件,或者只是想把旧电脑升级一下,打开购物网站搜索“硬盘”,扑面而来的可能就是一堆让人眼花缭乱的词:SATA、NVMe、M.2、PCIe、AHCI……它们到底是什么意思?我该选哪…

2026/7/31 12:36:31阅读更多 →
终极英雄联盟智能助手完整指南:如何用League Akari提升300%游戏效率 [特殊字符]

终极英雄联盟智能助手完整指南:如何用League Akari提升300%游戏效率 [特殊字符]

终极英雄联盟智能助手完整指南:如何用League Akari提升300%游戏效率 🚀 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit …

2026/7/31 12:36:31阅读更多 →
英雄联盟终极助手:League Akari 快速提升游戏效率的完整指南

英雄联盟终极助手:League Akari 快速提升游戏效率的完整指南

英雄联盟终极助手:League Akari 快速提升游戏效率的完整指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟游戏中…

2026/7/31 12:36:31阅读更多 →
AI Agent工具调用稳定性深度解析:小白也能看懂的大模型实践指南

AI Agent工具调用稳定性深度解析:小白也能看懂的大模型实践指南

本文深入探讨了AI Agent工具调用的稳定性问题,从工具数量上限、并行调用的上下文管理到异常处理的六道防线进行了详细解析。文章强调了工具数量并非越多越好,并介绍了Tool Search等关键技术突破数量限制。同时,详细阐述了并行调用中结果排序、…

2026/7/31 12:34:31阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:40阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:41阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/31 0:49:33阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/31 5:08:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →