(完整版)PCIe总线基础及FPGA设计实战_第1页
(完整版)PCIe总线基础及FPGA设计实战_第2页
(完整版)PCIe总线基础及FPGA设计实战_第3页
(完整版)PCIe总线基础及FPGA设计实战_第4页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PCI Express总线基础及FPGA设计实战1. PCI Express基础PCIe总线是基于 PCI 总线发展起来的,很多基本概念都来自于 PCI总线,有必要在介绍 PCIe 之前了解 PCI总线。1.1 PCI 基础PCI总线作为处理器系统的局部总线,其主要目的是为了连接外部设备,而不是作为处理器系统的系统总线连接Cache 和主存储器。PCI总线作为系统总线的延伸,其设计考虑了许多与处理器相关的内容,孤立的研究 PCI总线并不可取,因此需要将 PCI作为存储器系统的一个部分来研究。1.1.1 几个重要概念1) PCI总线空间与处理器空间隔离PCI设备具有独立的地址空间, 即 PCI总

2、线地址空间, 该空间与存储器地址空间通过 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主桥进行地址转换,而

3、 PCI 设备访问存储器设备,也需要 HOST主桥进行地址转换。HOST主桥的一个重要作用就是将存储器访问的存储器地址转换成PCI总线地址。CPU域地址空间是指CPU所能直接访问的地址空间集合。DRAM 域地址空间是指DRAM 控制器所能访问的地址空间集合,又称为主主存储器域。存储器域是CPU域和 DRAM 域的集合。存储器域包括CPU内部的通用寄存器、存储器映射寻址的寄存器、主存储器空间和外部设备空间。在Intel 的 x86 处理系统中,外部设备空间与 PCI总线域地址空间等效。因为在 x86 处理器系统中,使用 PCI总线同一管理全部外部设备。值得注意的是,存储器域的外部设备空间,在PC

4、I总线域中还有一个地址映射。当处理器访问 PCI设备时,首先访问的是这个设备在存储器域上的PCI设备空间,之后HOST主桥将这个存储器域的 PCI总线地址转换成 PCI 总线域的物理地址,然后通过 PCI 总线事务访问PCI总线域的地址空间。2) 可扩展性PCI总线具有很强的扩展性。在PCI 总线中, HOST主桥可以直接推出一条PCI总线,这条总线也是该 HOST主桥管理的第一条PCI 总线,该总线还可以通过PCI桥扩展一系列 PCI总线,并以 HOST主桥作为根节点,形成1 棵 PCI总线树。这些PCI总线都可以连接PCI设备,但是一棵 PCI设备树上,最多只能挂接256 个 PCI设备(

5、包括 PCI 桥)。3) 动态配置机制PCI设备使用的地址可以根据需要由系统软件动态分配。PCI总线使用这种方式合理地解决设备间的地址冲突,从而实现了“即插即用”功能。每一个PCI设备都有独立的配置空间,在配置空间中包含该设备在PCI总线中使用的基地址即BAR地址,从而保证每一个PCI设备使用的物理地址并不相同。PCI 桥的配置空间中包含有其下PCI子树所能使用的地址范围。x86 系统的工作流程是:主板上的BIOS程序会扫描 PCI/PCIE设备,读取其BAR空间的大小,动态地为 PCI/PCIE设备分配地址空间。 在调试过中发现, 假如将 BAR空间设置成2G,x86 系统会报 no boo

6、table device 的错误,原因应该是 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总线的最高

7、主频为 8.33MHz ,位宽为 32,其峰值带宽为33MB/s ;而 MCA 总线的最高主频为 10MHz ,最高位宽为 32,其峰值带宽为 40MB/s 。 PCI总线提供的峰值带宽远高于这些总线。5) 共享总线机制PCI设备通过仲裁获得PCI总线的使用权后,才能进行数据传送,在PCI总线上进行数据传送,并不需要处理器进行干预。PCI总线仲裁器不在PCI总线规范定义的范围内,也不一定是 HOST主桥和 PCI桥的一部分, 虽然绝大多数HOST主桥和 PCI桥都包含PCI 总线仲裁器,但是在某些处理器系统设计中也可以使用独立的PCI 总线仲裁器。PCI设备使用共享总线方式进行数据传递,在同一

8、条总线上,所有PCI设备共享同一总线带宽,这将极大地影响PCI总线的利用率。 这种机制显然不如PCIe总线采用的交换结构。6) 中断机制PCI总线上的设备可以通过四根中断请求信号 INTAD#向处理器提交中断请求。与 ISA 总线上的设备不同, PCI总线上的设备可以共享这些中断请求信号,不同的 PCI设备可以将这些中断请求信号线与后,与中断控制器的中断请求引脚连接。 PCI设备的配置空间记录了该设备使用这四根中断请求信号的信息。PCI总线还进一步提出了MSI( Message Signal Interrupt )机制,该机制使用存储器写总线事务传递中断请求,并可以使用x86 处理器 FSB(

9、Front Side Bus)总线提供的InterruptMessage 总线事务,从而提高了PCI 设备的中断请求效率。1.1.2 PCI 总线的组成结构。图中与 PCI 总线相关的模块包括:HOST主桥、 PCI总线、 PCI 桥和 PCI 设备。 PCI总线是由 HOST主桥和 PCI桥推出, HOST主桥与主存储器控制器在同一级总线上,因此 PCI 设备可以方便通过HOST主桥访问存储器,即进行DMA 操作。在一些简单的处理器系统中,可能不包含 PCI桥,此时所有PCI设备都是连接再HOST主桥上推出的PCI总线上。在一些处理器系统中有可能有多个HOST主桥,如图1-1 所示处理器系统

10、中含有HOST主桥 x 和 HOST主桥 y。X86 处理器的HOST主桥X86 处理器使用南北桥结构连接CPU和 PCI设备。其中北桥连接快速设备,存条,并推出PCI总线, HOST主桥包含在北桥中。而南桥连接慢速设备。如显卡和内1.2 PCIE 总线概述PCI总线使用并行总线结构,在同一条总线上的所有外部设备共享总线带宽,而 PCIe 总线使用高速查分总线,采用端对端的连接方式,因此在每一条PCIe 链路中只能连接两个设备。这使得PCIe 与 PCI 总线采用的拓扑结构有所不同。PCIe 总线除了在连接方式上与PCI总线不同之外, 还使用一些在网络通信中使用的技术,如支持多种数据路由方式,

11、基于多通路的数据传递方式, 和基于报文的数据传送方式, 并充分考虑在数据传送中出现的服务质量QoS(Quality of Service )问题。1.2.1 基于 PCIe的系统结构前期的 Intel 主板中会集成单独的南北桥芯片,北桥负责连接速度较快的CPU、主存储器以及显卡等元件,南桥负责连接速度较慢的设备,包括硬盘、USB、网卡等。只要CPU读取主存储器,还需要北桥的支持,也就是CPU 与主存储器的交流,会占用北桥的带宽。因此新一代的Intel 主板架构,大多将北桥存储控制器整合到CPU封装中, CPU直接与主存储器交互,速度较快。基于 PCIe 总线的 Intel 处理器架构主存储器的

12、速度SDRAM/DDR型号数据位宽内部时钟频率速度带宽SDRAMPC10064100100800MBytes/secSDRAMPC133641331331064MBytes/secDDRDDR-266641332662.1GBytes/secDDRDDR-400642004003.2GBytes/secDDRDDR2-900642008006.4GBytes/secDDRDDR3-160064200160012.8GBytes/secPCIe总线带宽规格1x 带宽16x 带宽PCIe1.0250Mbytes/sec4GBytes/secPCIe2.0500Mbytes/sec8GBytes/s

13、ecPCIe3.01GBytes/sec16GBytes/secPCIe4.02GBytes/sec32GBytes/secSATA总线带宽版本带宽SATA1.0150Mbytes/secSATA2.0300Mbytes/secSATA3.0600Mbytes/secUSB总线带宽版本带宽USB1.01.5Mbytes/secUSB2.060Mbytes/secUSB3.0500Mbytes/secUSB3.11000Mbytes/sec1.2.2 端到端的数据传递PCI总线不同, PCIe总线采用端到端的连接方式, 在一条 PCIe链路的两端只能各连接一个设备,这两个设备互为数据发送端和数据

14、接收端。在 PCIe 总线的物理链路的一个数据通路( Lane)中,有两组查分信号,共 4 根信号线。其中发送端的 TX 部件与接收端的 RX 部件使用一组差分信号连接,该链路也被称为发送端的发送链路,也是接收端的接收链路;而发送端的RX 部件与接收端TX 部件使用另一组查分信号连接,该链路也被称为发送端的接收链路,也是接收端的发送链路。一个 PCIe 链路可以由多个数据通路Lane 组成,目前PCIe 链路可以支持1、2、 4、 8、16 和 32Lane,即 x1、x2、 x4、 x8、 x16、 x32 宽度的 PCIe链路。PCIe总线物理链路间的数据传送使用基于时钟的同步传送机制,但

15、是在物理链路上并没有时钟线, PCIE总线的接收端含有时钟恢复模块CDR( Clock Data Recovery),CDR将从接收报文中提取接收时钟,从而进行同步数据传递,PCIe设备进行链路训练时将完成时钟的提取工作。1.2.3 PCIe 总线的层次结构PCIe 总线采用串行连接方式,并使用数据包( Packet)进行数据传输。在 PCIe 总线中,数据报文在接收和发送过程中,需要通过多个层次,包括事务层、数据链路层和物理层。PCIe 总线的层次组成结构与网络中的层次结构有类似之处,但 PCIe 总线的各个层次都是用硬件逻辑实现的。在 PCIe 体系结构中,根据报文首先在设备的核心层( D

16、evice Core)中产生,然后再经过该设备的事务层( Transaction Layer)、数据链路层( Data Link Layer)和物理层( Physical Layer),最终发送出去。而接收端的数据也需要经过物理层、数据链路层和事务层,最终到达核心层。1. 事务层事务层定义了PCIe 总线使用总线事务,其中多数总线事务与PCI 总线兼容。这些总线事务可以通过 Switch 等设备传送到其他 PCIe 设备或者 RC设备。 RC设备也可以使用这些总线事务访问 PCIe 设备。事务层接收来自PCIe 设备核心层的数据,并将其封装成TLP( Transaction Layer Pac

17、ket)后,发向数据链路层。此外事务层还可以从数据链路层中接收数据报文,然后转发至PCIe设备的核心层。2. 数据链路层数据链路层保证来自发送端事务层的报文可以可靠、完整地发送到接收端的数据链路层。来自事务层的报文在通过数据链路层时,被添加Sequence Number 前缀和 CRC后缀。数据链路层使用ACK/NAK 协议保证报文的可靠传递。PCIe总线的数据链路层还定义了多种DLLP( Data Link Layer Packet),DLLP产生于数据链路层,终止与数据链路层。3. 物理层物理层是 PCIe 的最底层,将 PCIe 设备连接再一起。 PCIe 总线的物理电气特性决定了PCI

18、e链路只能使用端到端的连接方式。PCIe 总线的物理层为PCIe 设备间的数据通信提供传送介质,为数据提供可靠的物理环境。1.2.3 PCIe体系结构的组成结构PCIe总线作为处理器系统的局部总线,其作用于理器系统中的外部设备。在大多数处理器系统中,都使用PCI 总线类似, 主要目的是为了连接处 RC Switch和 PCIe-to-PCI 桥这些基本模块连接 PCIe 和 PCI 设备。在 PCIe 总线中,基于 PCIe 总线的设备, 也成为 EP( Endpoint )。基于 PCIe 总线的通用处理器系统如下图图中所示的结构将PCIe 总线端口、存储器控制器等一系列与外部设备有关的接口

19、都集成在一起,并统称为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 的

20、AXI Memoy Mapped TO PCI Express、 AXI DMA 等 IP 使用。2.1.1 RC端系统设计RC端硬件系统由 MicroBlaze 处理器、RC(采用 xilinx 的 AXI Memony Mapped To PCI Express 配置成 RC模式)、内存(采用内置 BRAM 块)、常用外设包括 GPIO、串口。地址分配pcie 地址空间mem 地址空间axi_pcie_bar0 axi_mem_00xC000_00000xC000_FFFF0x0600_00000x0600_FFFF2.1.2 EP 端系统设计EP端硬件系统由 MicroBlaze 处理器

21、、EP(采用 xilinx 的 AXI Memony Mapped To PCI Express 配置成 EP模式)、 DMA 以及内置 BRAM 块。地址分配pcie 地址空间axi_pcie_bar00x4000_00000x4000_FFFFmem 地址空间axi_mem_00x0800_00000x0800_FFFF2.2读写数据分析2.2.1 读写 MEM 数据操作地址为RC端 BAR空间存储器域地址+偏移量例如,往EP端偏移量为0x1000 的 MEM 写数据, RC端写地址为0xC000_000+0x10000xC000_000 为 RC端 axi_pcie_bar0 基地址,即

22、 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_00000xC000_10000xFFFF_10000x0000_10000x0800_10002.2.2 DMA 操作DMA 在 EP端,源地址和目的地址为EP端

23、AXI 总线地址RC端存储器域EP端存储器域0x0600_00000x0800_00000x0600_10000x0800_1000读内存0x0800_20000x0600_2000写内存0x0600_30000x0800_30002.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

24、_0=0xEEEE_0000RP_CFG_BAR0=0xEEEE_0000EP_PCIEBAR2AXIBAR0=0x0600_00000x4000_10000xEEEE_10000x0000_10000x0600_10002.2.2.2 写内存写内存将EP端的数据写入RC端的内存。数据流图EP端RC端源地址为 0x0800_1000 , EP端 AXI 总线地址目标地址为0x4000_2000 , RC端存储器域内存地址在EP 端 AXI 总线地址域的映射地址EP端 AXI总线地址域PCIE总线接口RP端PCIE总线域RP端存储器域EP_AXIBAR2PCIEBAR_0=0xEEEE_0000

25、RP_CFG_BAR0=0xEEEE_0000EP_PCIEBAR2AXIBAR0=0x0600_00000x4000_20000xEEEE_20000x0000_20000x0600_20003. 设计实战本章将搭建一个基于PCIe x4 的 EP 端硬件系统,并在安装Windows7 的 x86 电脑上,使用 WinDriver 软件完成驱动开发。3.1 EP 端硬件系统搭建地址分配AXI Memony Mapped To PCI Express参数配置1. 将 Device/Port Type 配置成功PCI Express Endpoint device2. 将 Lane Width

26、配置成 x4,将 Link Speed 配置成 5.0GT/s3. 配置 Vendor ID 和 Device ID,驱动开发时将根据 Vendor ID 和 Device ID 来扫描 PCIe 设备。4. 配置 BAR0的地址空间为128K,配置 C_PCIEBAR2AXIBAR_为0 0x0800_00005. 配置 C_AXIBAR2PCIEBAR_为0 0xFFFF_00003.2上板调试记录1. BAR0 的地址空间分配过大当将 Bar0 空间配置成 2GB 时,WINDOWS7 的 PC机没有启动操作系统, 报错 no bootable device,原因应该是 BIOS需要给

27、BAR0 分配 2G 的地址空间,占用了硬盘的地址空间,导致无法加载操作系统。2. axi_pcie 的 BAR空间或 C_AXIBAR2PCIEBAR0 设置不正确调试时可以使用 windriver工具辅助开发,快速获取pcie设置的配置寄存器的值以及主机为 pcie 设备分配的bar空间大小,假设主机为pcie设备分配的bar 空间为0xF7D000000xF7D1FFFF,总共 128KB(注意 x86处理器系统中存储器域地址和pcie 域地址相等,而 arm 处理器则不一致 ) 。主机为锁定的dma的 物理 地址为0x00000000db361000(pDma-pDma-Page0.p

28、PhysicalAddr),进行 dma 写内存操作时,源地址为EP 端 bram空间的地址, 目标地址位置成主机为锁定的dma的物理地址, 假设 EP端为 axi_pcie 分配的空间为 0x4000_00000x7FFF_FFFF, 0xdb361000 无法顺利达到 axi_pcie的 S_AXI 总线,将EP端的 axi_pcie的地址空间设置成0xC000_00000xFFFF_FFFF时,0xdb361000 可以顺利达到 axi_pcie 的 S_AXI 总线。但如果 C_AXIBAR2PCIEBAR0设置不正确,数据也无法正常返回PC端。假如 EP端的参数配置如下C_AXIBA

29、R_0 = 0xC000_0000C_AXI_HIGHADDR_0 = 0xFFFF_FFFFC_AXIBAR2PCIEBAR0 = 0x4000_0000axi 到 pcie 地址转换如下,pcie 的最终地址为0x5b361000 ,无法返回PC端。为了获取正确 的 pcie 域 地 址 , 需 要 将 C_AXIBAR2PCIEBAR0的 最 高2 比特设置成全1 , 如C_AXIBAR2PCIEBAR0=0xC000_0000、 0xFFFF_0000 都是可行的。C_AXIBAR2PCIEBAR_0=0x4000_0000AXI_WADDR=C_AXIBAR_0=0xdb361000

30、0xC000_0000C_AXI_HIGHADDR_0=0xFFFF_FFFF最终地址0x5b3610003.调试时发下 axi dma 每次最大传输长度为原因是 Width of Buffer Length Register 配置成了限。将 Width of Buffer Length Register 配置成了16KB-1,假如超过 16KB, dma 无法工作。 14bits , 16KB-1=0x3FFF刚好达到 buffer 的上 17bits 后, dma 可以一次传输 64KB 数据。3.3 WINDOWS下驱动开发3.3.1 开发流程WinDriver 是 Jungo 公司提供

31、的一种通用的驱动开发支持软件,它简化了用户的上层驱动开发和应用接口开发,而且易于再封装,实现商业化应用。该软件提供了对 PCI Express 接口设备的驱动支持,而且也提供了对 DMA 实现功能的支持。开发流程及使用的函数如下图所示,使用接口函数可以分成 3 大类: WDC 库相关、设备相关以及 dma 相关。打开 Windriver驱动WDC_DriverOpen()并初始化 WDC库WDC_PciScanDevices()获取 PCIe 设备WDC_PciGetDeviceInfo()WDC_PciDeviceOpen()WDC_DMAContigBufLock()设置 DMAWDC_D

32、MABufUnlock()WDC_WriteAddr32()关闭 PCIe 设备WDC_PciDeviceClose()关闭 WinDriver驱动以及卸载 WDC库WDC_DriverClose()1.WDC 库相关打开 Windriver 驱动并初始化 WDC库DWORD DLLCALLCONV WDC_DriverOpen(WDC_DRV_OPEN_OPTIONS openOptions,constCHAR *sLicense);关闭 Windriver 驱动以及 WDC库DWORD DLLCALLCONV WDC_DriverClose(void);2.设备相关扫描 PCI设备, dw

33、VendorId 为厂商 ID,dwDeviceId为器件 ID,pPciScanResult为扫描到的 PCI 设备。WDC_PciScanDevices(DWORD dwVendorId, DWORD dwDeviceId,WDC_PCI_SCAN_RESULT *pPciScanResult);返回设备信息。DWORD DLLCALLCONV WDC_PciGetDeviceInfo(WD_PCI_CARD_INFO *pDeviceInfo);获取设备句柄。DWORDLLCALLCONVWDC_PciDeviceOpen(WDC_DEVICE_HANDLE*phDev, const WD_PCI_CARD_INFO *pDeviceInfo, const PVOIDpDevCtx, PVOIDreserved, const CHAR*pcKPDriverName, PVOID pKPOpenData)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论