FPGA开发PCIe

一、PCIe简介

PciE是pci express的简称,是为了解决pci带宽限制而开发的新技术。并行信号由于受信号串扰的影响,带宽做到pcix 64bit位宽x133M基本已经到了瓶颈了,要进一步提高总线带宽一种新技术迫在眉睫,PCIE就是在这种背景下提出的。

pcie发展到今天已经有了三个版本,分别被称为gen1,gen2,gen3即一代,二代,三代。截至目前二代pcie已经在计算机系统中比较广泛的应用了,三代pcie各大厂家都在争相抢占制高点,像plx,xilinx,altera,cypress等都相继推出了gen3的ip或芯片。相信用不了三年,pcie3就会广泛应用与计算机中。

先介绍PCIE的几个基本概念:pcie采用差分方式,每一对差分线分别用于收和发,一到三代的差分线线速率分别为2.5Gbps,5Gbps和8Gbps。实际的传输带宽分别为2Gbps、4Gbps和8Gbps,因为gen1和gen2都采用8B/10B编码,三代采用130B/128B编码。计算机到外设传输方向的通路对计算机来说叫发通路,对设备叫收通路;对于从设备到计算机的数据传输对计算机来说叫收通路,对设备来说叫发通路。没有特殊说明时说的收发都是对所说的设备而言的。另一个概念就是lane,我在这不做任何翻译,就用这个单词,lane是对一对完整通路的总称,一个lane表示一收一发,也就是我们常说的x几,x1就是一个lane,x2就是两个lane,x4,x8,x16依次类推。下面分别从逻辑设计,板卡设计及测试介绍pcie开发的难点和关键点。

首先介绍板卡设计,笔者目前接触到最多的就是基于fpga的pcie设计。对于第一次做pcie板卡的人来说2.5Gbps以上的线速率,板子的走线会让你感觉无从下手,这么高的速率信号完整性问题相当重要,要有很大的的工作量来保证信号完整性问题。但是对于gen1的PCIE的设计来说单板能够保证差分线阻抗为100ohm,线间距最小3倍线宽,信号有完整的回流路径这几点基本就可以了,如果您觉得没有把握,那么可以借助仿真手段。Gen1的背板设计,gen2,gen3的板卡设计建议设计者最好仿真一下。当然我的介绍比较泛泛,如果您正做相关的项目,建议您仔细阅读datesheet,像Xilinx的PCIE开发会有板卡参考设计的原理图,PCB原文件,design guide等一系列全方位的文档支持。

电路板设计完成就要调试了,PCIE调试分PCIE的链路调试、功能调试和稳定性调试。链路调试就是保证设计的电路板可以通,板卡插到计算机上可以找到;功能调试就是调试FPGA中的逻辑功能;稳定性调试只基本功能调试通过后,测试板卡运行的稳定性。这几个部分我会在后面的文章中一一详细介绍。

二、PCIe的链路调试

前面大致介绍了PCIE的FPGA板卡设计的几个问题,下面介绍PCIE的链路调试。

PCIE的链路调试就是通过在FPGA中例化PCIE IP,将板卡插入计算机中看计算机是否可以找到板卡。PCIE的例化可以参考FPGA手册的PCIE Endpoint user mannal,笔者不做详细介绍,只说明几个关键点:

1 选择适合自己的PCIE local bus,Xilinx的PCIE IP支持AXI接口和非AXI接口两类,要根据自己的需要选择合适的接口;

2 为PCIE IP选择合适的参考时钟频率,如果选用主板PCIE插槽上的参考时钟那么就选择100M,如果选用FPGA外接时钟,就可以选择100M和125M两种参考时钟,根据板卡的设计选择好参考时钟,如果参考时钟不对就找不到板卡;其他的配置选择根据自己项目需要,即使有不同只会影响后面的设计,而不会影响到计算机寻找板卡;

3 根据PCIE例化工程中的参考设计写好UCF文件,就可以将设计烧写到FPGA中,进行链路调试了。

链路调试主要有三个方面的问题:第一 链路没有连接上;第二 链路部分连接上,如x4的识别为x2或者x1,x8的识别为x4或者x2或者x1,gen2的链路识别为gen1的等;第三就是链路训练一直在recovery状态。这几种情况出现的话最坏的就是电路板信号完整性问题,那样就需要我们从新设计电路板了,还有就是可能是配置不正确导致的。下面介绍具体的调试方法,至于具体问题的解决方法,需要根据调试确定问题有针对性解决。不做具体的介绍,如果大家遇到上面相关的问题,希望可以提出来大家一起研究,这样大家都会有进步。

三、PCIe DMA设计

下面是本人做项目过程中和同事分享心得所做的一个ppt,拿出来和大家分享,项目需要,屏蔽都项目相关的具体细节,有描述不清之处,希望留言交流。

FPGA开发PCIe_第1张图片
FPGA开发PCIe_第2张图片
FPGA开发PCIe_第3张图片
FPGA开发PCIe_第4张图片
FPGA开发PCIe_第5张图片
FPGA开发PCIe_第6张图片
FPGA开发PCIe_第7张图片
FPGA开发PCIe_第8张图片
FPGA开发PCIe_第9张图片
FPGA开发PCIe_第10张图片

FPGA开发PCIe_第11张图片
FPGA开发PCIe_第12张图片
FPGA开发PCIe_第13张图片
FPGA开发PCIe_第14张图片
FPGA开发PCIe_第15张图片
FPGA开发PCIe_第16张图片
FPGA开发PCIe_第17张图片

设计参考
1 Virtex-6 FPGA Integrated Block for PCI Express  UG517
2 ML605 Hardware User Guide  UG534
3 Bus Master DMA Performance Demonstration Reference Design for the Xilinx Endpoint PCI Express® Solutions  XAPP1052
4 PCI Express base Specification revision1.1,2.0
5 EZDMA2 IP for Xilinx Hard IP Reference Manual   PLDA Inc.
6 Using an IBERT Core with ChipScope Pro Analyzer ug811
7 virtex-6 FPGA GTX transceivers user guide ug366

继续前面的介绍,前面部分的PPT基本将PCIE协议,PCIE DMA以及影响PCIE 数据传输率的几个因素都介绍了,下面给一张图,是一个典型PCIE DMA的结构,本来可以再前一篇中直接写的,但是笔者发现好像文章最多只能放那么多的图片,多了实在发不下了,把这最后一张也是最重要的一张放在最后了。

FPGA开发PCIe_第18张图片

 其中的RX,TX分别为PCIE的发送和接收通道,传输方向是对设备来说的。

RX_Buf TX_Buf为发送接收事务包缓存器;

RX_encoder为对接收到事务包的包解析;

Mrd,Mwr,Cpl分别为对存储器读,存储器写以及完成包的处理;

绿色和粉色为DMA通道产生对桥片的读写请求包;

Msg,ISR为消息报和中断控制,完成中断请求包的产生,以中断处理器(或桥片);

Tx_Arbiter为对需要占用TX总线的完成包,DMA读,写包,消息请求包的总线仲裁;

control模块为多tag请求时的tag管理控制,因为只有发出后回来的tag才能被再次发出。

对于第一次接触PCIE的同仁来说,理解上面的各个关系不是很容易,不理解的地方请参考PCIE标准,实在不理解也可以留言大家一起讨论。

 

你可能感兴趣的:(FPGA,PCI)