记录此刻:历时两月,初步实现基于FPGA的NVMe SSD固态硬盘存储控制器设计!

news2025/5/19 5:46:02

背景

为满足实验室横向项目需求,在2024年12月中下旬导师提出基于FPGA的NVMe SSD控制器研发项目。项目核心目标为:通过PCIe 3.0 x4接口实现单盘3000MB/s的持续读取速率。

实现过程

调研

花了半个月的时间查阅了一些使用FPGA实现NVME SSD控制器的论文、博客,确认了实现思路和路线,主要明确以下几点:
1、架构角色转换:区别于传统FPGA作为Endpoint设备(如数据采集卡),本项目需将FPGA配置为Root Complex(RC),主动管理作为Endpoint(EP)的NVMe SSD设备
2、协议栈解析:建立NVMe协议与PCIe协议的层级关系认知,确认需基于Xilinx AXI PCIe IP核构建Root Port架构
3、PCIe配置空间:重点研究BAR寄存器组的地址映射机制,在实现过程中,FPGA需要对SSD的PCIE 配置空间进行配置。
4、学习NVMe协议队列机制实现:参考《蛋蛋读NVMe》技术博客,构建基于门铃寄存器的SQ/CQ队列管理系统。NVMe寄存器组:深入学习CAP(控制器能力)、CC(控制器配置)、CSTS(控制器状态)等核心寄存器

硬件选择

自己想了两个方案,第一种是通过PCIE金手指转M.2接口。类似于下图这种(该图来源于一篇硕士论文)
在这里插入图片描述
我当时买的那个转接板不知道哪里有问题,PCIE链路建立不起来。

第二种方案是使用FMC转M.2接口,此方案可以正常建立起PCIE链路连接。
在这里插入图片描述

FPGA逻辑设计

由于课题组并没有相关的设计参考,所以不得不从零开始,在AXI PCIE IP官方给的example design的基础上进行“魔改”。

1、学习AXI PCIE IP使用,知道IP核的接口是干嘛用的,主要是以下接口:S_AXI、S_AXI_CTRL、M_AXI。
在这里插入图片描述
2、学习IP核的配置,AXI BAR选项卡比较重要,涉及到AXI地址到PCIE地址的转换。
在这里插入图片描述
3、配置SSD PCIE 配置空间的相关寄存器,比如BAR0、BAR1寄存器、Command寄存器等。设置IP核使能。
4、读取SSD中和NVME协议寄存器,寄存器的偏移量是相对于PCIE BAR寄存器的地址偏移的。比较关键的是CAP寄存器。
5、进行NVME SSD的初始化,设置管理和完成队列的深度、基地址等,并设置CC.EN=1,等待CSTS.RDY为1。
6、发送Admin命令,进行SSD的识别、配置I/O队列数,以及对应的I/O完成队列和提交队列的ID、基地址、深度等。命令的实现方式和流程按照协议要求来就行了,基于状态机进行设计。
7、发送I/O命令,进行数据读写,要确认好SSD一次传输的最大数据量是多少,以及一个扇区的大小。
在这里插入图片描述
在这里插入图片描述

总结

碎碎念:说真的,刚开始做的时候,我是没有想到自己能做出来的,而且这个控制器方案也没有太多可借鉴的开源的设计,该方案都是被拿来售卖的。没想到自己能用两个月的时间给初步实现出来。不过,目前这个方案还不够完善,后续还需要进行优化调整,使其更加易用。比如,通过几个简单的控制信号,就能完成大批量的数据读取,这方面我打算参考商业 IP 的接口设计思路。

后面有时间可以用一个专栏讲解一下实现思路,但是应该不会免费开源,因为该项目完全可以作为一个高端项目供大家深入学习研究,我并不希望它因为过度传播而失去其独特性 ,变得过于泛滥(烂大街)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2305935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch入门级项目--基于卷积神经网络的数字识别

文章目录 前言1.数据集的介绍2.数据集的准备3.数据集的加载4.自定义网络模型4.1卷积操作4.2池化操作4.3模型搭建 5.模型训练5.1选择损失函数和优化器5.2训练 6.模型的保存7.模型的验证结语 前言 本篇博客主要针对pytorch入门级的教程,实现了一个基于卷积神经网络&a…

yolov12部署(保姆级教程)

yolov12部署 戳链接访问原论文论文地址 戳链接访问原代码代码地址 直接把源代码以ZIP的形式下载到本地,然后解压用IDE打开就可以了(这一步比较简单不过多介绍) 在IDE中打开可以看见一个README.md文件,这里有我们将yolov12部署本…

五、Three.js顶点UV坐标、纹理贴图

一部分来自1. 创建纹理贴图 | Three.js中文网 ,一部分是自己的总结。 一、创建纹理贴图 注意:把一张图片贴在模型上就是纹理贴图 1、纹理加载器TextureLoader 注意:将图片加载到加载器中 通过纹理贴图加载器TextureLoader的load()方法加…

汽车零部件工厂如何通过ESD监控系统闸机提升产品质量

在汽车零部件工厂的生产过程中,静电带来的危害不容小觑。从精密的电子元件到复杂的机械部件,静电都可能成为影响产品质量的 “隐形杀手”。而 ESD 监控系统闸机的出现,为汽车零部件工厂解决静电问题、提升产品质量提供了关键的技术支持。 一、…

Pi币与XBIT:在去中心化交易所的崛起中重塑加密市场

在加密货币市场迅猛发展的背景下,Pi币和XBIT正在成为投资者关注的焦点。Pi币作为一项创新的数字货币,通过独特的挖矿机制和广泛的用户基础,迅速聚集了大量追随者,展示了强大的市场潜力。同时,币应XBIT去中心化交易所的…

【Python量化金融实战】-第2章:金融市场数据获取与处理:2.1 数据源概览:Tushare、AkShare、Baostock、通联数据(DataAPI)

本章将详细介绍四大主流金融数据源(Tushare、AkShare、Baostock、通联数据(DataAPI)),分析其特点与适用场景,并通过实战案例展示数据获取与处理的全流程。 👉 点击关注不迷路 👉 点击…

首次使用WordPress建站的经验分享(一)

之前用过几种内容管理系统(CMS),如:dedeCMS、phpCMS、aspCMS,主要是为了前端独立建站,达到预期的效果,还是需要一定的代码基础的,至少要有HTML、Css、Jquery基础。 据说WordPress 是全球最流行的内容管理系统CMS,从现在开始记录一下使用WordPress 独立建站的步骤 选购…

Mysql 主从集群同步延迟问题怎么解决

目录 前言: 复制过程分为几个步骤: 一、同步延迟的危害 二、同步延迟的常见原因 1. 主库写入压力过大 2. 网络传输瓶颈 3. 从库硬件性能不足 4. 配置参数不合理 5. 特殊操作影响 三、深度诊断方法 1. 查看同步状态 2. 性能分析工具 四、十大解…

Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果

目录 一、基本的后处理流程 - 以将画面转化为灰度图为例 1. C#调用shader 2. Shader实现效果 二、Bloom辉光效果 1. 主要变量 2. Shader效果 (1)提取较亮区域 - pass1 (2)高斯模糊 - pass2&3 (3&#xff…

三、《重学设计模式》-单例模式

单例模式 单例模式分为四大类,饿汉式、懒汉式、静态内部类、枚举 饿汉式 优点:类装载时进行实例化,避免同步问题 缺点:造成内存浪费 实现一 1.构造器私有化 2.内部创建对象实例 3.提供静态方法 public class Type1 {public s…

SpringBoot3整合Swagger3时出现Type javax.servlet.http.HttpServletRequest not present错误

目录 错误详情 错误原因 解决方法 引入依赖 修改配置信息 创建文件 访问 错误详情 错误原因 SpringBoot3和Swagger3版本不匹配 解决方法 使用springdoc替代springfox&#xff0c;具体步骤如下&#xff1a; 引入依赖 在pom.xml文件中添加如下依赖&#xff1a; <…

项目实战--网页五子棋(匹配模块)(4)

上期我们完成了游戏大厅的前端部分内容&#xff0c;今天我们实现后端部分内容 1. 维护在线用户 在用户登录成功后&#xff0c;我们可以维护好用户的websocket会话&#xff0c;把用户表示为在线状态&#xff0c;方便获取到用户的websocket会话 package org.ting.j20250110_g…

【Java毕业设计】商城购物系统(附源码+数据库脚本)

本系统是基于JavaEEServletJSPMysql实现的商城购物系统。包括用户登录、用户注册、商品分类、添加购物车、订单支付等基本功能&#xff0c;具体页面及功能如下&#xff1a; 感谢阅读&#xff01; 如需获取完整项目源码及更多项目信息&#xff0c;可添加V&#xff1a;

POST请求提交数据的三种方式及通过Postman实现

1、什么是POST请求&#xff1f; POST请求是HTPP协议中一种常用的请求方法&#xff0c;它的使用场景是向客户端向服务器提交数据&#xff0c;比如登录、注册、添加等场景。另一种常用的请求方法是GET&#xff0c;它的使用场景是向服务器获取数据。 2、POST请求提交数据的常见编…

Spring Boot 整合 Spring MVC /(整合Web)笔记

1. Spring Boot 整合 Web 功能 Spring Boot 通过自动配置简化了 Spring MVC 的集成。只需在 pom.xml 中添加 spring-boot-starter-web 依赖&#xff0c;Spring Boot 就会自动配置 Spring MVC 的相关组件。 <dependency><groupId>org.springframework.boot</gr…

[特殊字符]清华大学:DeepSeek从入门到精通.pdf(清华领航,驾驭DeepSeek,开启AI新境界)

不愧是清华大学出品的deepseek手册&#xff0c;简直是新手 福音&#xff0c;非常实用&#xff01; 这份《DeepSeek&#xff1a;从入门到精通》手册从基础到高 阶&#xff0c;手把手教你玩转DeepSeek&#xff0c;特别适合刚入门的小白&#xff0c;拿来就能用&#xff01; 1.Deep…

深度学习技术全景图:从基础架构到工业落地的超级进化指南

&#x1f50d; 目录导航 基础架构革命训练优化秘技未来战场前瞻 &#x1f9e9; 一、基础架构革命 1.1 前馈神经网络&#xff08;FNN&#xff09; ▍核心结构 import torch.nn as nnclass FNN(nn.Module):def __init__(self):super().__init__()self.fc1 nn.Linear(784, 25…

PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)

PyTorch-基础 环境准备 CUDA Toolkit安装&#xff08;核显跳过此步骤&#xff09; CUDA Toolkit是NVIDIA的开发工具&#xff0c;里面提供了各种工具、如编译器、调试器和库 首先通过NVIDIA控制面板查看本机显卡驱动对应的CUDA版本&#xff0c;如何去下载对应版本的Toolkit工…

IO/网络IO基础全览

目录 IO基础CPU与外设1. 程序控制IO&#xff08;轮询&#xff09;2. 中断中断相关知识中断分类中断处理过程中断隐指令 3. DMA&#xff08;Direct Memory Access&#xff09; 缓冲区用户空间和内核空间IO操作的拷贝概念传统IO操作的4次拷贝减少一个CPU拷贝的mmap内存映射文件(m…

【DeepSeek-R1背后的技术】系列十一:RAG原理介绍和本地部署(DeepSeekR1+RAGFlow构建个人知识库)

【DeepSeek-R1背后的技术】系列博文&#xff1a; 第1篇&#xff1a;混合专家模型&#xff08;MoE&#xff09; 第2篇&#xff1a;大模型知识蒸馏&#xff08;Knowledge Distillation&#xff09; 第3篇&#xff1a;强化学习&#xff08;Reinforcement Learning, RL&#xff09;…