xlinx_pcie_ip 使用笔记

PCIE_ISE_学习笔记

我也是刚学习摸索赛灵思的IP核怎么与理论对应上,也有很多不足之处,欢迎大家与我交流

一.  PCIE概述    

首先需要定位的是什么时候需要用到 PCIe 的问题。(PCIe 是什么这里就不做介绍了,不然冗长的像写论文了。 )翻开电脑(台式机),主板上可以清晰的看到常用的接口,能和外面连接的插槽主要有:USB、 Ethernet、 PCIe、PCI、 SATA/PATA、 Audio、 VGA/DVI/HDMI, UART/并口。其中 Audio、VGA/DVI/HDMI制作专用数据输出, UART/并口的速率摆在那里,不适合高速数据传输,剩下的接口最大吞吐率如下:接口最大速率USB USB2.0 480Mbps, USB3.0 5Gbps(USB2.0 速率的 10 倍)Ethernet 1Gbps PCIe X8 Gen1 双向各 16Gbps, X8 Gen2 双向各 32GbpsPCI 2.112Gbps@66Mhz*32 位 SATA/PATA SATA II 3.0Gbps,SATA III 6.0Gbps 排除协议开销,OS 开销,平常使用中 USB 能达到的速度 USB2.0 一般在 30-40MB;Ethenet 如果用硬件实现较低层次的协议在 70-80MBps; PCI 有 64 位的,但是普通PC 或服务器一般是 32 位的,见过效率发挥的较好的能达到 120MB,但是 PCI 是共享总线的,如果总线有多个设备开销,这个速度就难保证了;SATA/PATA 在 PC 中一般用于存储,用自定义设备的很少见。因此,如果数据量超过100M。  
    PCI-Express(peripheralcomponent interconnect express)是一种高速串行计算机扩展总线标准,它原来的名称为“3GIO”,是由英特尔在2001年提出的,旨在替代旧的PCI,PCI-X和AGP总线标准。PCIe属于高速串行点对点双通道高带宽传输,所连接的设备分配独享通道带宽,不共享总线带宽,主要支持主动电源管理,错误报告,端对端的可靠性传输,热插拔以及服务质量(QOS)等功能。PCIe交由PCI-SIG(PCI特殊兴趣组织)认证发布后才改名为“PCI-Express”,简称“PCI-e”。它的主要优势就是数据传输速率高,目前最高的16X 2.0版本可达到10GB/s,而且还有相当大的发展潜力。PCI Express也有多种规格,从PCI Express x1到PCI Express x32,能满足将来一定时间内出现的低速设备和高速设备的需求。PCI-Express最新的接口是PCIe 3.0接口,其比特率为8Gbps,约为上一代产品带宽的两倍,并且包含发射器和接收器均衡、PLL改善以及时钟数据恢复等一系列重要的新功能,用以改善数据传输和数据保护性能。PCIe闪存卡的供应商包括:INTEL、IBM、LSI、OCZ、三星(计划中)、SanDisk、STEC、SuperTalent和东芝(计划中)等,而针对海量的数据增长使得用户对规模更大、可扩展性更强的系统所应用,PCIe 3.0技术的加入最新的LSI MegaRAID控制器及HBA产品的出色性能,就可以实现更大的系统设计灵活性。当然,主流主板都能能支持PCIExpress 1.0 x16,也有部分较高端的主板支持PCI Express2.0 x16。

二.简介

1.层次结构

PCIe 规范对于设备的设计采用分层的结构,有事务层、数据链路层和物理层组成,各层有都分为发送和接收两功能块。


在设备的发送部分,首先根据来自设备核和应用程序的信息,在事务层形成事务层包(TLP),储存在发送缓冲器里,等待推向下层;在数据链路层,在 TLP 包上再串接一些附加信息,这些信息是对方接收 TLP 包时进行错误检查要用到的;在物理层,对TLP 包进行编码,占用链路中的可用通道,从查封发送器发送出去。事务层包( TLP),数据链路层包(DLLP),物理层( PLP)产生于各自所在层,最后通过电或光等介质和另一方通讯。这其中数据链路层包(DLLP),物理层( PLP)的包平常不需要关心,在 IP 核中封装好了。在 FPGA 上做 PCIe的功能,变成完成事务层包(TLP)处理。

2.bar空间

PCIe 通讯是靠发送 TLP 包,如果再进一步参考了PCIe 更详细的书籍就能发现读写包里都有地址信息。如果板卡向 PC 发送TLP 包,例如 MWr 包,那很好理解,地址信息就是PC 的物理地址(注意这里说的是物理地址);如果是 MRd 包,那 PC 收到后回复一个完成包,板卡从完成包分析出数据即得到 MRd 读取地址的数据。那PC 如何读写板卡的数据呢?简单的解释, PC 启动是, BIOS 探测所有的外设。对 PCIe( PCI)设备来说, BIOS 检测到板卡有多少个 BAR 空间,每个空间有多大,然后对应为这些 BAR 空间分配地址。对 PC 设备来说,它能“看”到 PCIe 板卡的空间只有 BAR 空间,也就只能访问这些 BAR 空间。也就是说,板卡可以发送合法的PCIe TLP 包,并得到 PC 端的相应;但是 PC 端访问板卡被局限在 BAR 空间。

简单来说,PC机想操作PCIE设备的内存空间,只能通过bar空间来进行操作。如下图:PC机只能看见bar空间(忽略地址起始和开始),PCIE核通过检测不同的地址来判断要进行task1还是task2。

3.中断


       无论使用哪种中断类型,用户都可以通过使用cfg_interrupt_n和cfg_interrupt_rdy_n来启动中断请求

 

 

 

 

PCIe 可以发出两种中断,一种是虚拟 INTx 信号线的,一种是MSI 的。过去 PCI 板卡发送中断通过拉低 INTx( INTA#, INTB#,INTC#, INTD#)来申请中断, PC检测到 INTx 的中断,就跳转执行 INTx 对应的中断驱动程序,驱动程序里需要操作板卡将 INTx 拉回去,不然就发生嵌套中断了。用下面两个时序图来解释INTx 中断,收到的数据包内容为 0x3400_0000_0100_0020,0x0000_0000_0000_0000,根据事物协议的章节分析该包,Fmt 为 2’b01,Type 为 5’b10100,是消息请求,Message Code 为 8’b0010_0000,是中断( INTx)消息。根据下图可以看到 received_assert_inta 为1,收到 INTA#

收到INTA#中断后的处理程序需要将INTA#拉高,如下图,收到的数据包内容为0x3400_0000_0100_0024, 0x0000_0000_0000_0000Fmt 2b01 Type 5b10100,是消息请求,Message Code 8b0010_0100,是中断(INTx)撤销消息。下图可以看到received_deassert_inta 1,收到INTA#中断撤销消息。


MSI 是基于消息机制的, PC 启动后为PCIe 板卡分配一个或多个消息地址,板卡发送中断只需要向对应的地址内发送消息即可。消息内容中包含消息号,每个消息号对应在PC 端的某一地址。

对比两种方式, INTx 是模拟 PCI 上中断线,MSI 是基于消息机制的。具体更细节的内容可以参考文献。需要注意的是, WindowsXP 是不支持 MSI 的,到了 WinNT 和Win7 才支持。Xilinx 的 PCIe 支持 INTx 和多达 256条的 MSI 消息。有人担心了,组织这些中断包发送,那设计会不会很复杂?在 Xilinx 的平台上,中断和其他包是分开的,中断发送是非常简单的,并不需要用到 LocalLink的 TX 接口,只需要简单操作几条信号线就可以实现,具体可参考对应 PCIe Core 的手册,例如 V6 就可以参考 UG517。中断只需要操作 5 条信号线,PCIe核就可以自己组织需要的中断包向外发送。

 

 三.TLP包报文(大端传输)

FPGA实现需要的 PCIe 功能,简单的说是在完成 TLP的处理。 TLP 有三部分组成,帧头、数据、摘要(或者称 ECRC)。TLP 头标长 3 或者 4个 DW,格式和内容随事物类型变化;数据端为 TLP 帧头定义下的数据段,如果该TLP 不携带数据,那该段为空。 Digest段( Optional)是基于头标、数据字段计算出来的 CRC,成为 ECRC,一般 Digest 段有 IP核填充。所以, PCIe 的处理在用户层表现为处理 TLP。

LENGTH:是以双字DW为单位。

TLP 头标长 3DW( Double Word, 32bit)或者 4DW,格式和内容虽事物类型变化。上图示出了头标的通用字段,Fmt 是关于头标长度和该TLP 是否有数据载荷的信息: 00=3DW 头标,无数据; 01=4DW头标,无数据; 10=3DW,有数据; 11=4DW 有数据。Type 的 5 位编码与Fmt 字段一起用于规定事物类型、头标长度和是否有数据载荷。如下表所示:


有两种类型的配置空间,Type0和Type1,分别对应非桥设备(Endpoint)和桥设备(Root和Switch端口中的P2P桥)。

Type0还是Type1是由事务层包(TLP)包头中的Type Field所决定的,而读还是写则是由TLP包头中的Format Field所决定的。分别以下两张图所示:



PCIe中只有Root才可以发起配置空间读写请求,并且我们知道Root的每个端口中都包含有一个P2P桥。当Root发起配置空间读写请求时,相应的桥首先检查请求的BDF中的Bus号是否与自己的下一级总线号(Secondary Bus Number)相等,如果相等,则先将Type1转换为Type0,然后发给下一级(即Endpoint)。

如果不相等,但是在自己的下一级总线号(Secondary Bus Number)和最后一级总线号(SubordinateBus Number)之间,则直接将Type1型请求发送给下一级。如果还是不相等,则该桥认为这一请求和自己没什么关系,则忽略该请求。

注:Root最先发送的配置请求一定是Type1型的。

非桥设备(Endpoint)会直接忽略Type1型的配置请求。

一个简单的例子如下图所示:

 

Posted和Non-Posted传送方式

PCI总线规定了两类数据传送方式,分别是Posted和Non-Posted数据传送方式。其中使用Posted数据传送方式的总线事务也被称为Posted总线事务;而使用Non-Posted数据传送方式的总线事务也被称为Non-Posted总线事务。

其中Posted总线事务指PCI主设备向PCI目标设备进行数据传递时,当数据到达PCI桥后,即由PCI桥接管来自上游总线的总线事务,并将其转发到下游总线。采用这种数据传送方式,在数据还没有到达最终的目的地之前,PCI总线就可以结束当前总线事务,从而在一定程度上解决了PCI总线的拥塞。

而Non-Posted总线事务是指PCI主设备向PCI目标设备进行数据传递时,数据必须到达最终目的地之后,才能结束当前总线事务的一种数据传递方式。

显然采用Posted传送方式,当这个Posted总线事务通过某条PCI总线后,就可以释放PCI总线的资源;而采用Non-Posted传送方式,PCI总线在没有结束当前总线事务时必须等待。这种等待将严重阻塞当前PCI总线上的其他数据传送,因此PCI总线使用Delayed总线事务处理Non-Posted数据请求,使用Delayed总线事务可以相对缓解PCI总线的拥塞。

为了提高Non-Posted总线事务的执行效率,PCI-X 总线将PCI 总线使用的Delayed 总线事务,升级为Split 总线事务。采用Split 总线事务可以有效解决HOST/PCI桥的这些重试操作。Split 总线事务的基本思想是发送端首先将Non-Posted 总线请求发送给接收端,然后再由接收端主动地将数据传递给发送端。

Posted:存储器写/

Non-posted:存储器读、IO读写请求、读写完成TLP

 

四.ISE_PCIE_core_配置
1.选择bar空间

 

BAR空间解释:FPGA检测bar空间控制地址总线的地址号选择完成不同的任务,假设FPGA有9个led灯,当FPGA检测到收到的数据来自地址线0x100----0x500,那么FPGA收到数据后就用来点亮LED灯1---8,然后再收到数据来自bar2,FPGA将收到的数据用于控制LED灯。

 

 

 

2. 配置设备,FPGA作为PC机插槽的一块板卡,因此要配置它的信息

 

3.设置负载:

 

 

PCIE_CORE里有个一次性最多放多大的有效载荷,带星星的就是配置里面最大载荷的大小。

 

 

 

点击next会出现配置终端interrupt是实体的中断,MSI中断是报文类型的中断

 

4.配置XX 选默认

 

 

5.配置时钟 TL TC

 

 

解释1

 

 

解释2和解释3:

PCIE硬核在FPGA需要与收发器相连,一共有两个,在一个坐标系中,GTP0的坐标为X0Y0,GTX1的坐标为X1Y1。但是每个收发器又有两个通道上图圈3是选择和哪个通道相连。


五.VIVADO_PCIE_配置

1.基础设置:

①一般FPGA都作为端点设备

②选择收发器

 

 

 

③选择X数

④选择axi交互user时钟

⑤选择axi交互位宽

⑥配置输入参考时钟

 

2.配置厂商ID等,可以默认

 

3.配置Bar空间

 

 


4.配置buffer大小

5.配置中断类型

 

6.其余可以默认

 

 

六.ISE_PCIE_core PIO模式收发

PIO模式:CPU直接与IP核相连:


1. 收时序图

 

用户可以通过Trn_rdst_rdy_n拉高来暂停接收

 

 

 

通过将trn_rnp_ok_n拉高 (无效)反复重传

 

 

Trn_rerrfwd_n有效表示这一包数据中毒啦

 

 

表示此数据来自哪个bar空间

 


信号解释:

Trn_rsof_n:表示开始

Trn_reof_n:表示最后一个数据

Trn_rsrc_rdy_n:表示PC机准备好

Trn_rdst_rdy_n:FPGA输入表示FPGA已经准备好

Trn_rsrc_dsc_n:表示PC与办卡之间链路是ok的

 

 

2.发时序图

 

信号解释:

Trn_tsof_n:发送的开始

Trn_teof_n:发送的结束

Trn_tsrc_rdy_n:FPGA准备好

Trn_tdst_rdy_n:PC机准备好

Trn_tsrc_dsc_n:链路是ok的

Trn_terr_drop_n:传输错误

3. rx_moudle

4.  tx_moudle

用到的TLP报文:


七.ISE_PCIE_core DMA模式收发

DMA模式:CPU与PCIE设备通过桥接器相连,一次发送多包数据之后通过中断触发。



猜你喜欢

转载自blog.csdn.net/fzhykx/article/details/80702170