当前位置: 首页 > article >正文

FPGA搭建nvme读写硬盘系统探索

FPGA搭建nvme读写硬盘系统。 cpu通过pcie模块操作硬盘读写。 图片是sdk下面枚举到硬盘过程中的打印。 FPGA用的是xc7z100ps跑的Linuxpl用pciex1接到硬盘x4也可以的最近搞了个挺有意思的项目用FPGA搭建nvme读写硬盘系统今天来和大家分享一下过程中的一些经验和发现。咱这个系统呢是通过cpu借助pcie模块来操作硬盘读写的。先说说硬件方面FPGA用的是xc7z100ps跑的Linuxpl则通过pciex1接到硬盘其实用pciex4也是没问题的哈。在这个过程中有个很关键的步骤就是通过SDK枚举硬盘。当我在SDK下面进行枚举硬盘操作时会有一系列的打印信息这些打印就像是系统和硬盘之间沟通的桥梁能让我们清楚地看到枚举过程中的各种状态。FPGA搭建nvme读写硬盘系统。 cpu通过pcie模块操作硬盘读写。 图片是sdk下面枚举到硬盘过程中的打印。 FPGA用的是xc7z100ps跑的Linuxpl用pciex1接到硬盘x4也可以的下面简单说一下代码部分吧。在进行pcie相关的配置时会有类似这样的代码module pcie_config ( input wire clk, input wire rst_n, // 其他相关信号 ); // 这里定义一些内部信号 wire [31:0] config_data; // pcie配置的具体逻辑实现 always (posedge clk or negedge rst_n) begin if (!rst_n) begin // 初始化一些状态 end else begin // 进行配置数据的生成和发送等操作 config_data {32{1b0}}; // 这里根据具体的协议和需求填充config_data // 比如设置pcie的工作模式、速率等参数 end end endmodule这段代码呢就是负责pcie配置的模块。在时钟上升沿或者复位信号有效时会进行相应的操作。复位时会初始化一些状态正常工作时会生成并发送配置数据。这里把配置数据初始化为全0然后根据实际情况去填充它像设置pcie的工作模式、速率这些关键参数都要在这里精心调整。再来说说硬盘读写的代码部分。module nvme_disk_io ( input wire clk, input wire rst_n, // 与pcie交互的信号 input wire [511:0] pcie_read_data, output reg [511:0] pcie_write_data, // 与硬盘交互的信号 output reg [31:0] disk_addr, output reg [511:0] disk_write_data, input wire [511:0] disk_read_data ); // 读写命令相关信号 reg read_cmd; reg write_cmd; always (posedge clk or negedge rst_n) begin if (!rst_n) begin // 复位各种信号状态 read_cmd 1b0; write_cmd 1b0; disk_addr {32{1b0}}; pcie_write_data {512{1b0}}; end else begin // 根据pcie传来的数据判断读写操作 if (pcie_read_data[511:510] 2b01) begin read_cmd 1b1; disk_addr pcie_read_data[31:0]; end else if (pcie_read_data[511:510] 2b10) begin write_cmd 1b1; disk_addr pcie_read_data[31:0]; pcie_write_data pcie_read_data[511:0]; end // 与硬盘进行实际的数据交互 if (read_cmd) begin // 这里发送读命令到硬盘并等待读取数据 disk_read_data disk_read_data; end if (write_cmd) begin // 这里发送写命令到硬盘并写入数据 disk_write_data pcie_write_data; end end end endmodule这段代码负责处理nvme硬盘的读写操作。根据从pcie接收到的数据判断是读操作还是写操作然后相应地设置读写命令和硬盘地址等信息。在时钟上升沿或者复位信号有效时进行状态的更新。当接收到读命令时会向硬盘发送读请求并等待读取数据接收到写命令时会向硬盘发送写请求并写入数据。这里通过巧妙地判断和处理不同的命令实现了硬盘读写的控制。整个搭建过程中遇到了不少问题像是信号同步的问题啦协议兼容性的问题等等。不过通过不断地调试代码、查看打印信息一个个都被解决啦。感觉自己又积累了不少宝贵的经验也希望能给有同样需求的小伙伴们一些参考和启发呀。#FPGA #nvme #硬盘读写 #pcie

相关文章:

FPGA搭建nvme读写硬盘系统探索

FPGA搭建nvme读写硬盘系统。 cpu通过pcie模块操作硬盘读写。 图片是sdk下面枚举到硬盘过程中的打印。 FPGA用的是xc7z100,ps跑的Linux,pl用pciex1接到硬盘(x4也可以的)最近搞了个挺有意思的项目,用FPGA搭建nvme读写硬盘…...

Logistic生长曲线拟合实战:从微分方程到MATLAB实现与生物学意义解析

1. Logistic生长曲线的基础概念 我第一次接触Logistic生长曲线是在研究大肠杆菌培养实验时。当时实验室的师弟拿着OD600测量数据一脸茫然——明明细菌应该指数增长,为什么后期数据总是偏离预期?这让我意识到,理解生长曲线的数学本质比单纯操…...

VAD复现实战:高效自动驾驶向量化场景表示的关键步骤与避坑指南

1. VAD模型复现前的环境准备 复现VAD(Vectorized Autonomous Driving)模型的第一步就是搭建合适的开发环境。这里我踩过不少坑,总结下来最头疼的就是各种Python包的版本冲突问题。官方提供的requirement.txt虽然列出了依赖包,但实…...

GLASS数据集在地表温度研究中的实战应用:从数据获取到结果解读

GLASS数据集在地表温度研究中的实战应用:从数据获取到结果解读 地表温度(Land Surface Temperature, LST)作为反映陆表热力状态的关键指标,在城市热岛效应、干旱监测、气候变化等领域具有重要研究价值。GLASS数据集提供的长时间序…...

颠覆传统性能管理:G-Helper开源工具实现华硕笔记本硬件控制与性能优化的完整方案

颠覆传统性能管理:G-Helper开源工具实现华硕笔记本硬件控制与性能优化的完整方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar a…...

Linux中daemon(守护进程)和systemctl的区别

在学习和使用 Linux 服务器时,我们经常会遇到两个高频概念:Daemon(守护进程) 和 systemctl。很多初学者容易把它们混淆,甚至误以为是同一类东西。实际上,二者是被管理的实体与管理工具的关系。本文用清晰易…...

Llama-3.2V-11B-cot代码能力展示:辅助编程与代码审查实战

Llama-3.2V-11B-cot代码能力展示:辅助编程与代码审查实战 最近在开发者圈子里,关于大模型辅助编程的讨论越来越热。大家可能都用过一些基础的代码补全工具,但今天我想聊聊一个不太一样的选手——Llama-3.2V-11B-cot。它不是一个单纯的代码生…...

Qwen3-4B-Instruct开源大模型教程:无需GPU的高性能写作方案

Qwen3-4B-Instruct开源大模型教程:无需GPU的高性能写作方案 你是不是也遇到过这样的烦恼?想用AI写点东西,要么是免费的工具太“笨”,写出来的东西逻辑不通、味同嚼蜡;要么是强大的模型对电脑要求太高,动不…...

告别串口助手!用Proteus虚拟终端调试Arduino串口通信的保姆级教程

告别串口助手!用Proteus虚拟终端调试Arduino串口通信的保姆级教程 嵌入式开发中,串口通信调试一直是不可或缺的环节。传统方式需要依赖物理串口调试助手,不仅增加了硬件成本,还延长了开发周期。今天,我们将探索一种更高…...

3步极速汉化:让Android Studio告别语言障碍,提升开发效率

3步极速汉化:让Android Studio告别语言障碍,提升开发效率 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack …...

基于最大功率跟踪MPPT算法的直流侧电压稳定控制,光伏电池充电模型及双向电路充放电技术研究

光伏-电池充电模型,可以很好的稳定直流输出电压。 采用最大功率跟踪MPPT算法,通过boost电路输出电压,电池侧采用电压电流PI双闭环控制,通过双向电路给电池充放电。 直流侧参考电压为48v。光伏和锂电池这对搭档在离网系统里算是黄金…...

AudioSeal快速上手:AudioSeal Web界面多语言切换(中/英/日/韩)配置方法

AudioSeal快速上手:AudioSeal Web界面多语言切换(中/英/日/韩)配置方法 1. 项目概述 AudioSeal是Meta开源的语音水印系统,专门用于AI生成音频的检测和溯源。这个工具可以帮助用户在音频文件中嵌入水印信息,或者检测已…...

STM32型号太多看花眼?手把手教你用官方选型手册5分钟锁定最适合你的芯片

STM32选型实战指南:5步精准匹配项目需求的芯片筛选法 面对ST官网提供的上百款STM32系列微控制器,许多工程师在选型时容易陷入"参数海洋"——GPIO数量、通信接口、主频、存储容量等数十项指标如何权衡?本文将分享一套经过实战验证的…...

戴森球计划工厂蓝图库:从新手到专家的终极效率提升方案

戴森球计划工厂蓝图库:从新手到专家的终极效率提升方案 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 还在为戴森球计划中复杂的工厂布局头疼吗?Fa…...

告别ODT复杂配置!Office LTSC 2021一键安装ISO镜像实测

Office LTSC 2021极简安装指南:从ISO镜像到完整部署 在数字化办公日益普及的今天,微软Office套件依然是企业办公和个人文档处理的首选工具。然而,对于许多非技术背景的用户来说,传统的Office部署工具(ODT)配置过程复杂得令人望而却…...

深入AUTOSAR E2E状态机:Profile1的OK、ERROR、SYNC状态到底在说什么?一个例子讲清楚

深入解析AUTOSAR E2E Profile1状态机:从OK到SYNC的实战诊断逻辑 在车载电子系统开发中,确保通信数据的完整性和可靠性至关重要。AUTOSAR的E2E(End-to-End)保护机制,特别是Profile1,为CAN总线等车载网络提供…...

PIR人体红外传感器原理与GD32F407驱动实战

1. 人体红外传感器模块原理与工程实现1.1 热释电传感原理与器件选型依据人体红外传感器模块的核心器件为热释电红外(PIR)传感器,其工作机理基于热释电效应:当特定晶体材料(如锆钛酸铅PZT或锂钽酸锂LiTaO₃)…...

Spring Boot新手必看:@PostMapping和@GetMapping到底怎么选?5个实际案例帮你搞懂

Spring Boot实战指南:PostMapping与GetMapping的智能选择策略 在Spring Boot开发中,HTTP请求处理是构建Web应用的基础。对于刚接触Spring框架的开发者来说,面对PostMapping和GetMapping这两个常用注解时,往往会产生"什么时候…...

2153、51单片机电压电流功率及功率因数等多参数电能表电流超过阈值自动断电

具体详情请点击下面观看: 2153、51单片机电压电流功率及功率因数等多参数电能表电流超过_单片机测功率因数-CSDN博客 演示操作视频讲解请点击下面观看: https://v.douyin.com/ZojaSHzxCtc...

新手避坑指南:用Burp Suite 2025插件玩转Pikachu靶场(CSRF Token自动追踪实战)

Burp Suite 2025高阶实战:CSRF Token自动化追踪与Pikachu靶场深度攻防 当Burp Suite 2025遇上Pikachu靶场,会碰撞出怎样的火花?作为Web安全领域的黄金标准工具,Burp Suite每年迭代都会带来颠覆性改进。本文将带你深入2025版本的核…...

Nuclei新手必看:5分钟搞定漏洞扫描的保姆级教程(含实战命令)

Nuclei漏洞扫描实战指南:从零基础到精准检测 在网络安全领域,快速识别系统漏洞是每个安全从业者的核心技能。Nuclei作为一款基于模板的现代化扫描工具,以其高效的并发能力和丰富的社区模板库,正在重新定义漏洞检测的工作流程。不同…...

HashMap性能玄学:31这个神奇数字如何避免你的数据撞车?

HashMap性能优化:为什么31是哈希计算的黄金数字? 在Java开发中,HashMap几乎是每个工程师日常接触最频繁的数据结构之一。但你是否曾好奇过,为什么HashMap的hashCode()方法中总是出现那个神秘的数字31?这个看似随机的选…...

Excel导出样式太丑?手把手教你用xlsx.bundle.js设置合并单元格、行高和中文边框

用xlsx.bundle.js打造专业级Excel导出方案:从合并单元格到中文排版优化 每次看到前端导出的Excel文件,是不是总觉得少了点什么?那些参差不齐的列宽、毫无美感的边框、混乱的中文换行,让本该专业的数据报表显得格外"业余"…...

Focal Loss 参数调优指南与 PyTorch 实战技巧

1. Focal Loss 为什么需要调参? 第一次用 Focal Loss 训练目标检测模型时,我发现一个奇怪现象:明明用了这个"解决类别不平衡的神器",模型却对少数类别的识别率依然糟糕。后来才发现,直接套用论文默认参数&a…...

逆向工程实战:XXTEA算法解密与混淆处理

1. XXTEA算法逆向工程入门指南 第一次接触XXTEA算法逆向时,我也被那一大段汇编代码搞得头晕眼花。但别担心,我们先把复杂问题拆解成几个关键步骤。XXTEA(Corrected Block TEA)是一种分组加密算法,常用于数据保护场景。…...

ChatTTS最新模型解析:从架构设计到生产环境部署指南

最近在做一个需要语音合成的项目,之前用的一些开源TTS模型,要么音质不够自然,要么推理速度慢得让人着急。正好看到ChatTTS更新了,号称在自然度和效率上都有很大提升,就花时间深入研究了一下。这篇笔记就记录我从学习其…...

终极Steam创意工坊模组下载器WorkshopDL:跨平台免费获取游戏模组的完整指南

终极Steam创意工坊模组下载器WorkshopDL:跨平台免费获取游戏模组的完整指南 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否曾经遇到过这样的困扰&#xff1a…...

C语言的循环语句

for循环结构for循环的语法结构如下:for(初始化;判断语句;自加自减){语句块 }执行流程:初始化语句首先执行,且只执行一次判断语句被求值,如果为真(非零),则执行循环体循环…...

机械臂关节模块的设计与优化:从基础到实践

1. 机械臂关节模块的核心价值 机械臂关节模块相当于人类的"关节",是让机械臂灵活运动的关键部件。想象一下,如果没有灵活的肘关节和腕关节,我们的手臂就无法完成拿杯子、写字等精细动作。机械臂关节模块同样承担着这样的核心功能—…...

Redis中是如何实现分布式锁的

在分布式系统中,多个服务实例共享资源时需通过分布式锁保证操作原子性,Redis凭借高性能、高可用特性成为实现分布式锁的主流方案。本文从核心原理、关键实现细节、常见问题及面试高频考点展开解析,帮助理解Redis分布式锁的设计逻辑与实践要点…...