一、概述
1. pcie总线是相对复杂的总线,需要设计硬件、驱动、软件API等才能真正调试运行起来,并且要保证稳定的运行,这样是费事费力的,所以开源框框架-Riffa(Reusable Integration Framework for FPGA Accelerators)框架诞生,他包含了RTL代码开源、驱动代码开源、API设计参考开源,本设计就以Riffa框架为基础进行开发。
2. 本设计使用上位机软件截屏视频流发送给PCIE板卡并且通过HDMI output显示。

二、PCIE基础知识
2.1 pcie简介
1. PCI Express 是用来互联网计算机和外围设备的高速接口总线;
2. PCIe的两个设备之间可以实现点对点的通信串行总线,如果是多台设备需要通过交换器(Switch)进行互联;互联中可实现单通道或多通道的数据传输;
3. pcie的 endpoint 为从设备;root complex为主设备;一般情况下为主从互换,当从与从之间进行互换的时候需要经过主设备;
4. 是基于数据包的传输协议;
5. 全双工通信
2.2 pcie拓扑结构

1. 根端口(root complex):①连接CPU 和存储器以及pcie结构的设备;
②支持一个或多个pcie端口;
③CPU和根端口之间的连接称为前端总线。
2.交换 :①根据地址、ID或隐含路由数据包;
②只要一个向上的链路;
③支持Type1配置空间(也可用于bridge):由根端口进行配置,板卡上电时进行扫描,即主机biox启动的时候,看pcie的插槽里面哪些位置是被使用,然后分配ID(由device ID、function ID、Bus ID组成);
3. 端点设备(endpoint):①支持Type0配置空间(用于配置endpoint;由根复合体发起,配置预定义的PCI系统端点设备头部区域;设备号/ID号;BAR);
②可被主板连接或者挂载;
③显卡、网卡等功能卡。
2.3 pcie配置空间
1. BAR(base address register):①上位机只能看到pcie板卡bar设置的一块空间,而pcie板卡可以看到上位机所有空间;
② 作用:用来做计算机与主板的通信,如果是32bit地址,每个bar都是32bit(一共有6个bar);如果是64bit地址,则有3个bar空间(0-1、2-3、4-5);
③ bar空间的含义:主机在给主板发data的时候,必须往bar里面填表示空间大小的数,bar在申请IP核时,要填写相应 的空间,这个空间在biox启动的时候 会向内存申请与bar里面填充的 相同大小的空间,将来上位机程序往该内存填数的时候,会自动生成TLP包,传给主板,主板解析。
④ 通过bar传递数据都是慢数据,一般用于传递一些控制、地址、简单数据等,实际需要大量数据传递时候,使用DMA传递。
2.4 TLP包类型


在本设计中,我重点掌握应用层,其他层已经集成到代码里面了,了解即可。
2.5 数据包路由 :地址路由、ID 路由、隐含式路由。
①端点设备的地址路由:端点设备检查TLP包中的地址与BAR中所有地址进行比较,如果不属于本端点范围,则拒绝。
②端点设备的ID路由:端点设备检查TLP包里的 总线 ID 、设备 ID 和功能ID是否与本端点一致,这些信息在Type0的配置信息里可以捕获。
2.5中断类型:
①真正的pcie设备:必须使用MSI(memory write)发送中断,
②传统的端点设备:必须支持MSI,可以选择性地支持INTx消息;
③pcie到pci(X)桥:必须支持INTx消息。

三、 Riffa框架

四、pcie的TLP 包
4.1 整体包结构概述
1. TLP包由pcie的endpoint或root complex发送;
2. 只包含两种包头长度:3DW和4DW(一个DW4个byte)。
4.2 包头结构通用字段

1. 图4-1中R为保留字段,必须填充0;
2. Fmt和Type字段含义如图4-2所示;

3. 交换等级(Traffic Class,TC):TLP包交换过程中的优先级,数值越大越优先处理;
4. 属性(Attr):①共3bit,第18位的Attr是pcie2.1规范定义的,表示是否开启ID-base ordering的排序方式,通过bus、device、function ID来控制排序;
②其余两位:Attr[1]为乱序、强序设置,1为乱序。强序有很好的报文解析和反馈顺序,但会影响效率,一个完成再一个。乱序,即使请求先到,但是内存还未被释放,这样可以让后来的请求到内存被释放的空间访问。Attr[0]为是否通过cache一致性处理,少量数据可以提高效率,大量数据没有用,使用可关闭。
5. TH(tlp TPH):pcie2.1提出。xilinx7系列的IP不支持。
6. TD(TLP Digest):1表示TLP层必须加ECRC。
7.EP(endpoint poisoned):错包标志,1为此TLP包被忽略。
8. At(address type):默认00表示不需要地址转换;10表示转换地址请求;11表示地址转换完成。
9. length字段:用于Mwr、Cpl、Msg包,表示DW的数量。第一个包不能跨越4KByte寻址边界,起始地址和结束地址必须不能超过4k边界。
10. first/ last byte enable:用来解决请求数据长度不是DW的整数倍的时候使用。
4.3 Memory write TLP包

1. request id:来源于RC,分为bus[7:0](最大扇出256)、device[4:0](每个bus最多32个device)、function[2:0](每个device最多8个function)三部分。
2. TAG扩展标识:请求方产生,保证唯一性,用来识别应答信息。
4.4 Memory read TLP包

1. 由图4-4可以看出,Mrd包(non-posted事物)和Mwr(posted事物)包没很大的差别,但是他需要一个独立的反馈事物来反馈数据。
4.5 completion/completion with data TLP包

1. completer ID:表示由谁反馈的数据,可用于debug;
2. requester ID:表示谁发起的数据请求,可从Mrd包中复制此ID;
3. completion status:000表示成功响应,001表示不支持此请求,010表示配置请求请重试,100表示请求被忽略;
4. Tag :从Mrd请求包中复制此字段;
5. byte count:表示剩余未反馈的数据(为当前包要传递的数据量加还未反馈的数据量)。
6. lower address:表示第一个有效字节的地址的低7位。注意:lower address 和 length不能跨越RC(root complex)的RCB(read completion boundary)读完成包的边界,但是可以是RCB的整数倍。
7. MPS(max payload size):是系统最大可承载byte的数量,系统的MPS会取所有MPS的最小值。
8. 一般在分包数量是,先根据RCB,发送一定数量的data将地址凑到RCB的整数倍,然后每个包的数据量根据MPS 来确定。
五、总结
了解了pcie的基础知识和riffa框架后,我们下一步就要使用pcie IP core和riffa框架来搭建工程了。