转载:https://zhuanlan.zhihu.com/p/139656925

  • 前言

之前主要都在做FPGA算法层面的东西,最近觉得对于接口方面的知识比较欠缺,打算以PCI-E为例来系统的学习一下接口方面的知识。

  • PCI-E全称PCI Express,是一种高速总线技术。各种PCI-E设备通过PCI-E协议互相连接,形成PCI-E系统,其拓扑结构如下所示:

其中,根联合体是连接CPU,主储存器到PCI-E总线结构的设备,相当于PCI系统中的北桥。FSB为Front Side Bus,是连接CPU与北桥的总线。可以根联合体上延伸出多个PCI-E接口。交换开关也可以引出多个PCI-E端口,从而连接更多的PCI-E端点设备。这里的端点设备也类似于显卡等PCI-E设备,可以是网卡,蓝牙设备,硬盘等。PCI-E-PCI桥保证了PCI设备也能接入PCI-E系统,增加了兼容性。

  • 下面分析PCI-E的传输协议

PCI-E协议规定采用三层分层协议来实现数据的传输,类似于网络通信中的TCP/IP通信协议,如下图所示:

上图展示了PCI-E设备A喝PCI-E设备B的通信协议,其中设备核和设备核接口可以简单的理解为应用层和应用层的接口,我们主要关心的是下面的三层,即事务层(TL层),数据链路层(DL层)和物理层(PL层)。

PCI_E设备之间通过数据包的形式进行传输,因此可以将三层的数据包分别表示为TLP(Transcation Layer package),DLLP和PLP。PCI-E设备发送端首先通过应用层和应用层接口传输TLP对应协议的数据格式给TL层,随后DL层对TLP进行二次打包形成DLLP在传输到PL层,PL层对数据DLLP进行编码后通过模拟信号来进行传输,接收端进行逆向操作得到最后的TLP,并最终解码成应用层需要的数据。


  • TL层为数据添加包头(Header)和ECRC,这里的ECRC表示(End to end CRC),表示事务层的校验CRC编码。一个TLP如图所示:

Header是TLP的核心部分,其大小主要在3DW或4DW(12字节或16字节,96bit or 128bit),以4DW(128bit为例),其DW0~DW3的结构如图所示:

以DW0为例,DW0[9:0]表示数据长度(length),其最大值为1DW*2^10 = 4KB;DW0[13:12]表示数据包的属性,DW0[13] == 1表示使能PCI-X式的宽松排序,DW0[12] == 1表示不要求系统硬件去监控Cache;DW0[22:20]可以设置TC0~TC7四种不同的状态,默认TC0,用于流量控制;DW0[16] TD==1表示TLP包含ECRC;至于DW0[30:29]的Fmt和DW0[28:24]的Type,主要负责配置寄存器的一些读写请求和配置,如下表所示:

除此之外还有很多字段是根据不同的TLP类型而变化的,具体的可以配置TLP可以查询:PCI_Express_Specification这本PDF第二章。

  • DL层介于TL层和PL层,在发送端对TLP进行打包后发送到PL层,接收端则对PL层接包在传输到TL层,一个DL层传输的Package如下图所示:

DL层主要实现了三个功能:数据交换;错误检测/重试;初始化以及电源管理。

在错误检测/重试功能的实现中,DL层通过为TLP添加了Sequence NumberLCRC来实现。需要注意的是,PCI-E 设备B的DL层在接收到对应的Package时需要,返回一个应答包来确认或否定确认,即Ack/Nak DLLP,如下所示:

除此之外,根据不同的用途,DLLP可以分为很多种,大致可以分为四种常用类型,即对TLP的应答包—Ack/Nak DLLP电源管理DLLP流控制DLLP以及厂商自定义DLLP,分别如下所示:

其中,Ack/Nak DLLP中的Ack和Nak分别表示确认Sequcence Number——成功收到一定数量的TLP和否定确认Sequcence Number——来启动重试功能;fig3-6中的FC1表示流控制(Flow Control);fig 3-9中的PM表示Power Management。关于Byte 0[31:24]表示DLLP Type字段,其各个字段的编码以及对应功能如下标所示:

除了上述功能,DL层还提供了数据完整性检查和CRC校验等功能,具体可以参考 PCI_Express_Specification第三章。

  • 发送端PL层将DL层过来的package进行编码并发送,其中涉及逻辑子模块和电气子模块。逻辑子模块将上层的数据处理后送入电气层,在逻辑层对上层传输过来的Package进行的操作主要是添加一个帧头和帧尾:

一个完成的PCI-E发送-接收模型如下图所示:



PCI_E协议的总体介绍到这里就告一段落了,如果以上协议的逻辑部分通过FPGA去纯撸代码实现感觉还是比较困难的,后面有空再去研究一下xilinx 的IP实现。

PCIE基本知识的更多相关文章

  1. 转:PCIe基础知识

    PCIe基础知识   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zqixiao_09/article/details/51842542 PCIe ...

  2. FPGA实战操作(2) -- PCIe总线(协议简述)

    目录 1. PCIe基础知识 2. 事务层协议 2.1 数据包结构 2.2 帧头含义详述 3. 报文举例 3.1 寄存器读报文 3.2 完成报文 4. 机制简述 4.1 Non-Posted和Post ...

  3. PCIE学习链接集合

    <PCIE基础知识+vivado IP core设置> https://blog.csdn.net/eagle217/article/details/81736822 <一步一步开始 ...

  4. 012 PCIe总线的基础知识

    一.PCIe总线的基础知识 与PCI总线不同,PCIe总线使用端到端的连接方式,在一条PCIe链路的两端只能各连接一个设备,这两个设备互为是数据发送端和数据接收端.PCIe总线除了总线链路外,还具有多 ...

  5. 4.1 PCIe总线的基础知识

    与PCI总线不同,PCIe总线使用端到端的连接方式,在一条PCIe链路的两端只能各连接一个设备,这两个设备互为是数据发送端和数据接收端.PCIe总线除了总线链路外,还具有多个层次,发送端发送数据时将通 ...

  6. [转帖]PCI-E的部分知识

    PCI-E PCI-E全称是PCI Express,是新一代的总线接口.采用了目前业内流行的点对点串行连接,比起PCI以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线 ...

  7. PCIe基础篇(一)、基础知识扫盲

    1.PCIe:Peripheral Component interconnect Expess,外围组件接口互联,属于第三代IO总线,PCIe的传输速率指的是实际的有效传输速率,为RAW data(原 ...

  8. PCIe知识摘要记录

    摘: 一. 在PCIe的Spec中,并没有特别详细的关于Root Complex的定义,从实际的角度来讲,可以把Root Complex理解为CPU与PCIe总线系统通信的媒介.Endpoint处于P ...

  9. 第1章 PCI总线的基本知识

    PCI总线作为处理器系统的局部总线,主要目的是为了连接外部设备,而不是作为处理器的系统总线连接Cache和主存储器.但是PCI总线.系统总线和处理器体系结构之间依然存在着紧密的联系. PCI总线作为系 ...

随机推荐

  1. 机器学*——K*邻算法(KNN)

    1 前言 Kjin邻法(k-nearest neighbors,KNN)是一种基本的机器学*方法,采用类似"物以类聚,人以群分"的思想.比如,判断一个人的人品,只需观察他来往最密切 ...

  2. PHP的OpenSSL加密扩展学习(一):对称加密

    我们已经学过不少 PHP 中加密扩展相关的内容了.而今天开始,我们要学习的则是重点中的重点,那就是 OpenSSL 加密扩展的使用.为什么说它是重点中的重点呢?一是 OpenSSL 是目前 PHP 甚 ...

  3. Python中类-带括号与不带括号的区别

    类不带括号我们叫赋值,带括号我们叫实例化. 什么是赋值? a=7 b=a id(7) 140726814208448 id(a) 140726814208448 id(b) 1407268142084 ...

  4. layui 添加复选框checkbox后,无法正确显示及点击的方法

    layui 添加复选框checkbox后,无法正确显示方式,这个是由于html里的样式添加 layui-form后,没有加载 form插件 ,具体如下: <body style="ba ...

  5. css 圆形脉冲动画

    需求: 项目需要在3D场景增加动画按钮,直接添加到场景时 当场景过大的时候 .加载比较麻烦 因在找资料时发现这玩意居然要付费.故做此记录, 效果: 参考: 1.https://www.jiangwei ...

  6. 定要过python二级 真题 第四套

    第一模块  基本操作 1.print("  {  }    " . format(s))         记住        "  {        }"    ...

  7. AT4144-[ARC098D]Donation【Kruskal重构树,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/AT4144 题目大意 \(n\)个点\(m\)条边的一张无向联通图,每个点有两个值\(a_i,b_i\).表示经过该 ...

  8. Unity3D组成

    从宏观的角度来看,分为七个模块: 1.图形模块(Graphics). 2.物理模块(Physics) 3. 音效模块(Audio) 4.动作模块(Animation) 5.导航模块(Navigatio ...

  9. 残差网络resnet理解与pytorch代码实现

    写在前面 ​ 深度残差网络(Deep residual network, ResNet)自提出起,一次次刷新CNN模型在ImageNet中的成绩,解决了CNN模型难训练的问题.何凯明大神的工作令人佩服 ...

  10. 6岁!是时候重新认识下Serverless了

    一.背景 Serverless 概念从2012年开始提出,真正推出相关云产品是2014年AWS推出Lambda.如果我们将 Serverless 比作一个婴儿,那么它已经6岁了. 虽然业界对Serve ...