PCIe总线基础及FPGA设计实战.docx

上传人:b****4 文档编号:11609649 上传时间:2023-03-28 格式:DOCX 页数:22 大小:1.84MB
下载 相关 举报
PCIe总线基础及FPGA设计实战.docx_第1页
第1页 / 共22页
PCIe总线基础及FPGA设计实战.docx_第2页
第2页 / 共22页
PCIe总线基础及FPGA设计实战.docx_第3页
第3页 / 共22页
PCIe总线基础及FPGA设计实战.docx_第4页
第4页 / 共22页
PCIe总线基础及FPGA设计实战.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

PCIe总线基础及FPGA设计实战.docx

《PCIe总线基础及FPGA设计实战.docx》由会员分享,可在线阅读,更多相关《PCIe总线基础及FPGA设计实战.docx(22页珍藏版)》请在冰豆网上搜索。

PCIe总线基础及FPGA设计实战.docx

PCIe总线基础及FPGA设计实战

PCIExpress总线基础及FPGA设计实战

1.PCIExpress基础

PCIe总线是基于PCI总线发展起来的,很多基本概念都来自于PCI总线,有必要在介绍PCIe之前了解PCI总线。

PCI基础

PCI总线作为处理器系统的局部总线,其主要目的是为了连接外部设备,而不是作为处理器系统的系统总线连接Cache和主存储器。

PCI总线作为系统总线的延伸,其设计考虑了许多与处理器相关的内容,孤立的研究PCI总线并不可取,因此需要将PCI作为存储器系统的一个部分来研究。

几个重要概念

1)PCI总线空间与处理器空间隔离

PCI设备具有独立的地址空间,即PCI总线地址空间,该空间与存储器地址空间通过HOST主桥隔离。

处理器需要通过HOST主桥才能访问PCI设备,而PCI设备需要通过HOST主桥才能方位主存储器。

要注意区分存储器地址空间和PCI总线地址。

在一个处理器系统中,存储器域、PCI总线域与HOST主桥的关系如下图。

图中的处理器系统由一个CPU、一个DRAM控制器和两个HOST主桥组成。

在这个处理器系统中,包含CPU域、DRAM域、存储器域和PCI总线域地址空间。

其中HOST主桥x和HOST主桥y分别管理PCI总线x域与PCI总线y域。

CPU访问PCI设备,必须通过HOST主桥进行地址转换,而PCI设备访问存储器设备,也需要HOST主桥进行地址转换。

HOST主桥的一个重要作用就是将存储器访问的存储器地址转换成PCI总线地址。

CPU域地址空间是指CPU所能直接访问的地址空间集合。

DRAM域地址空间是指DRAM控制器所能访问的地址空间集合,又称为主主存储器域。

存储器域是CPU域和DRAM域的集合。

存储器域包括CPU内部的通用寄存器、存储器映射寻址的寄存器、主存储器空间和外部设备空间。

在Intel的x86处理系统中,外部设备空间与PCI总线域地址空间等效。

因为在x86处理器系统中,使用PCI总线同一管理全部外部设备。

值得注意的是,存储器域的外部设备空间,在PCI总线域中还有一个地址映射。

当处理器访问PCI设备时,首先访问的是这个设备在存储器域上的PCI设备空间,之后HOST主桥将这个存储器域的PCI总线地址转换成PCI总线域的物理地址,然后通过PCI总线事务访问PCI总线域的地址空间。

2)可扩展性

PCI总线具有很强的扩展性。

在PCI总线中,HOST主桥可以直接推出一条PCI总线,这条总线也是该HOST主桥管理的第一条PCI总线,该总线还可以通过PCI桥扩展一系列PCI总线,并以HOST主桥作为根节点,形成1棵PCI总线树。

这些PCI总线都可以连接PCI设备,但是一棵PCI设备树上,最多只能挂接256个PCI设备(包括PCI桥)。

3)动态配置机制

PCI设备使用的地址可以根据需要由系统软件动态分配。

PCI总线使用这种方式合理地解决设备间的地址冲突,从而实现了“即插即用”功能。

每一个PCI设备都有独立的配置空间,在配置空间中包含该设备在PCI总线中使用的基地址即BAR地址,从而保证每一个PCI设备使用的物理地址并不相同。

PCI桥的配置空间中包含有其下PCI子树所能使用的地址范围。

x86系统的工作流程是:

主板上的BIOS程序会扫描PCI/PCIE设备,读取其BAR空间的大小,动态地为PCI/PCIE设备分配地址空间。

在调试过中发现,假如将BAR空间设置成2G,x86系统会报nobootabledevice的错误,原因应该是BIOS给PCIE设备分配了2G的地址空间,暂用了硬盘的地址空间,导致无法加载操作系统。

4)总线带宽

PCI总线与之前的局部总线相比,极大提高了数据传送带宽,32位/33MHz的PCI总线可以提供132MB/s的峰值带宽,而64位/66MHz的PCI总线可以提供的峰值带宽为532MB/s。

虽然PCI总线所能提供的峰值带宽远不能和PCIe总线相比,但是与之前的局部总线ISA、EISA和MCA总线相比,仍然具有极大的优势。

ISA总线的最高主频为8MHz,位宽为16,其峰值带宽为16MB/s;EISA总线的最高主频为,位宽为32,其峰值带宽为33MB/s;而MCA总线的最高主频为10MHz,最高位宽为32,其峰值带宽为40MB/s。

PCI总线提供的峰值带宽远高于这些总线。

5)共享总线机制

PCI设备通过仲裁获得PCI总线的使用权后,才能进行数据传送,在PCI总线上进行数据传送,并不需要处理器进行干预。

PCI总线仲裁器不在PCI总线规范定义的范围内,也不一定是HOST主桥和PCI桥的一部分,虽然绝大多数HOST主桥和PCI桥都包含PCI总线仲裁器,但是在某些处理器系统设计中也可以使用独立的PCI总线仲裁器。

PCI设备使用共享总线方式进行数据传递,在同一条总线上,所有PCI设备共享同一总线带宽,这将极大地影响PCI总线的利用率。

这种机制显然不如PCIe总线采用的交换结构。

6)中断机制

PCI总线上的设备可以通过四根中断请求信号INTA~D#向处理器提交中断请求。

与ISA总线上的设备不同,PCI总线上的设备可以共享这些中断请求信号,不同的PCI设备可以将这些中断请求信号线与后,与中断控制器的中断请求引脚连接。

PCI设备的配置空间记录了该设备使用这四根中断请求信号的信息。

PCI总线还进一步提出了MSI(MessageSignalInterrupt)机制,该机制使用存储器写总线事务传递中断请求,并可以使用x86处理器FSB(FrontSideBus)总线提供的InterruptMessage总线事务,从而提高了PCI设备的中断请求效率。

PCI总线的组成结构。

图中与PCI总线相关的模块包括:

HOST主桥、PCI总线、PCI桥和PCI设备。

PCI总线是由HOST主桥和PCI桥推出,HOST主桥与主存储器控制器在同一级总线上,因此PCI设备可以方便通过HOST主桥访问存储器,即进行DMA操作。

在一些简单的处理器系统中,可能不包含PCI桥,此时所有PCI设备都是连接再HOST主桥上推出的PCI总线上。

在一些处理器系统中有可能有多个HOST主桥,如图1-1所示处理器系统中含有HOST主桥x和HOST主桥y。

X86处理器的HOST主桥

X86处理器使用南北桥结构连接CPU和PCI设备。

其中北桥连接快速设备,如显卡和内存条,并推出PCI总线,HOST主桥包含在北桥中。

而南桥连接慢速设备。

PCIE总线概述

PCI总线使用并行总线结构,在同一条总线上的所有外部设备共享总线带宽,而PCIe总线使用高速查分总线,采用端对端的连接方式,因此在每一条PCIe链路中只能连接两个设备。

这使得PCIe与PCI总线采用的拓扑结构有所不同。

PCIe总线除了在连接方式上与PCI总线不同之外,还使用一些在网络通信中使用的技术,如支持多种数据路由方式,基于多通路的数据传递方式,和基于报文的数据传送方式,并充分考虑在数据传送中出现的服务质量QoS(QualityofService)问题。

基于PCIe的系统结构

前期的Intel主板中会集成单独的南北桥芯片,北桥负责连接速度较快的CPU、主存储器以及显卡等元件,南桥负责连接速度较慢的设备,包括硬盘、USB、网卡等。

只要CPU读取主存储器,还需要北桥的支持,也就是CPU与主存储器的交流,会占用北桥的带宽。

因此新一代的Intel主板架构,大多将北桥存储控制器整合到CPU封装中,CPU直接与主存储器交互,速度较快。

基于PCIe总线的Intel处理器架构

主存储器的速度

SDRAM/DDR

型号

数据位宽

内部时钟

频率速度

带宽

SDRAM

PC100

64

100

100

800MBytes/sec

SDRAM

PC133

64

133

133

1064MBytes/sec

DDR

DDR-266

64

133

266

sec

DDR

DDR-400

64

200

400

sec

DDR

DDR2-900

64

200

800

sec

DDR

DDR3-1600

64

200

1600

sec

PCIe总线带宽

规格

1x带宽

16x带宽

250Mbytes/sec

4GBytes/sec

500Mbytes/sec

8GBytes/sec

~1GBytes/sec

16GBytes/sec

~2GBytes/sec

32GBytes/sec

SATA总线带宽

版本

带宽

150Mbytes/sec

300Mbytes/sec

600Mbytes/sec

USB总线带宽

版本

带宽

sec

60Mbytes/sec

500Mbytes/sec

1000Mbytes/sec

端到端的数据传递

PCI总线不同,PCIe总线采用端到端的连接方式,在一条PCIe链路的两端只能各连接一个设备,这两个设备互为数据发送端和数据接收端。

在PCIe总线的物理链路的一个数据通路(Lane)中,有两组查分信号,共4根信号线。

其中发送端的TX部件与接收端的RX部件使用一组差分信号连接,该链路也被称为发送端的发送链路,也是接收端的接收链路;而发送端的RX部件与接收端TX部件使用另一组查分信号连接,该链路也被称为发送端的接收链路,也是接收端的发送链路。

一个PCIe链路可以由多个数据通路Lane组成,目前PCIe链路可以支持1、2、4、8、16和32Lane,即x1、x2、x4、x8、x16、x32宽度的PCIe链路。

PCIe总线物理链路间的数据传送使用基于时钟的同步传送机制,但是在物理链路上并没有时钟线,PCIE总线的接收端含有时钟恢复模块CDR(ClockDataRecovery),CDR将从接收报文中提取接收时钟,从而进行同步数据传递,PCIe设备进行链路训练时将完成时钟的提取工作。

PCIe总线的层次结构

PCIe总线采用串行连接方式,并使用数据包(Packet)进行数据传输。

在PCIe总线中,数据报文在接收和发送过程中,需要通过多个层次,包括事务层、数据链路层和物理层。

PCIe总线的层次组成结构与网络中的层次结构有类似之处,但PCIe总线的各个层次都是用硬件逻辑实现的。

在PCIe体系结构中,根据报文首先在设备的核心层(DeviceCore)中产生,然后再经过该设备的事务层(TransactionLayer)、数据链路层(DataLinkLayer)和物理层(PhysicalLayer),最终发送出去。

而接收端的数据也需要经过物理层、数据链路层和事务层,最终到达核心层。

1.事务层

事务层定义了PCIe总线使用总线事务,其中多数总线事务与PCI总线兼容。

这些总线事务可以通过Switch等设备传送到其他PCIe设备或者RC设备。

RC设备也可以使用这些总线事务访问PCIe设备。

事务层接收来自PCIe设备核心层的数据,并将其封装成TLP(TransactionLayerPacket)后,发向数据链路层。

此外事务层还可以从数据链路层中接收数据报文,然后转发至PCIe设备的核心层。

2.数据链路层

数据链路层保证来自发送端事务层的报文可以可靠、完整地发送到接收端的数据链路层。

来自事务层的报文在通过数据链路层时,被添加SequenceNumber前缀和CRC后缀。

数据链路层使用ACK/NAK协议保证报文的可靠传递。

PCIe总线的数据链路层还定义了多种DLLP(DataLinkLayerPacket),DLLP产生于数据链路层,终止与数据链路层。

3.物理层

物理层是PCIe的最底层,将PCIe设备连接再一起。

PCIe总线的物理电气特性决定了PCIe链路只能使用端到端的连接方式。

PCIe总线的物理层为PCIe设备间的数据通信提供传送介质,为数据提供可靠的物理环境。

PCIe体系结构的组成结构

PCIe总线作为处理器系统的局部总线,其作用于PCI总线类似,主要目的是为了连接处理器系统中的外部设备。

在大多数处理器系统中,都使用RCSwitch和PCIe-to-PCI桥这些基本模块连接PCIe和PCI设备。

在PCIe总线中,基于PCIe总线的设备,也成为EP(Endpoint)。

基于PCIe总线的通用处理器系统如下图

图中所示的结构将PCIe总线端口、存储器控制器等一系列与外部设备有关的接口都集成在一起,并统称为RC。

RC具有一个或者多个PCIe端口,可以连接各类PCIe设备。

PCIe设备包括(网卡、显卡等设备)、Switch和PCIe桥。

PCIe总线采取端到端的连接方式,每一个PCIe端口只能连接一个EP,当然PCIe端口也可以连接Switch进行链路扩展。

通过Switch扩展出的PCIe链路可以继续挂接EP或者其它Switch。

2.基于FPGA的PCIe总线分析

硬件系统设计

本章将采用xilinx的FPGA芯片搭建一个RC端和EP端的硬件平台,用于仿真学习PCIe总线相关的知识包括DMA操作、地址映射等,以及xilinx的AXIMemoyMappedTOPCIExpress、AXIDMA等IP使用。

RC端系统设计

RC端硬件系统由MicroBlaze处理器、RC(采用xilinx的AXIMemonyMappedToPCIExpress配置成RC模式)、内存(采用内置BRAM块)、常用外设包括GPIO、串口。

地址分配

pcie地址空间axi_pcie_bar00xC000_0000~0xC000_FFFF

mem地址空间axi_mem_00x0600_0000~0x0600_FFFF

EP端系统设计

EP端硬件系统由MicroBlaze处理器、EP(采用xilinx的AXIMemonyMappedToPCIExpress配置成EP模式)、DMA以及内置BRAM块。

地址分配

pcie地址空间axi_pcie_bar00x4000_0000~0x4000_FFFF

mem地址空间axi_mem_00x0800_0000~0x0800_FFFF

读写数据分析

读写MEM数据

操作地址为RC端BAR空间存储器域地址+偏移量

例如,往EP端偏移量为0x1000的MEM写数据,RC端写地址为0xC000_000+0x1000

0xC000_000为RC端axi_pcie_bar0基地址,即EP端PCIe域基地址映射到RC端存储器地址域的基地址。

将RC端存储器域地址0xC000_1000,转换成EP端AXI地址0x0800_1000,最终写入到EP端MEM。

DMA操作

DMA在EP端,源地址和目的地址为EP端AXI总线地址

读内存

读内存指将RC端的内存的数据搬移到EP端MEM。

数据流图如下

RC端

EP端

源地址为0x4000_1000,RC端存储器域地址在EP端AXI总线域的映射地址

目标地址为0x0800_2000,EP端AXI总线域地址

写内存

写内存将EP端的数据写入RC端的内存。

数据流图

EP端

RC端

源地址为0x0800_1000,EP端AXI总线地址

目标地址为0x4000_2000,RC端存储器域内存地址在EP端AXI总线地址域的映射地址

3.设计实战

本章将搭建一个基于PCIex4的EP端硬件系统,并在安装Windows7的x86电脑上,使用WinDriver软件完成驱动开发。

EP端硬件系统搭建

地址分配

AXIMemonyMappedToPCIExpress参数配置

1.将Device/PortType配置成功PCIExpressEndpointdevice

2.将LaneWidth配置成x4,将LinkSpeed配置成s

3.配置VendorID和DeviceID,驱动开发时将根据VendorID和DeviceID来扫描PCIe设备。

4.配置BAR0的地址空间为128K,配置C_PCIEBAR2AXIBAR_0为0x0800_0000

5.配置C_AXIBAR2PCIEBAR_0为0xFFFF_0000

上板调试记录

1.BAR0的地址空间分配过大

当将Bar0空间配置成2GB时,WINDOWS7的PC机没有启动操作系统,报错nobootabledevice,原因应该是BIOS需要给BAR0分配2G的地址空间,占用了硬盘的地址空间,导致无法加载操作系统。

2.axi_pcie的BAR空间或C_AXIBAR2PCIEBAR0设置不正确

调试时可以使用windriver工具辅助开发,快速获取pcie设置的配置寄存器的值以及主机为pcie设备分配的bar空间大小,假设主机为pcie设备分配的bar空间为0xF7D00000~0xF7D1FFFF,总共128KB(注意x86处理器系统中存储器域地址和pcie域地址相等,而arm处理器则不一致)。

主机为锁定的dma的物理地址为0x00000000db361000(pDma->pDma->Page[0].pPhysicalAddr),进行dma写内存操作时,源地址为EP端bram空间的地址,目标地址位置成主机为锁定的dma的物理地址,假设EP端为axi_pcie分配的空间为0x4000_0000~0x7FFF_FFFF,0xdb361000无法顺利达到axi_pcie的S_AXI总线,将EP端的axi_pcie的地址空间设置成0xC000_0000~0xFFFF_FFFF时,0xdb361000可以顺利达到axi_pcie的S_AXI总线。

但如果C_AXIBAR2PCIEBAR0设置不正确,数据也无法正常返回PC端。

假如EP端的参数配置如下

C_AXIBAR_0=0xC000_0000

C_AXI_HIGHADDR_0=0xFFFF_FFFF

C_AXIBAR2PCIEBAR0=0x4000_0000

axi到pcie地址转换如下,pcie的最终地址为0x5b361000,无法返回PC端。

为了获取正确的pcie域地址,需要将C_AXIBAR2PCIEBAR0的最高2比特设置成全1,如C_AXIBAR2PCIEBAR0=0xC000_0000、0xFFFF_0000都是可行的。

 

3.调试时发下axidma每次最大传输长度为16KB-1,假如超过16KB,dma无法工作。

原因是WidthofBufferLengthRegister配置成了14bits,16KB-1=0x3FFF刚好达到buffer的上限。

将WidthofBufferLengthRegister配置成了17bits后,dma可以一次传输64KB数据。

WINDOWS下驱动开发

开发流程

WinDriver是Jungo公司提供的一种通用的驱动开发支持软件,它简化了用户的上层驱动开发和应用接口开发,而且易于再封装,实现商业化应用。

该软件提供了对PCIExpress接口设备的驱动支持,而且也提供了对DMA实现功能的支持。

开发流程及使用的函数如下图所示,使用接口函数可以分成3大类:

WDC库相关、设备相关以及dma相关。

库相关

打开Windriver驱动并初始化WDC库

DWORDDLLCALLCONVWDC_DriverOpen(WDC_DRV_OPEN_OPTIONSopenOptions,constCHAR*sLicense);

关闭Windriver驱动以及WDC库

DWORDDLLCALLCONVWDC_DriverClose(void);

2.设备相关

扫描PCI设备,dwVendorId为厂商ID,dwDeviceId为器件ID,pPciScanResult为扫描到的PCI设备。

WDC_PciScanDevices(DWORDdwVendorId,DWORDdwDeviceId,WDC_PCI_SCAN_RESULT*pPciScanResult);

返回设备信息。

DWORDDLLCALLCONVWDC_PciGetDeviceInfo(WD_PCI_CARD_INFO*pDeviceInfo);

获取设备句柄。

DWORDDLLCALLCONVWDC_PciDeviceOpen(WDC_DEVICE_HANDLE*phDev,constWD_PCI_CARD_INFO*pDeviceInfo,constPVOIDpDevCtx,PVOIDreserved,constCHAR*pcKPDriverName,PVOIDpKPOpenData);

关闭设备句柄

DWORDDLLCALLCONVWDC_PciDeviceClose(WDC_DEVICE_HANDLEhDev);

相关

WinDriver提供了两种DMA缓冲区的分配方式,即连续缓冲区和分散/聚合缓冲区。

前者当用户申请缓冲区时,分配的是一个物理地址连续的内存块;而后者分配的缓冲区在物理位置上可以是分段的,这些物理上不连续的内存段通过虚拟地址空间映射给用户的是一个在应用层连续的缓冲区。

分配一块连续物理空间的内存

DWORDDLLCALLCONVWDC_DMAContigBufLock(WDC_DEVICE_HANDLEhDev,PVOID*ppBuf,DWORDdwOptions,DWORDdwDMABufSize,WD_DMA**ppDma);

分配非连续物理空间的内存段

DWORDDLLCALLCONVWDC_DMASGBufLock(WDC_DEVICE_HANDLEhDev,PVOIDpBuf,DWORDdwOptions,DWORDdwDMABufSize,WD_DMA**ppDma);

释放DMA缓存区

DWORDDLLCALLCONVWDC_DMABufUnlock(WD_DMA*pDma);

AXIDMA的SimpleDMA模式的配置流程如下,具体参见pg021。

DirectRegisterMode(ScatterGatherEngineisdisabled)providesaconfigurationfordoingsimpleDMAtransfersonMM2SandS2MMchannelsthatrequireslessFPGAresourceutilization.TransfersareinitiatedbyaccessingtheDMACR,theSourceorDestinationAddressandtheLengthregisters.Whenthetransferiscompleted,aassertsfortheassociatedchannelandifenabledgeneratesaninterruptout.

速度测试

方向

数据量

耗时

速度

读内存

64KB

401us

159MByte/sec

写内存

64KB

66us

969M

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1