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

背景

为满足某项目需求,在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 的接口设计思路。

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

### FPGA NVMe SSD 实现方案概述 FPGA实现高性能NVMe SSD读写方面具有显著优势,尤其是在定制化需求和实时处理场景中。以下是关于如何利用FPGA实现高效NVMe SSD的技术细节。 #### 架构设计 为了实现高效的NVMe SSD操作,通常需要将FPGA配置为Root Complex (RC),从而能够主动管理和控制作为Endpoint (EP) 的NVMe SSD设备[^2]。这种架构允许FPGA通过PCIe总线直接访问SSD的寄存器和存储区域,减少中间环节带来的延迟。 #### 协议支持 NVMe协议栈的解析是整个设计的核心部分之一。具体来说,需要基于Xilinx AXI PCIe IP核构建Root Port架构,并完成以下功能模块的设计: - **BAR 寄存器组映射**:定义并初始化PCIe配置空间中的基址寄存器(BARs)[^2]。 - **队列管理**:按照NVMe标准实现提交队列(SQ) 和完成队列(CQ),并通过门铃寄存器通知SSD执行命令或返回结果[^2]。 #### 性能优化策略 尽管现有方案已经实现了较高的吞吐量(如ZCU106平台上可达2.3GB/s写入, 2.5GB/s读取)[^1],但仍可通过改进逻辑结构进一步提升效率至接近理论极限值约3.94GB/s(Gen3 x4链路条件下的最大传输速率)[^3]: - 使用更先进的工艺节点制造芯片以降低功耗并增加可用资源数量; - 对内部数据路径进行全面流水线改造,消除潜在瓶颈; - 增强错误检测与纠正能力(ECM), 提升可靠性的同时也间接促进了整体表现改善。 #### 硬件选型考量因素 当选择合适的FPGA型号时应考虑以下几个关键要素: - 是否内置强大的MCU/CPU单元以便简化软件开发流程; - 支持高速串行通信接口的能力,优先选用具备集成PHY硬核的产品; - 可编程逻辑单元的数量充足用于部署复杂的计算密集型任务. 综上所述,Xilinx Zynq系列产品因其兼具ARM处理器子系统以及丰富的可重构硬件资源而成为理想候选者之一[^4]. ```python def fpga_nvme_performance(): theoretical_max_gen3 = 3.938 # GB/s for PCIe Gen3 x4 lanes zcu106_write_speed = 2.3 # GB/s achieved on ZCU106 platform with custom design zcu106_read_speed = 2.5 # GB/s improvement_potential = ((theoretical_max_gen3 - max(zcu106_write_speed,zcu106_read_speed)) / min(zcu106_write_speed,zcu106_read_speed))*100 return {"Theoretical Max Speed":theoretical_max_gen3,"Current Write Speed(ZCU106)":zcu106_write_speed, "Current Read Speed(ZCU106)":zcu106_read_speed,"% Improvement Potential":improvement_potential} fpga_perf_metrics=fpga_nvme_performance() print(f"FPGA Performance Metrics:\n{fpga_perf_metrics}") ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值