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

devtools/2025/3/1 19:51:37/

背景

为满足实验室横向项目需求,在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.ppmy.cn/devtools/163716.html

相关文章

STM32--SPI通信讲解

前言 嘿,小伙伴们!今天咱们来聊聊STM32的SPI通信。SPI(Serial Peripheral Interface)是一种超常用的串行通信协议,特别适合微控制器和各种外设(比如传感器、存储器、显示屏)之间的通信。如果你…

Zookeeper(80)Zookeeper的常见问题有哪些?

Zookeeper作为分布式系统的协调服务,常见的问题主要集中在配置、性能、连接管理、数据一致性和节点故障等方面。以下是一些常见问题及其详细解决方法和代码示例。 1. 配置问题 问题描述 配置不当可能导致 Zookeeper 集群无法正常启动或运行效率低下。 解决方法 …

力扣-动态规划-139 单词拆分

思路 dp数组定义:用wordDict数组可以完成不超过j的字符串的可能为dp[j]递推公式: tmp s.substr(j - wordDict[i].size(), wordDict[i].size()); dp[j] (dp[j - wordDict[i].size()] && wordDict[i] tmp) || dp[j]; dp数组初始化:…

手写RPC框架-V1版本

配合源代码使用体验更佳 Version 1.0一、Provider模块1.ProviderExample2.UserServiceImplpom.xml 二、Consumer模块1.ConsumerExample3.UserServiceProxy(静态代理)pom.xml 三、RPC模块Proxy包1.ServiceProxy2.ServiceProxyFactory Registry包LocalRegi…

利用 AWS API Gateway 和 Lambda 节省成本的指南

在现代云计算环境中,企业和开发人员不断寻求方法来优化成本,同时保持高性能和灵活性。AWS API Gateway 和 Lambda 组合提供了一种无服务器(Serverless)的解决方案,能够显著降低基础设施成本,简化管理&#…

Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程

Redisson 是一个高性能的 Java Redis 客户端,提供了丰富的分布式工具集,如分布式锁、Map、Queue 等,帮助开发者简化 Redis 的操作。在集成 Redisson 到项目时,开发者通常有两种选择: 使用 Redisson 原始依赖。使用 Re…

JMeter性能问题

性能测试中TPS上不去的几种原因 性能测试中TPS上不去的几种原因_tps一直上不去-CSDN博客 网络带宽 连接池 垃圾回收机制 压测脚本 通信连接机制 数据库配置 硬件资源 压测机 业务逻辑 系统架构 CPU过高什么原因 性能问题分析-CPU偏高 - 西瓜汁拌面 - 博客园 US C…

网络安全红队工具

目录 红队及发展趋势 基本概念 发展趋势 防守阶段 备战阶段 临战阶段 实战阶段 战后整顿 如果错过互联网,与你擦肩而过的不仅仅是机会,而是整整一个时代。 红队及发展趋势 基本概念 红队一般指实战攻防的防守方。 红队主要复盘总结现有防护系统的不足之处,为…