完整版PCIe总线基础及FPGA设计实战docxWord格式.docx
《完整版PCIe总线基础及FPGA设计实战docxWord格式.docx》由会员分享,可在线阅读,更多相关《完整版PCIe总线基础及FPGA设计实战docxWord格式.docx(21页珍藏版)》请在冰豆网上搜索。
将这个存储器域的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总线的最高主频
为8.33MHz,位宽为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)总线提供的Interrupt
Message总线事务,从而提高了PCI设备的中断请求效率。
1.1.2PCI总线的组成结构。
图中与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主桥包含在北桥中。
而南桥连接慢速设备。
如显卡和内
1.2PCIE总线概述
PCI总线使用并行总线结构,在同一条总线上的所有外部设备共享总线带宽,而PCIe总
线使用高速查分总线,采用端对端的连接方式,因此在每一条PCIe链路中只能连接两个设
备。
这使得PCIe与PCI总线采用的拓扑结构有所不同。
PCIe总线除了在连接方式上与PCI
总线不同之外,还使用一些在网络通信中使用的技术,如支持多种数据路由方式,基于多通
路的数据传递方式,和基于报文的数据传送方式,并充分考虑在数据传送中出现的服务质量QoS(QualityofService)问题。
1.2.1基于PCIe的系统结构
前期的Intel主板中会集成单独的南北桥芯片,北桥负责连接速度较快的CPU、主存储
器以及显卡等元件,南桥负责连接速度较慢的设备,包括硬盘、USB、网卡等。
只要CPU读
取主存储器,还需要北桥的支持,也就是CPU与主存储器的交流,会占用北桥的带宽。
因
此新一代的Intel主板架构,大多将北桥存储控制器整合到CPU封装中,CPU直接与主存储
器交互,速度较快。
基于PCIe总线的Intel处理器架构
主存储器的速度
SDRAM/DDR
型号
数据位宽
内部时钟
频率速度
带宽
SDRAM
PC100
64
100
800MBytes/sec
PC133
133
1064MBytes/sec
DDR
DDR-266
266
2.1GBytes/sec
DDR-400
200
400
3.2GBytes/sec
DDR2-900
800
6.4GBytes/sec
DDR3-1600
1600
12.8GBytes/sec
PCIe总线带宽
规格
1x带宽
16x带宽
PCIe1.0
250Mbytes/sec
4GBytes/sec
PCIe2.0
500Mbytes/sec
8GBytes/sec
PCIe3.0
~1GBytes/sec
16GBytes/sec
PCIe4.0
~2GBytes/sec
32GBytes/sec
SATA总线带宽
版本
SATA1.0
150Mbytes/sec
SATA2.0
300Mbytes/sec
SATA3.0
600Mbytes/sec
USB总线带宽
版本带宽
USB1.01.5Mbytes/sec
USB2.060Mbytes/sec
USB3.0500Mbytes/sec
USB3.11000Mbytes/sec
1.2.2端到端的数据传递
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设备进行链路训练时将完成时钟的提取
工作。
1.2.3PCIe总线的层次结构
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设备间的数据通信提供传送介
质,为数据提供可靠的物理环境。
1.2.3PCIe体系结构的组成结构
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总线分析
2.1硬件系统设计
本章将采用xilinx的FPGA芯片搭建一个RC端和EP端的硬件平台,用于仿真学习PCIe
总线相关的知识包括DMA操作、地址映射等,以及xilinx的AXIMemoyMappedTOPCIExpress、AXIDMA等IP使用。
2.1.1RC端系统设计
RC端硬件系统由MicroBlaze处理器、RC(采用xilinx的AXIMemonyMappedToPCIExpress配置成RC模式)、内存(采用内置BRAM块)、常用外设包括GPIO、串口。
地址分配
pcie地址空间
mem地址空间
axi_pcie_bar0axi_mem_0
0xC000_0000~0xC000_FFFF
0x0600_0000~0x0600_FFFF
2.1.2EP端系统设计
EP端硬件系统由MicroBlaze处理器、EP(采用xilinx的AXIMemonyMappedToPCIExpress配置成EP模式)、DMA以及内置BRAM块。
pcie地址空间axi_pcie_bar00x4000_0000~0x4000_FFFF
mem地址空间axi_mem_00x0800_0000~0x0800_FFFF
2.2读写数据分析
2.2.1读写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。
RC端存储器域PCIE总线接口EP端PCIe总线域EP端AXI总线地址域
RC_AXIBAR2PCIEBAR_0=0xFFFF_0000EP_CFG_BAR0=0xFFFF_0000EP_PCIEBAR2AXIBAR0=0x0800_0000
0xC000_10000xFFFF_10000x0000_10000x0800_1000
2.2.2DMA操作
DMA在EP端,源地址和目的地址为
EP端AXI总线地址
RC端存储器域
EP端存储器域
0x0600_0000
0x0800_0000
0x0600_1000
0x0800_1000
读内存
0x0800_2000
0x0600_2000
写内存
0x0600_3000
0x0800_3000
2.2.2.1读内存
读内存指将RC端的内存的数据搬移到EP端MEM。
数据流图如下RC端
EP端
源地址为0x4000_1000,RC端存储器域地址在EP端AXI总线域的映射地址目标地址为0x0800_2000,EP端AXI总线域地址
EP端AXI总线地址域
PCIe总线接口
RP端PCIe总线域
RP端存储器域
EP_AXIBAR2PCIEBAR_0=0xEEEE_0000
RP_CFG_BAR0=0xEEEE_0000
EP_PCIEBAR2AXIBAR0=0x0600_0000
0x4000_1000
0xEEEE_1000
0x0000_1000
2.2.2.2写内存
写内存将EP端的数据写入RC端的内存。
数据流图
RC端
源地址为0x0800_1000,EP端AXI总线地址
目标地址为0x4000_2000,RC端存储器域内存地址在EP端AXI总线地址域的映射地址
EP端AXI总线地址域PCIE总线接口RP端PCIE总线域RP端存储器域
EP_AXIBAR2PCIEBAR_0=0xEEEE_0000RP_CFG_BAR0=0xEEEE_0000EP_PCIEBAR2AXIBAR0=0x0600_0000
0x4000_20000xEEEE_20000x0000_20000x0600_2000
3.设计实战
本章将搭建一个基于PCIex4的EP端硬件系统,并在安装Windows7的x86电脑上,使
用WinDriver软件完成驱动开发。
3.1EP端硬件系统搭建
AXIMemonyMappedToPCIExpress参数配置
1.将Device/PortType配置成功PCIExpressEndpointdevice
2.将LaneWidth配置成x4,将LinkSpeed配置成5.0GT/s
3.配置VendorID和DeviceID,驱动开发时将根据VendorID和DeviceID来扫描PCIe设备。
4.配置BAR0的地址空间为128K,配置C_PCIEBAR2AXIBAR_为00x0800_0000
5.配置C_AXIBAR2PCIEBAR_为00xFFFF_0000
3.2上板调试记录
1.BAR0的地址空间分配过大
当将Bar0空间配置成2GB时,WINDOWS7的PC机没有启动操作系统,报错nobootabledevice,原因应该是BIOS需要给BAR0分配2G的地址空间,占用了硬盘的地址空间,导致
无法加载操作系统。
2.axi_pcie的BAR空间或C_AXIBAR2PCIEBAR0设置不正确
调试时可以使用windriver
工具辅助开发,快速获取
pcie
设置的配置寄存器的值以及
主机为pcie设备分配的
bar
空间大小,假设主机为
设备分配的
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,如