基于FPGA的PCIE接口设计

更新时间:2024-04-16 05:42:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

毕业设计(论文)

题 目: 基于FPGA的PCIE接口设计

学 院: 信息与通信工程学院

专 业: 电子信息工程

学生姓名: 班级/学号

指导老师/督导老师:

起止时间: 200 年 月 日 至 200 年 月 日

摘要

摘 要

在过去的二十几年中,PCI总线在许多领域中得到了广泛的应用,但是随着微处理器、存储器和互连网络的飞速发展,并行数据传输的PCI总线技术逐渐成为系统整体性能提升的瓶颈。从上世纪90年代初期,PCI总线技术至今已经在业内存在了十余年,在这些年中,它的发展是缓慢的,与PC总线相比,每三年会提升一倍的性能,从最初的8位PC/XT、16位ISA总线、32位的EISA和MCA、VL总线到PCI、64位PCI-/66MHZ、PCI-X,但是处理器每18个月性能就会提升一倍(一个摩尔周期是18个月),正因为PC总线和处理器的性能发展不同步,才导致PC总线的发展出现了滞后,PCI总线技术跟不上发展的潮流,出现了瓶颈。PCI-Express(简称PCIE)总线的出现,颠覆了传统,完全的改变了原本的PCI总线的并行技术,PCIE采用的是新型的串行点对点技术,改善了PCI总线传输速度,以及系统带宽方面的本质缺陷,PCIE总线的提出,解决了PCI总线的存在的不足之处,PCIE总线将发展成为取代PCI总线的新型数据总线,而且可以实现更加全面的性能,以更多的功能,更加全面的可扩展性和更加低廉的成本,并且可编程逻辑技术,在当前电子设计领域中已经成为最具有活力和发展前景的技术,通过采用FPGA技术,对通信卡的PCI接口,外部逻辑电路进行集成,并利用目前通用计算机强大的数字信息处理功能,节省了硬件成本,提高系统可靠性和可扩展性,结合XLINX LX335型号FPGA的PCIE Express接口高速数据传输,研究了在一般情况下编写PCIE设备驱动程序时所面临的尖锐问题和解决方法,重点涉及到了驱动程序和硬件接口,以及应用程序等几个方便进行阐述,使用ISE,WinDriver开发工具,实现具有简单DMA数据传输和链式DMA传输功能的驱动程序的有效方法。

关键词:PCIE ;ISE;FPGA;

I

Abstract

Abstract

In the past 20 years, PCI bus has been widely used in many fields, but as the rapid development of microprocessor, memory, and interconnection network, parallel data transmission PCI bus technology has gradually become the bottleneck of overall system performance improvements. From the early 1990 s, PCI bus technology has existed for more than ten years in the industry, in these years, its development is slow Comparing with PC bus. Every three years doubled the performance, from the original 8-bit PC/XT, 16-bit ISA bus, 32-bit EISA and MCA and VL bus to PCI and PCI - 64/66 MHZ, PCI - X, but the processor performance would be doubled every 18 months (a mole period is 18 months). The PC bus and processor performance development are not synchronized that contribute to the development of PC bus lag, PCI bus technology can't keep up with the development of the trend, then the bottleneck appeared. The appearance of PCI Express (PCIE) bus subvert the tradition, completely changed the original parallel technology of PCI bus, PCIE used a new type of serial peer-to-peer technology, improved the PCI bus transmission speed, and the natural defects in the system bandwidth. PCIE bus also solved the exist deficiency of the PCI bus. PCIE bus will become a new type of data bus instead of the PCI bus, and can achieve a more comprehensive performance, with more features, more comprehensive scalability and low cost, and can programme logic technology, which has become the most dynamic and prospecting development in the current electronic design field. By using FPGA technology, the communication card of PCI interface, external logic circuit integration, and the general computer powerful digital information processing functions, PCLe bus saved hardware cost and improved the system reliability and scalability, combining XLINX LX335 type FPGA PCIE Express interface high speed data transmission, studied the problems and solutions when in the general case writing PCIE device driver, mainly involves driver and hardware interface, and elaborates the application and so on.Using the ISE, WinDriver development tools to implement effective methods of simple DMA data transmission and chain DMA trans.

Keywords:PCIE;ISE; FPGA;

II

目录

目录

摘要(中文) ............................................................... Ⅰ

(英文) ............................................................... Ⅱ

第一章绪论 ................................................................. 1

1.1 PCIE-总线概述 ....................................................... 1 1.2课题研究北京及意义 .................................................. 2 1.3 论文研究的主要内容与意义 ............................................ 2

第二章基于FPGA的 PCI-E高速接口设计 .................................... 4

2.1系统总线设计 ........................................................ 4 2.2 FPGA内置PCIE硬核 .................................................. 5

第三章设备驱动的程序 ...................................................... 8

3.1选择开发工具 ........................................................ 8 3.2使用WinDriver设计驱动 .............................................. 8 3.3 驱动核心代码 ....................................................... 11

第四章FPGA 流程 .......................................................... 15

4.1 PCIE部分与外围接口定义 ............................................ 15 4.2 内部的中断和工作流程图 ............................................. 18 4.3ChipScope板上调试时序图 ............................................ 19

第五章基于中断方式的DMA传输设计 ....................................... 23

5.1 界面设计 ........................................................... 23 5.2 性能测试 ........................................................... 23

第六章总结与发展 ......................................................... 26 结束语 .................................................................... 28 参考文献 .................................................................. 29

III

基于FPGA的PCIE接口设计

第一章 绪论

1.1 PCI-E总线概述

PCI-Express是目前最新一代的接口和总线标准,它原本被命名为“3GIO”,是Intel公司在2001年最先提出,并肩负了下一代接口和总线标准的代表。之后便交给PCI-SIG(PCI特殊兴趣组织)研究认证并且发布后,从新命名为“PCI-Express”,全新一代的接口和总线标准取代了现行的PCI和AGP,统一了现行各种总线的标准。PCI-E是分组的串行链接协议,高速串行点对点双通道高带宽传输,他的优势是数据传输速率高,目前最高可达到10GB/s,而且发展潜力强大,由于采用高速串行点对点双通道高带宽传输,链接的设备可分配独享通道带宽,不需要向整个总线请求带宽,可以将数据传输速率提升很高的频率,达到PCI不能提供的高带宽,PCIE也有很多种规格,从PCI Express 1X到PCI Express 16X,可以满足不同设备的需求。PCIE最新的接口是PCIE 3.0接口,其比特率为8GB/s,约为上一代产品带宽的两倍,当然也还有PCIE 2.0以及PCIE(即1.0版本),除了带宽翻倍带来的数据吞吐量大幅提高之外,PCI-E 3.0的信号速度更快,相应地数据传输的延迟也会更低。与PCI并行总线相比,PCIE总线具有以下特点:

1)PCIE是串行总线,可以进行点对点传输,而且每个传输通道独享带宽。

2)PCI Express总线支持双向传输模式和数据分通道传输模式。PCI—E还有多种不同速度的接口模式,这包括了1X、2X、4X、8X、16X以及更高速的32X。PCIE1.1版本单个链路的单向吞吐量能达到250 MB/s。双向传输的速度带宽更能够达到500MB/s

3)PCI Express总线充分利用先进的点到点互连、基于交换的技术、基于包的协议来实现新的总线性能和特征。电源管理、服务质量(QoS)、热插拔支持、数据完整性、错误处理机制等也是PCI Express总线所支持的高级特征。

4)与PCI总线良好的继承性,可以保持软件的继承和可靠性。PCI Express总线关键的PCI特征,比如应用模型、存储结构、软件接口等与传统PCI总线保持一致,但是并行的PCI总线被一种具有高度扩展性的、完全串行的总线所替代。

5) PCI Express总线充分利用先进的点到点互连,降低了系统硬件平台设计的复杂性和难度,从而大大降低了系统的开发制造设计成本,极大地提高系统的性价比和稳定性。系统总线带宽提高同时,减少了硬件PIN的数量,硬件的成本直接下降由于PCIE总线硬件设计简单,它没有大量的数据和控制线,对于硬件电路设计者来说,省去了很多硬件设计工作。而且PCIE吞吐量大,软件向下兼容,只要找到合适的总线接口芯片,很容易将现有的PCI总线设备升级为PCIExpress设备。

PCI Express架构如图1所示,即PCI Express的层次体系结构,他保持了与PCI寻址模式的兼容性,从而保证了所有现有的应用程序和驱动操作无需改变。它总共分为四层,从下到上分别为:物理层(Physica Layer)、数据链路层(Link Layer)、处理层(Transaction Layer)和软件层(Software Layer)。图中的“S/W”和“Config/OS”均属于软件层。

1

[2]

[2][1]

基于FPGA的PCIE接口设计

7

基于FPGA的PCIE接口设计

第三章 设备驱动的程序

3.1选择开发工具

在毕业设计过程中,如何高效稳定的开发出可靠地驱动程序,在开发工具的选择上尤为重要,经过多方了解,最终我选择了Jungo公司的WinDriver软件作为这次毕设的开发工具,使用这个软件,可以更加快速的开发PCI和PCIE驱动程序,而且利用WinDriver开发不需要牵涉到很低层的东西即可在很短的时间里编出驱动程序,不需要熟悉操作系统的Kernel层或DDK及任何驱动程式,WinDriver可以让操作者在用户状态下, 利用使用者模式来开发出所需的驱动程序,而且驱动程序的运行效率也得到了保障。经过多方的试验,已经成功的案例,使用WinDriver开发驱动程序,可以满足高数据率的传输。

在使用Windriver开发的过程中,我觉得效率问题应该是最重要的,从毕设的过程中可以看出,WinDriver生成驱动的代码效率十分的高,

3.2 使用WinDriver设计驱动 3.2.1 WinDriver操作步骤

(1)双击WinDriver图标,就可以打开软件了,打开软件后可以看到WinDriver的初始界面,如3.1图所示样子的对话框。在使用软件的过程中,如果要新建一个应用,只需要点击左侧的New host driver project按钮,就可以新建一个驱动项目了。如果你已经有了一个项目,只需要点击对话框中右侧的按钮Open anexisting project打开已经建立好的项目。如果用户已经打开了软件,在这个状态下如果新建一个项目,这个时候可以通过单击对话框左侧的按钮同样也会出现如3.1图所示的画面。

图3.1

(2)如果我们想新建一个主机驱动程序,那需要点击对话框左侧的按钮,接下来就可以看到如3.2图所示的对话框,在对话框左边可以选择要开发的设备驱动类型。左侧的列表中会出现当前电脑中安装的所有设备驱动类型,如果将设备连接到电脑上,左侧还会显示已经连接到电脑但是需要安装驱动程序的设备所需要的驱动类型。所以在使用WinDriver软件开

8

基于FPGA的PCIE接口设计

发前,需要将设备先连接到电脑上,这样软件才可以识别设备。

图3.2

(3)如果把开发板插在PCIE插槽上,计算机状态栏中会显示发现新设备的标示。 (4)然后计算机会弹出如3.3图所示的界面,界面会提示用户使用新硬件安装向导为设备逐步安装驱动程序。因为计算机中没有合适的驱动程序,所以直接选择取消即可。然后计算机会弹出发现新硬件的设备的提示,并提示硬件安装过程中出现一个问题,您的新硬件

可能无法正常运行,不需要理会这个弹窗,直接下一步即可。

图3.3

(5)双击WinDriver的图标打开软件或者回到刚才已经打开的软件界面??择左面的New host driver project图标按钮??以看到如下图所示的画面了。注意??倒数第三行的位置??们看到出现了“”一项??击选中此行??以看到如3.4图的画面。在Device Description栏中出现了对此设备的描述信息。

9

基于FPGA的PCIE接口设计

图3.4

(6)选择对话框右上角的Generate .INF File按钮??弹出图3.5所示对话框。用户可以在Device name一栏中输入自定义的设备名称??他内容不用更改。单击Next按钮会出现提示保存的对话框如图3.6所示,默认状态下会保存在WinDriver目录下??户也可以更改保存位置,但是一定要记住这个文件的保存位置,因为在后面安装设备驱动程序时会用到的。在文件名一栏内输入一个名字??击保存就可以了。

图3.5

10

基于FPGA的PCIE接口设计

图3.6

(7)单击保存后,界面出现保存的信息。等待几秒钟整个软件画面会切换到图3.7所示。可以看到WinDriver已经与USB设备建立了连接关系。此时用户可以对设备进行测试。

图3.7

3.3 驱动核心代码

//功能:32位存储器写操作 //参数:

11

基于FPGA的PCIE接口设计

// BarNum BAR空间编号 // OffSet 偏移地址 // Data 32位数据 //返回值:

// (0) 成功 // (1) 失败

UINT PCIEDriver::AddWrite32(DWORD BarNum, DWORD OffSet, UINT32 Data) {

DWORD dwStatus;

dwStatus=WDC_WriteAddr32(DHandle, BarNum, OffSet, Data); if (WD_STATUS_SUCCESS != dwStatus) } return 0; }

//功能:32位存储器读操作 //参数:

// BarNum BAR空间编号 // OffSet 偏移地址

// Data 32位数据存储地址指针 //返回值:

// (0) 成功 // (1) 失败

UINT PCIEDriver::AddRead32(DWORD BarNum, DWORD OffSet, UINT32* Data) {

DWORD dwStatus; }

12

{

return 1;

dwStatus=WDC_ReadAddr32(DHandle, BarNum, OffSet, Data); if (WD_STATUS_SUCCESS != dwStatus) { } return 0;

return 1;

基于FPGA的PCIE接口设计

//功能:打开DMA //参数:

// ppBuf PC端接收数据缓存地址 // BytesCount 字节数 //返回值:

// (0) 成功

// (1) DMA句柄打开失败 // (2) 锁定DMA内存失败 // (3) DMA已打开

UINT16 PCIEDriver::DmaOpen(PVOID *ppBuf,DWORDBytesCount) { DWORD dwStatus; if (DmaFlag==TRUE) { return 3;

}

dwStatus=WDC_DMAContigBufLock(this->DHandle, DMA_TO_FROM_DEVICE|DMA_KERNEL_BUFFER_ALLOC, BytesCount,

&pDma);

if (WD_STATUS_SUCCESS != dwStatus)

{ return 2; }

DmaFlag=TRUE; return 0;

}

//功能:关闭DMA //返回值:

// (0) 成功 // (1) 释放DMA失败 // (2) DMA没有被打开 // (3) DMA没有被打开 UINT16 PCIEDriver::DmaClose(void) {

DWORD dwStatus;

if (DmaFlag==FALSE)

13

ppBuf,

基于FPGA的PCIE接口设计

{ } if (pDma) { dwStatus = WDC_DMABufUnlock(pDma); if (WD_STATUS_SUCCESS != dwStatus) return 3;

{ return 1; }

} else {

return 2; }

pDma=NULL; DmaFlag=FALSE; return 0;

}

14

基于FPGA的PCIE接口设计

第四章FPGA的流程

4.1 PCIE部分与外围接口定义

4.1.1概述

本设计使用的芯片是Virtex6的LX130T。 PCIE接口协议基于x8模式,使用的Integrated Block for PCI Express。

PCIE模块主要完成信号处理计算机与FPGA信号处理板之间的通信,主要包括三种的工作模式:

(1)参数下发模式:由信号处理计算机向FPGA下发雷达工作所需要的各项参数,包括波控模块参数、频率跟踪模块参数,时序控制模块参数,DDC模块参数,脉压模块参数等

(2)参数上传模式:由FPGA板向信号处理计算机上传的参数,主要用于计算机回读雷达此时的工作状态以及安排下一次下发的参数

(3)数据传输模式:主要是FPGA将处理完成的数据传给信号处理计算机,以完成目标的检测和显示等雷达的功能 4.1.2模块结构

Pciepcie_rx_doutpcie_rx_rdcmdpcie_int_okpcie_int_modepcie_dma_wrapperpcie_endpointBAR0控制寄存器双端口RAMPC机datadataBAR1数据寄存器data_vld

4.1.3接口信号与数据格式

15

基于FPGA的PCIE接口设计

PCIE_RST_NENBPCIE_EXP_TXPPCIE_EXP_RXPPCIE_EXP_RXNPCIE_EXP_TXNPCIE_USR_CLKPCIE_EXP_TXPPCIE_FIFO_RSTPCIE_EXP_TXNPCIE_RX_RDPCIE_SYS_CLK_PInst_pciePCIE_RX_DATA_OK_NUMPCIE_SYS_CLK_NCMDPCIE_RX_DOUTCMD_VLDPCIE_RX_AEMPDATAPCIE_RX_EMPDATA_VLDCONFIG_DONEPCIE_INT_OKPCIE_INT_MODEDATA_ADDR

4.1.4接口信号定义与说明

(1) 信号名称、方向和数据位宽

? PCIE_RST_N 模块输入 1位 ? PCIE_EXP_RXP 模块输入 8位 ? PCIE_EXP_RXN 模块输入 8位 ? PCIE_EXP_TXP 模块输出 8位 ? PCIE_EXP_TXN 模块输出 8位 ? PCIE_SYS_CLK_P 模块输入 1位 ? PCIE_SYS_CLK_N 模块输入 1位 ? PCIE_USR_CLK 模块输出 1位 ? PCIE_FIFO_RST 模块输出 1位 ? PCIE_RX_DOUT 模块输入 64位 ? PCIE_RX_RD 模块输出 1位 ? DATA 模块输出 36位 ? DATA_VLD 模块输出 1位 ? DATA_ADDR 模块输出 6位 ? ENB 模块输出 4位 ? PCIE_INT_OK 模块输入 1位 ? PCIE_INT_MODE 模块输入 3位 ? DATA_IN 模块输入 36位 ? DATA_INVLD 模块输入 1位

16

基于FPGA的PCIE接口设计

(2) 主要接口功能说明

? PCIE_USR_CLK PCIE模块的工作时钟 250MHz

? PCIE_FIFO_RST 由上位机控制的PCIE光纤卡的所有缓冲区复位 ? PCIE_RX_DOUT 上传给PC端上位机的处理过的数据 ? PCIE_RX_RD 数据缓冲区的读使能 ? DATA由上位机下发的参数

? DATA_VLD 下发参数有效信号

? DATA_ADDR 下发参数的地址,供RAM的写地址 ? ENB 双端口RAM写使能 ? PCIE_INT_OK 中断信号 ? PCIE_INT_MODE 中断信号模式说明 ? DATA_IN 上传参数 ? DATA_INVLD 上传参数有效位

4.1.5数据结构协议说明

(1)参数数据结构与存储说明

参数数据的基本结构:下发参数的数据位数为36位,其中的高4位为数据校验位,后32位为真正的参数数据。数据由PCIE传到FPGA板子上使用双端口RAM作为数据的缓存。

帧头:4bit 全为0或者全为1 总字节数: 32bit

(2)下发参数与双端口RAM的工作流程

使用双口RAM的B口,下发参数连接DIB,DATA_ADDR连接ADDRB,DATA_VLD连接ENB,当有参数下发时,ENB会置高并开始在RAM里写入数据

此时DOB会有数据输出,监测DOB的高4位,起始状态高4位为全0,当监测到高4位全变为1时说明数据写完可以读取了,此时ENB置低,同时ENA置高从而从DOA读出的数据即为下发的参数数据。

(3)上传参数与双端口RAM的工作流程

使用双口RAM的A口,上传参数连接DIA,地址线连接ADDRA,上传参数有效信号连接ENA,DATA_IN连接到DOB,当有参数上传时,ENA会置高并开始在RAM里写入数据

此时DOA会有数据输出,监测DOA的高4位,起始状态高4位为全0,当监测到高4位全变为1时说明数据写完可以读取了,此时ENA置低,同时ENB置高从而从DOB读出的数据即为上传的参数数据。

(4)中断控制信号的说明和中断控制流程

外部分别需要产生三个中断:(1)下发参数中断(2)上传参数中断(3)数据传输中断

中断信号使用PCIE_INT_OK和PCIE_INT_MODE来达到产生不同中断的目的,PCIE_INT_OK代表中断,1表示有中断,当PCIE_INT_OK跳变为1时PCIE模块会对CPU产生一个模块,同时会将PCIE_INT_MODE中的值传入一个寄存器中,上位机软件收到中断进入中断回调程序

17

基于FPGA的PCIE接口设计

后,会读取这个寄存器中的值,然后分别对应不同的模式进行不同的操作。

4.2内部的中断和工作流程图

4.2.1整体工作流程图

等待中断无中断有中断PCIE_INT_OK置1将PCIE_INT_MODE的值01传递给BAR0中的4C寄存器上位机收到中断信号,进入中断程序,关闭中断使能中断程序读取4C寄存器中的值检测此寄存器中的值判断是否等于001判断是否等于010判断是否等于100进入参数配置模式,由PC开始下发参数发送完成后,向BAR0寄存器48中写入10指示参数传输完毕跳出中断程序,打开中断使能进入参数上传模式,由PC开始读取参数跳出中断程序,打开中断使能N进入数据传输模式,开始向PC机传输数据跳出中断程序,打开中断使能等待下一次中断等待下一次中断等待下一次中断 图1 流程图

4.2.2 BAR寄存器地址映射关系及功能说明 BAR0地址 0X1C 0X28 0X2C 0X30 寄存器功能说明 DMA开始控制寄存器:写1 表示开始DMA传输 写0 表示结束DMA传输 中断总使能寄存器:写1 表示总使能中断开 写0 表示总使能中断关 屏蔽中断寄存器:不同位写1表示屏蔽不同的中断 不同位写0表示打开相应位的中断 回读中断使能位和中断屏蔽位状态的寄存器 18

基于FPGA的PCIE接口设计

通过回读的数据判断是否收到了中断以及收到的具体哪种中断 0X3C 0X74 0XFC 0X4C PC机下发DMA阀值寄存器 FPGA缓冲区数据计数寄存器: 上位机可以读取该寄存器的值 PC机下发控制命令寄存器:通过下发不同的数据达到控制FPGA的目的 中断模式标志寄存器: 通过读取该寄存器的值来判断收到的是何种中断,从而进入不同的模式 001代表参数配置模式 010代表上传模式 100代表数据传输模式 0X48 BAR1 PC机下发配置参数完成寄存器: 通过向该寄存器写入值来通知FPGA板参数下发完成,写10代表完成参数下发 作为参数的下发和上传使用

4.3ChipScope板上调试时序图

(1)参数下发板上时序图

测试条件: 由上位机向FPGA板下发32位线性数,BAR1中的0XF0寄存器作为数据寄存器 Bar1_we_addr 为地址寄存器 Bar1_we_data为寄存器中的数据 fig 为下发的参数,这里为线性数 fig_vld 为参数有效信号

19

基于FPGA的PCIE接口设计

20

基于FPGA的PCIE接口设计

由图可以看出,下发的fig为线性数,fig_vld在数据有效时为高电平

(2)PCIE中断板上时序图

PCIE的中断主要由PCIE_interrupt_n_final和PCIE_interrupt_assert_n两条信号线决定,PCIE_interrupt_n_final决定是否有中断信号,PCIE_interrupt_assert_n决定是产生中断还是清除中断。每次当PCIE_interrupt_n_final由1跳变到0时为该时刻会产生或清除中断,此时对应PCIE_interrupt_assert_n的高低来判断具体是哪种中断操作。当PCIE_interrupt_assert_n为低电平时为产生中断,当PCIE_interrupt_assert_n为高电平时为清除中断。Int_mode = 1说明此时的中断为参数中断

21

基于FPGA的PCIE接口设计

产生中断的时序图

清除中断的时序图

22

基于FPGA的PCIE接口设计

第五章 基于中断方式的DMA传输设计

5.1 什么是DMA

直接存储器访问(Direct Memory Access,DMA)是计算机科学中的一种内存访问技术。它允许某些计算机内部的硬件子系统(电脑外设),可以独立地直接读写系统存储器,而不需绕道中央处理器(CPU)。在同等程度的处理器负担下,DMA是一种快速的数据传送方式。很多硬件的系统会使用DMA,包含硬盘控制器、绘图显卡、网卡和声卡。DMA 是所有现代计算机的重要特色,他允许不同速度的硬件设备来沟通,而不需要依于中央处理器的大量中断 负载。否则,中央处理器 需要从 来源 把每一片段的数据复制到 暂存器,然后把他们再次写回到新的地方。在这个时间中,中央处理器 对于其他的工作来说就无法使用。DMA 传输重要地将一个存储器区从一个设备复制到另外一个。当中央处理器初始化这个传输动作,传输动作本身是由 DMA 控制器 来实行和完成。典型的例子就是移动一个外部存储器的区块到芯片内部更快的存储器去。像是这样的操作并没有让处理器工作拖延,反而可以被重新调度去处理其他的工作。DMA 传输对于高性能 嵌入式系统 算法和网络是很重要的。举个例子,个人计算机的ISA DMA 控制器拥有 8个 DMA 通道,其中的 7 个通道是可以让计算机的中央处理器所利用。每一个 DMA 通道有一个 16位 地址暂存器和一个 16 比特 计数暂存器。要初始化数据传输时,设备驱动程序一起设置 DMA 通道的地址和计数暂存器,以及数据传输的方向,读取或写入。然后指示 DMA 硬件开始这个传输动作。当传输退出的时候,设备就会以中断的方式通知中央处理器。\分散-收集\(Scatter-gather)DMA 允许在一次单一的 DMA 处理中传输数据到多个存储器区域。相当于把多个简单的 DMA 要求串在一起。再一求;DACK 意为 DMA 确认。这些符号一般在有 DMA 功能的计算机系统硬件概要上可以看到。他们表示了介于 中央处理器 和 DMA 控制器之间的电子信号传输线路。

DMA 会导致缓存一致性问题。想像中央处理器带有缓存与外部存储器的情况,DMA 的运作则是去访问外部存储器,当中央处理器访问外部存储器某个地址的时候,暂时先将新的值写入缓存中,但并未将外部存储器的数据更新,若在缓存中的数据尚 未更新到外部存储器前发生了 DMA,则 DMA 过程将会读取到未更新的数据。相同的,如果外部设备写入新的值到外部存储器内,则中央处理器若访问缓存时则会访问到尚未更新的数据。这些问题可以用两种方法来解决:

1)高速缓存同调系统(Cache-coherent system):以硬件方法来完成,当外部设备写入存储器时以一个信号来通知缓存控制器某存储器地址的值已经过期或是应该重新更新数据。

2)非同调系统(Non-coherent system):以软件方法来完成,操作系统必须确认缓存读取时,DMA 程序已经开始或是禁止 DMA 发生。第二种的方法会造成 DMA 的系统负担。

5.2软件界面设计与关键部分代码说明

软件基于Visual C++的MFC编程语言设计,MFC语言主要设计上位机软件的总体框架,上位机的驱动程序使用windriver提供的API函数即可,该上位机程序主要实现的功能是对PCIE设备的关闭与打开,存储文件位置的选取以及DMA传输中对PCIE卡的控制功能。

设计的软件界面如图1所示

23

基于FPGA的PCIE接口设计

图1 上位机软件总体框架

上位机包括对PCIE卡控制的若干个按钮,采集状态的显示以及不同状态的文本显示。 主要的功能按钮包括“打开设备”按钮,“开始采集”按钮和“停止采集”按钮。其中最主要的功能是开始采集的按钮,以下将对该段代码作解释,其他按钮的代码部分详情见附件。

采集功能的关键部分代码如下 bsize=1024*1024;

file.Open(Pointer->filepath,CFile::modeCreate|CFile::modeReadWrite|CFile::typeBinary,NULL); Pointer->mydriver.CompleteFlag=0; Pointer->StopFlag=0;

Pointer->timer=CTime::GetCurrentTime();

s1.Format(\开始传输\\r\\n\,

Pointer->timer.GetHour(),Pointer->timer.GetMinute(),Pointer->timer.GetSecond());

Pointer->log=s1+Pointer->log;

Pointer->SetDlgItemText(IDC_EDIT2,Pointer->log); t=clock(); while(TRUE) {

Pointer->mydriver.AddWrite32(0,REG_DMACST, 2); while (TRUE)

24

基于FPGA的PCIE接口设计

{

Pointer->mydriver.AddRead32(0,REG_RXDATA_NUM_VAL, &refe);// 查询数据状态 if ((refe& 0xfffffff) >= 0x100000) // 有1M数据,则启动DMA

{

if (refe==0xffffffff)

break;

Pointer->mydriver.AddWrite32(0,REG_DMACST, 1); WDC_DMASyncCpu(Pointer->mydriver.pDma); break;

}

elseif (Pointer->StopFlag)

break; continue; else } Sleep(20); while (TRUE) {

Pointer->mydriver.AddRead32(0,REG_DMACST,®); if ((reg& 0x2)!=0) {

Pointer->mydriver.AddWrite32(0,REG_DMACST, 2); break;

}

if (Pointer->StopFlag) break;

}

if (Pointer->StopFlag)

break;

WDC_DMASyncIo(Pointer->mydriver.pDma); // 启动DMA传输

file.Write(Pointer->mybuf,bsize);// 将内存中的文件写入到计算机硬盘中

本部分代码以1M的DMA大小作为传输长度,程序中的bsize即为DMA的大小,AddRead32为windriver提供的API接口函数,其作用为以32位字的方式读取BAR中的内容,约定读取的BAR0的偏移地址为FPGA中设计好的BAR的偏移地址,其代表FPGA中的缓存的DMA长度,一旦查询到DMA的长度大于1M,即开始DMA的传输。在DMA的传输过程中,使用到的AddWrite32也是windriver提供的API接口函数,其作用和AddRead32相反,为向BAR地址中以32位字的形式写入相应的内容,当查询到DMA长度大于1M可以进行传输时,使用AddRead32向BAR的相应的约定好的地址中写入1即

25

基于FPGA的PCIE接口设计

开始了DMA的传输。当点击了“停止采集”的按钮时,StopFlag会置1,同时循环也会break,从而停止了DMA的传输。设计的上位机程序只需改动bsize的大小和查询时的大小即可以实现不同DMA长度的PCIE传输方式,方便灵活。程序的完整代码详见附件。

5.3软件使用与系统性能测试

5.3.1 软件使用

对PCIE卡下载好程序重启电脑后,打开该软件,首先点击“打开设备”按钮,此时如果设备正常其他的灰色按钮会变为实色按钮代表可以进行操作了,点击“路径”按钮选择文件存放的位置,然后点击“复位”与“clear”按钮对PCIE板进行FIFO和DDR的清空,然后点击“开始采集”按钮后,采集状态会显示相应的速度和采集大小。同时选测存放文件的位置也会出现相应的文件。 5.3.2系统性能测试

系统性能的测试主要包括两个方面,一是DMA传输的稳定性,即保证DMA在传输时不会发生丢数和错数的情况,测试方法为:在FPGA程序里产生线性数,通过PCIE上传到计算机上,利用matlab读取数据看是否是线性数。二是在保证传输正确的情况下系统传输速度的测试,测试系统在不同DMA长度下的传输速度。测试方法为:改变不同的DMA长度,测试其传输速度。

以下为测试时的软件截图和matlab截图。

由以上的截图可以看出,以8M的DMA传输的速度为43MB/S,采集状态中的采集大小为下图为使用UltraEdit打开111.dat文件,可以看出,其存储的数据确实为线性数。因

152MB,实际文件大小也为152MB,采集状态显示正确。

为数据较大,为保证测试的严谨性,编写matlab程序对文件是否是线性数进行分析。Matlab的分析结果如下图所示。

26

基于FPGA的PCIE接口设计

以上分别为数据的开始段和结束段,从matlab画出的图可以看出,数据位连续的上升的直线,中间没有断点和跳变点,说明数据是连续的线性数,说明在DMA的传输过程中没有丢数和错数的情况发生。 以下表格为不同DMA大小下的系统传输速度。 DMA大小(Bytes) 64K 128K 256K 512K 1M 4M 8 M

度越大。

系统传输速度(Bytes/S) 2M 3.99M 7.9M 14.4M 21M 30.2M 43.6M 由以上表格可以看出,系统的传输速度是和DMA的大小有关的,DMA长度越大,传输速经过以上的测试,可以看出,本文设计的DMA传输系统可以无失真的将FPGA板卡上的

数据通过PCIE插槽传输到计算机中,同时通过调整不同DMA的大小可以达到不同的传输速率。

27

基于FPGA的PCIE接口设计

第六章总结与发展

结论与发展

本次毕业设计的研究课题是基于FPGA的PCIE接口的设计,首先了解了关于数据传输总线的发展历史和PCIE数据总线协议相比其他总线协议的优点,其次深入的学习和了解了PCIE总线协议的相关理论,包括PCIE总线的物理层、链路层和事物层,PCIE包体的打包结构,PCIE包的传输机制以及与计算机内存和PCIE有关的即指寄存器的映射和DMA传输的相关知识。在深入学习和了解了相关的理论知识后,设计基于FPGA的PCIE传输的设计。因为使用到了FPGA程序,所以又学习了VHDL和Verilog HDL两种硬件描述语言的基本语法使用,学习了在Xilinx的ISE Design Tools中如何新建工程,编译文件和仿真文件,同时深入的学习和理解了如何调用IP Core并且正确使用。在完成了以上几部理论准备之后,开始设计本次的程序,首先熟读并理解了Xilinx中的PCIEEndPointer IP Core的相关文献,在工程中成功调用该IP Core,并下载进板卡中通过windriver成功识别到PCIE设备并可以对其进行基本的BAR读和BAR写,在以上完成后,设计基于DMA机制的传输系统,需要开发相应的驱动程序,为了缩短程序设计时间和难度,使用windriver生成现成的驱动API程序,基于MFC设计相应的上位机程序框架,最后通过FPGA板进行了设计的验证。设计的DMA传输程序可以高速率、无失真的进行FPGA板卡与计算机内存之间的通信,稳定可靠,适合大 带宽的系统使用,良好的完成了本次毕业设计的任务。

由于时间和水平的有限,设计的程序还存在不足之处,可以在以后的学习中继续完善与改进,比如只实现了由FPGA向计算机的DMA传输,没有设计计算机向FPGA的DMA传输,不能实现FPGA板卡和计算机之间的双向通信,再比如设计的程序优化不到位,传输速度没有带到理论上的传输速度,这些都是日后需要通过不断学习来完善的。随着日益提高的数据量和大带宽传输的需求的提高,未来基于PCIE协议的传输必将成为趋势,所以本次毕业设计还是非常具有实际意义的。

驱动系统的开发过程,是一个整合各方面资源的复杂过程,其中包括操作系统、物理设备和应用程序在内等很多方面。为实现系统功能的有效性,需要开发者协调组织中的软硬件有序高效的共同运转,更要从系统的层面把握各个部分和层级的关系。特别是要灵活的解决实际情况中,驱动程序与硬件接口之间的访问关系问题,以及DMA传输内存缓冲区如何分配和使用的问题。

经过调试和测试的PCIE高速数据传输卡驱动程序和与之相配套的应用程序,在简单传输模式下的持续传输速率可以稳定在110MByte/s之上,而在DMA传输模式下,连续传输速率可以达到600MByte/s。

以FPGA设计的PCIE总线扩展卡,有诸多优点,包括省去了专用PCIE接口芯片,大大降低了组成硬件的成本,从而使硬件的集成度得到提高。同时因为FPGA具有可编程性,设计变得更加灵活,可扩展,同时使系统获得更高性能和更好的升级空间。由PCIE带来的超快的私有数据通道,完美的解决了限制大数据量交换时的瓶颈问题。并且,只需要小小的改动,就可以使这一驱动程序普及到其他基于PCIE接口的数据传输设备上。

28

基于FPGA的PCIE接口设计

当让在完成毕设的过程中我也遇到了很多问题,在前四周熟悉VHDL语言及ISE开发环境的过程中,由于基础比较薄弱,在编写简单的计数器程序时,Modelsim仿真过程中没有出现波形,后来发现,我并没有编写Testbench(仿真激励文件),所以没有仿真成功。在编写完程序后,烧录到板卡中,计算机却发现不到新设备,经过多方面的查询资料,得知,需要在FPGA程序中加入UCF约束文件,约束时钟的频率为250mhz即可解决问题。类似的问题还有很多,其实总结起来就是多查询资料,多找一些成功的案例,从中找到启发。

结束语

在此感谢我的毕业设计指导老师卓志海!他对我课题的研究和论文的写作都寄予了很大的帮助。感谢学长张曙泽为我课题的研究提供各项参考资料和实验设备,并付出了大量课余时间耐心指导我。同时感谢本课题小组的其他成员,正是在小组讨论中的思维碰撞让我有了更多的解决问题的思路和方法。最后,我再次表达对以上每一位帮助我的老师及朋友们,最真挚的感谢!是他们的无私帮助和钻研精神鼓舞我完成本次课题的研究,并为我在专业研究的道路上指明了方向!

29

基于FPGA的PCIE接口设计

参考文献

[1]王慧.基于FPGA的高速串行传输交换系统的设计与实现[D].南京:南京理工大学,2011. [2]基于FPGA的PCI-E接口设计(初稿office2003)[D].河南:信息工程大学,2011. [3]闵牡丹等.PCIE总线的FPGA设计方法[J].计算机与现代化.2009年8期.

[4]杨阿锋等.PCIe接口高速数据传输卡的驱动程序开发[J].中国测试技术.2008年2期. [4]何立民.单片机高级教程—应用与设计(第二版)[M].北京:北京航空航天大学出版社,2007.

[5]PCI Special Interest Group.PCI Express Base SpecificationRevision 1.0a[EB/OL].[2009—10—16].http://netyi.Net/Book.

[6]石峰,吴建飞,刘凯,徐欣.基于Xilinx FPGA的PCIE接口实现[J]. 长沙国防科技大学,长沙410073.

[7] 徐欣等编著.基于FPGA的嵌入式系统设计[M]. 机械工业出版社, 2005.

[8] 徐晓东,魏凤歧,李文.下一代总线标准PCI Express [J].情报学报,1999,18(4):1-6.

[9]齐逊海,贾北平.基于PCI Express总线协议开销的性能分析[J].中国科技信息. 211(09).

[10]Xilinx PCI Express PIPE Endpoint 1-LaneCorev1.3User Guide[J].America,2005. [11]NXP.PX1011A/PX1012APCI Express stand—alone X1PHY Datasheet[J].2006.

30

本文来源:https://www.bwwdw.com/article/iw4p.html

Top