FPGA PCIe PIO代码的学习

目录

背景

应用场景

代码架构分析

结论


背景

本项目是基于xinlinx官方的PCIe IP 7 series integrated block for PCI Express。根据官方的例程加上官方给的example,对代码进行分析。

应用场景

对一些速率要求不高的,比如IO操作,推荐使用此IP进行设计,虽然相比其他的IP较为复杂,需要对PCIe协议有所了解,但是对于研发而言,这未必不是好事。

代码架构分析

这个工程结构,包含两个部分。

第一部分:PCIE IP核,此部分包含数据链路层核物理层

第二部分:app部分,此部分主要是用户接口部分,为AXI总线结构,需要解析其中的TLP包。

根据顶层文件,对数据流进行分析:

PIO_EP_MEM_ACCESS 用于控制FPGA的存储器的读写;

PIO_RX_ENGINE 是接收引擎,用于接收、解析TLP;

PIO_TX_ENGINE 是发送引擎,用于组装、发送TLP;

PIO_TO_CTRL 是终端Turn-Off控制单元,用来响应主机CPU的电源关闭消息的ACK。

         首先差分接收接口(rxn、rxp)接收到信号,信号经过物理层、数据链路层、事务层之后变成TLP进入接收引擎(PIO_RX_ENGINE )进行解析;接着根据标头判断这个TLP是读存储器还是写存储器,若是写存储器,就将下一个TLP中的地址和数据解析出来(因为这里一次发送64bit,所以第一个TLP中不包含地址和数据,第二个TLP中包含地址和数据),然后通过PIO_EP_MEM_ACCESS 模块将数据写入指定的地址中;若是读存储器,就将下一个TLP中包含的地址解析出来,再通过PIO_EP_MEM_ACCESS 模块将数据从指定的地址中读取出来,然后经过发送引擎(PIO_TX_ENGINE )进行完成包拼接,最后通过事务层、数据链路层、物理层封装之后,通过差分发送接口(txn、txp)将数据发送出去。   

          进入PIO_RX_RST_START 状态,这是一个复位状态,在复位状态中,首先判断sop 信号是否有效,sop 信号是TLP开始的信号,若这个信号无效,则程序会一直在复位状态中直到sop 信号有效;若sop 信号有效,根据上文一个简单的TLP 中分析可知,TLP的24~30位代表着这个TLP的类型,所以接着分析m_axis_rx_tdata[30:24] 判定包的类型。

m_axis_rx_tready 信号标志着接受设备是否准备好接收TLP,所以当接收到一个TLP后m_axis_rx_tready <= 1’b0 ,表示刚接收到一个TLP,还没有准备好接收下一个,等到当前TLP处理完之后才能准备好接收下一个TLP。
    m_axis_rx_tdata[9:0] 是代表当前TLP的Length,这个Length表示这个TLP中数据的数量,单位是DW(64bit),m_axis_rx_tdata[9:0]==10’b1这是因为PIO通常一次传输一个DW数据。

PIO_RX_WAIT_STATE 状态是一个等待完成状态,在该状态下,程序先通过tlp_type 和compl_done 两个信号为条件进行判定。
        tlp_type 表示当前TLP的类型,compl_done 表示完成包已经发送完成,由发送引擎反馈给接收引擎。在PIO_RX_MEM_RD32_DW1DW2状态中有的req_compl 、req_compl_wd 和req_addr 三个信号,其中req_addr 信号输入到存储器模块中读取该地址下数据,然后又将数据发送到发送引擎中。req_compl和req_compl_wd这两个信号输入到发送引擎中用以合成完成报文,当合成完成报文并发送之后,发送引擎产生compl_done 信号,表明完成包已经发送完成,该信号输入到接收引擎中,这时表明一个存储器读请求已经完成,所以在PIO_RX_WAIT_STATE 状态中将m_axis_rx_tready信号置1,表明接收引擎准备好可以接收下一个TLP了,状态又跳转到PIO_RX_RST_STATE状态。
       以上完成对PIO_RX_MEM_RD32_FMT_TYPE 这个存储器读请求的分析,总的来说就是在这个TLP中包含req_compl 、req_compl_wd 和req_addr 三个重要信号,req_compl 和req_compl_wd 告诉发送引擎发送一个带数据的完成包;req_addr 信号先传入发送引擎中截取出存储器地址,在传入存储器模块读取这个地址下的数据,返回到发送引擎中作为完成包的数据,这样就完成了存储器读请求TLP的操作。

结论

本次就学习这么多,下次在学习,困了,睡觉。

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

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

相关文章

对新手友好的最简单方便的本地项目关联git远程仓库教程

对新手友好的最简单方便的本地项目关联git远程仓库教程 前置条件1.本地项目2.gitee上创建同名项目 关联操作1.在本地进行clone远程仓库操作2.把本地项目下的目录和文件都复制到这个克隆自git的项目文件夹里面3.查看文件状态和提交文件 在我们创建项目时&#xff0c;一般都是在本…

QAnything-1.4.01.4.1版本更新!使用指北!

久等了各位&#xff01;时隔一个多月&#xff0c;我们在4月26日和5月20日接连发布了v1.4.0和v1.4.1两个版本&#xff0c;带来了问答性能&#xff0c;解析效果等多方面的改进&#xff0c;并新增了大量的新功能和新特性 详见&#xff1a;releases 以及 使用说明 最新特性表 开发…

13-至少有5名直接下属的经理(高频 SQL 50 题基础版)

13-至少有5名直接下属的经理 select name from Employee where id in (select managerId -- 查找大于5的经理idfrom Employeegroup by managerId -- 根据id分组having count(*)>5); -- 根据分组的数据进行求个数

java连接MySQL数据库

环境准备 JDK安装 Navicat MySQL安装 下载jar包 MySQL :: Download MySQL Connector/J (Archived Versions) 创建数据库 1. 打开Navicat 2. 新建数据库 3. 定义数据库名 4. 新建查询 运行如下代码创建表log CREATE TABLE log (user VARCHAR(255) NOT NULL UNIQUE,pwd …

未见过类型题每周总结(个人向)

1.DP40 小红取数 题目 解析 一道01背包的衍生问题&#xff0c;我们可以按照它的思路定义数组dp[i][j],表示前i个数中%k为j的最大和。为什么设置未%k的最大和呢&#xff1f;是因为当两个数分别%k&#xff0c;如a%kx&#xff0c;b%ky。那么&#xff08;ab&#xff09;%k&#…

C++基础与深度解析 | 类进阶 | 运算符重载 | 类的继承 | 虚函数

文章目录 一、运算符重载二、类的继承1.类的继承2.虚函数 一、运算符重载 在C中&#xff0c;operator关键字用于重载运算符&#xff0c;使得类的实例可以使用内置的操作符&#xff08;如、-、*、/等&#xff09;进行操作。 运算符重载的特性&#xff1a; 重载不能发明新的运算…

通信协议:常见的芯片间通信协议

相关阅读 通信协议https://blog.csdn.net/weixin_45791458/category_12452508.html?spm1001.2014.3001.5482 本文将简单介绍一些常见的芯片间通信协议&#xff0c;但不会涉及到协议的具体细节。首先说明&#xff0c;芯片间通信方式根据通信时钟的区别可以分为&#xff1a;异步…

上位机图像处理和嵌入式模块部署(f407 mcu中的网络开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和大家想的不太一样&#xff0c;只要mcu当中带有了mac ip&#xff0c;那么就意味着mcu本身支持了网络开发。但是如果需要mcu支持完整的tcp/ip&…

Java面试题:ArrayList底层实现原理、HashMap的实现原理、HashMap的jdk1.7和jdk1.8有什么区别

文章目录 一、List相关面试题1.1 ArrayList源码分析&#xff08;底层实现&#xff09;1.2 ArrayList底层的实现原理是什么1.3 ArrayList listnew ArrayList(10)中的list扩容几次1.4 如何实现数组和List之间的转换1.5 ArrayList 和 LinkedList 的区别是什么 二、HashMap相关面试…

《最游记》游戏全套源码(源码+引擎+文档+客户端+服务端+工具)

《最游记》首款西游降魔修仙网游—还原《西游记》小说经典&#xff0c;华丽场景&#xff0c;玄幻体验&#xff1b;七十二变&#xff0c;机甲配备&#xff1b;仙兵神器&#xff0c;灵兽助阵&#xff1b;降妖除魔&#xff0c;最游天下&#xff01;源码基于 vs 2005&#xff0c;可…

英伟达GPU架构加速狂飙

NVIDIA首席执行官黄仁勋在台湾大学体育馆发表主题演讲&#xff0c;展示了新一代Rubin架构&#xff0c;这是NVIDIA加速推出新架构的最新成果。 在讨论NVIDIA下一代架构时&#xff0c;黄仁勋提到了Blackwell Ultra GPU&#xff0c;并表示它可能会继续升级。然后他透露&#xff0c…

Qt 【Object::connect: No such slot 。。。】解决方法

发生如下所示问题&#xff0c;有三种原因造成&#xff1a; 1.下图中的Q_OBJECT被注释掉或者漏了&#xff08;该问题不常见&#xff09; 2.下图中声明slots漏了&#xff08;新手较常见&#xff09; 3.发生下面两行中的错误&#xff0c;在下面两行代码中仅仅是一个参数名字的区别…

web刷题记录(2)

[鹤城杯 2021]EasyP 就是php的代码审计 从中可以看出来&#xff0c;就是对四个if语句的绕过&#xff0c;然后过滤了一些语句 代码分析&#xff1a; 通过include utils.php;导入了一个叫做"utils.php"的文件&#xff0c;这意味着在该文件中可能定义了一些与本代码相…

模型训练篇 | yolov10来了!手把手教你如何用yolov10训练自己的数据集(含网络结构 + 模型训练 + 模型推理等)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLOv9还没捂热乎&#xff0c;YOLOv10就推出来了&#xff0c;太卷了&#xff0c;太快了&#xff0c;坐等YOLOv9000&#xff01;自今年2月YOLOv9发布之后&#xff0c; YOLO&#xff08;You Only Look Once&#xff09;系列的…

全域外卖平台是什么?有哪些系统可以推荐?

随着本地生活下半场的开启&#xff0c;以团购外卖为代表的一系列相关业务也迈入了全域时代。在此背景下&#xff0c;全域外卖赛道正式兴起&#xff0c;全域外卖平台也随之备受瞩目。 作为创业的一大新风口&#xff0c;全域外卖囊括了公域和私域内所有的外卖业务&#xff0c;主…

基础篇03——SQL约束

概述 约束示例 完成以下案例&#xff1a; create table user (id int primary key auto_increment comment 主键,name varchar(10) not null unique comment 姓名,age tinyint unsigned check ( age > 0 and age < 120 ) comment 年龄,status char(1) default 1 commen…

嵌入式C语言--Pragma Section与Map文件

嵌入式C语言–Pragma Section与Map文件 嵌入式C语言--Pragma Section与Map文件 嵌入式C语言--Pragma Section与Map文件一. Pragma修饰符二. Map文件1&#xff09;什么是map文件2&#xff09;map文件的构成3&#xff09;常用的段映射地址4&#xff09;map文件生成 三. Section修…

SpaceX: 太空火箭自主精准着陆

本文是根据Lars Blackmore在16年的一篇公开论文翻译而来&#xff0c;虽然有些早而且是科普文章&#xff0c;但是可以初见一些SpaceX火箭着陆的细节&#xff0c;后面我会对spaceX landing control 技术主管MIT博士期间研究火箭控制算法的论文进行讲解&#xff0c;敬请期待。 Lar…

OpenEuler华为欧拉系统安装—从零开始,小白也能学会

介绍 openEuler&#xff08;欧拉&#xff09;是一款开源操作系统。 当前openEuler内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c; 能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、 稳定、安全的开源操作系统&#xff0c;适用于数据库…

JVM运行数据区-Java堆

Java堆 堆区&#xff08;Heap区&#xff09;是JVM运行时数据区占用内存最大的一块区域&#xff0c;每一个JVM进程只存在一个堆区&#xff0c;它在JVM启动时被创建&#xff0c;JVM规范中规定堆区可以是物理上不连续的内存&#xff0c;但必须是逻辑上连续的内存。 1、堆区是线程…