三、实战篇-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配置一致。

相关新闻

逃离塔科夫离线版存档修改器:告别繁琐JSON编辑的终极解决方案

逃离塔科夫离线版存档修改器:告别繁琐JSON编辑的终极解决方案

逃离塔科夫离线版存档修改器:告别繁琐JSON编辑的终极解决方案 【免费下载链接】SPT-AKI-Profile-Editor Программа для редактирования профиля игрока на сервере SPT-AKI 项目地址: https://gitcode.com/gh_mi…

2026/10/20 23:21:12 阅读更多 →
三菱PLC与组态王在智能车库控制系统的应用

三菱PLC与组态王在智能车库控制系统的应用

1. 智能车库控制系统的行业背景与需求分析 在城市化进程加速的今天,停车难已成为困扰现代都市的普遍问题。传统车库管理系统普遍存在效率低下、人工成本高、安全性不足等痛点。根据中国停车行业协会2022年度报告显示,全国大型商业综合体平均停车位利用率…

2026/10/19 23:25:24 阅读更多 →
2023年JDK安装与环境配置全指南:从版本选择到IDE集成

2023年JDK安装与环境配置全指南:从版本选择到IDE集成

1. 为什么2023年了,我们还需要从零开始聊JDK安装?如果你是一个刚刚踏入编程世界的新手,或者是一个需要从其他语言转向Java的开发者,看到“JDK安装”这个标题,可能会觉得有点老生常谈。毕竟,Java已经是一门有…

2026/10/21 20:51:44 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/22 10:18:38 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/22 11:01:53 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/22 9:44:47 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/22 10:42:00 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/22 10:40:08 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/22 10:56:37 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/22 1:47:45 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/21 21:32:28 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/22 5:12:39 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:50:56 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:51:55 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 16:24:48 阅读更多 →