pcie调试总结
更新时间:2024-06-20 07:35:01 阅读量: 综合文库 文档下载
PCIE调试总结
Altera的pcie硬核从接口上来划分,有Avalon-ST和Avalon-MM两种。Avalon-ST的接口,即Stream模式,这种模式下,用户可以操作的接口很多,但是需要对pcie协议以及接口时序有比较深入的理解,这种模式对于刚接触pcie的同学来说比较有难度;而Avalon-MM接口,即Memory Map模式,相对来说则比较通俗易懂,用户侧的接口与双口RAM类似,有读写使能,读写时钟,读写地址,读写数据等;C260D这张卡使用了Avalon-MM这种接口模式,可以忽略pcie协议解析的部分。另外,由于Avalon总线位宽的限制,器件不同,pcie IPCore的生成接口也不同。比如arria II GX只能工作在Gen1x4模式下,而arria V GX则可以工作在Gen2x8的模式下,而且在产生IPCore的时候,arria II GX需要一个固定时钟125MHz,而arria V则不需要。
首先从Qsys系统的使用开始。由于altera fpga的SGDMA IPCore只有在Qsys系统下才能使用,所以整个pcie接口的设计需要借助Qsys系统来完成。至于Qsys系统的使用方法,需要各位同学上网查资料了解,这里不做详细描述。当然,也可以自己写SGDMA控制核,这样就不必使用Qsys系统了。据不准确考证,Qsys系统应该从Quartus11.0开始才出现的,所以各位同学要首先检查下自己的Quartus版本。介绍Qsys系统,首先从新建一个工程开始。打开Quartus之后,在页面的上方工具栏位置,可以看到以下图标:
其中
即是Qsys工具的快捷图标,用鼠标点击该图标,即可进行Qsys系统的创建。
图1 Qsys系统新建页面
该图就是打开Qsys系统的初始界面。该图左上角的Library这个选项中,有各种Bridge,Adapter,Clock and Reset等Qsys系统提供的组件,以供搭建Qsys系统使用。当然,也可以自己创建一个组件component,这个会在后续的介绍中做说明。C260D的Qsys系统用到的
component有一下几种:
:SGDMA IPCore,用于视频数据DMA传
输;
:用于构建Qsys系统的时钟网络
:用于时钟域转换
:PCIE IPCore
图2 Qsys系统中的部分组件
这些component的例化很简单,从clock source开始介绍。双击Clock Source对应component图标,即可进入参数设置界面,如下图所示:
图3 Clock Source参数设置页面
然后点击右下角的Finish图标,即可完成component的添加。完成Clock Source这个component添加后,Qsys系统的界面如下:
图4 Clock Source在Qsys系统中的显示页面
下面介绍下clock source各部分参数的名称:
-clk_0:component的例化名称,会在最终生成的 Qsys文件中显示该名称,右键鼠标可以修改名称:
图5 clock source属性页面
双击名称位置,可以修改component属性:
图6 clock source属性页面
Export栏是供导出用的,右键或者双击可以修改导出信号的名称。
clk_in和clk_in_reset则是导出后用户能够看到的信号名称,用于连接用户自己的时钟;而clk和clk_reset则是经过桥接后的信号,分别与导出的两个信号相等,供 Qsys内部个模块使用。
下面介绍下SGDMA IPCore的component例化。双击上面描述的SGDMA的图标,弹出的界面如下:
图7 SGDMA参数设置页面
左边的是信号描述,也是在Qsys系统中能够看到的信号,点击左上角的Show signals可以看到更多的信号,这里不再赘述。
-CSR,control and status registers,用于读取SGDMA的状态,以及控制SGDMA的启动,停止等操作,CSR能够操作的寄存器共有16个,每个寄存器位宽为32bit。
表1 CSR寄存器定义
其中base可以认为为0,当多个dma核存在时,csr的地址也要进行地址偏移,一次偏移0x40字节。下面是各个寄存器中各bit位的说明。
表2 Control Register Bit Map
表3 Status Register Bit Map
对于base+8这个寄存器中的值,则是指向了第一个描述符所在的地址。这个地址是Avalon的地址,如果需要pcie的物理地址,还需要进行地址转义。有关地址转义的相关描述会在后续的章节中提及。 -csr_irq
这个信号是DMA IPCore产生的中断信号,由于Qsys系统只能支持模拟中断向量,所以产生的中断也是模拟的中断,然后通过pcie的模拟中断机制上传到cpu端。关于中断,后续章节会详细说明。 -descriptor_read/write
这两个接口是描述读/写端口,简言之,就是DMA IPCore读取/写入描述符以及相关控制位/状态位的接口。在DMA工作工程中,核心工作之一就是读取描述符,并根据描述中的相关内容寻找数据所在地址,进而读取数据进行传输。下面说说DMA描述符的相关内容。 首先说明下描述符的存储。对于少量数据的传输,比如一次传输1Kbyte,且不连续传输,一个描述符即可完成这种操作,这种情况下,描述符可以写成固定值,没有必要存储;若传输大量数据,则需要多个描述符,这种情况下,描述符的存储就有必要了;描述的存储方式影响到描述符的更新,描述符的读取与写入等操作,这些操作又直接影响到dma的传输效率,所以,根据需要选择合适的存储方式很是有必要。目前主流的存储方式有两种,fpga端与cpu端。
图8 描述符存储在fpga端的memory中
图9 描述符存储在cpu端的memory中
图8的框图是描述符存储在fpga端的memory中,这个memory可以是fpga fabric中的RAM,也可以是fpga外挂的ddr/sram等存储媒介;这种存储描述符的方式下,描述符的更新由cpu通过pcie读写bar空间来实现,需要与pcie的数据传输抢断资源,需要占用一定的fpga内部存储空间,这是缺点;优点就是,dma传输数据过程中,读取描述符的时间与dma数据传输的时间相比,可以忽略不计;图9的框图是描述符存储在cpu端的memory中,这种模式下,cpu更新描述符比较方便,这是优点;缺点就是fpga的dma核需要经过pcie接口从cpu的memory中读取描述符,然后再写到fpga的fabric中,这个时间对于dma传输来说,是不可忽略的。因此,设计时,需要综合考虑,选择一个合适自己设计的方案;C260D的方案是图9所示的框图。
描述符的数据结构以及相关描述见表4与表5.
表4 DMA Descriptor Data Structure
表5 DMA Descriptor Field Description
-m_read/m_write
这两个接口是数据接口,即DMA从那块地址读取数据,然后再写到那块地址中去。对于视频数据下传,DMA通过pcie接口从cpu的内存中读取YUV数据,然后在写到本地fpga的fabric中;对于TS上传,则是DMA从fpga的fabric中读取数据,然后通过pcie接口写到cpu对应的内存区域;
需要注意的是,descriptor_read/descriptor_write/m_read/m_write这些接口都可以导出,
但导出的时候,必须给这些信号指明地址空间,否则dma控制核将不能工作;这个时候,可以通过新建一个component来实现导出的操作。
表6 DESC_CONTROL Bit Map
多个描述符构成的队列我们通常称之为描述符链,类似与C语言中的链表,在描述符链中,第一个描述符的地址有CSR中的寄存器指出,之后的描述符的地址由前一个描述符指定。描述符链由CPU来构建,更新也是CPU来做,DMA核负责读取描述符并根据描述符中的地址传输数据。
对于图7右半部分的参数,设置如下: -Transfer mode :共有三种模式,
Avalon-MM to Avalon-ST:memory map 到stream模式,输入接口是MM,输出接口是ST Avalon-MM to Avalon-MM:memory map 到memory map模式,输入接口是MM,输出接口是ST
Avalon- ST to Avalon- MM:steam到memory map模式,输入接口是ST,输出接口是MM 由于目前ST模式下要解析pcie协议,所以C260D中采用了Avalon-MM to Avalon-MM这种传输模式。
-Enable bursting on descriptor read master
这个选项是允许对描述符进行突发读取,一般对这项打勾。 -Enable unaligned transfer
这个选项的意思是允许不对齐传输,若勾选了这个选项,则后续的处理中需要手动将地址,数据对其,比较繁琐,本设计中没有勾选该选项。 -Enable bursting transfer 这个选项是允许突发传输,若不允许突发传输,则一次只能传输一个byte,为提高传输效率,勾选该选项;
-read burstcounter signal width -write burstcounter signal width
这两个参数只有Enable bursting transfer这个选项勾选了以后才能设置。设置的突发计数器宽度,根据目前的测试结果,若这两个参数都设置成4,即位宽为4,则实际的burstcounter
值为8;若设置成10,则实际的burstcounter值为512;若设置成N,则实际的值为2^(N-1); -Data and error width
这个是选项是设置数据以及错误位宽,error width默认为0,不必设置;data width指的是传输数据的位宽,建议与pcie数据位宽保持一致;C260D中,pcie设置的位宽为64bit,DMA核的这个参数也设置成64; -Fifo depth
这个参数随着data width的改变而改变,data width为32,则该参数为64;若data width为64,则该值为32.
以上简单介绍了SGDMA IPCore的各项参数,下面介绍下时钟域转换模块clock crossing这个模块的参数设置。在library对应的选项下找到Avalon-MM Clock Crossing Bridge,然后双击即可:
图10 Avalon-MM Clock Crossing Bridge框图
该模块的作用是将数据由s0_clk时钟域下转换到 m0_clk时钟与下。 s0 :表示slave port m0:表示master port -data width
数据位宽,与SGDMA核的位宽对应 -symbol width
符号宽度,即表示几个bit一起作为一个处理单元,本设计中采用字节处理方式,设置位宽为8
-address width
根据实际需要而定,一个address对应一个symbol. -address units
地址单位,一个地址一个symbol -maximum burst size
这个值关系到dma传输的效率,该值不能小于SGDMA IPCore中设置的burst值,否则将会影响SGDMA的传输效率;另外该值会影响到Response FIFO depth的值; -command FIFO depth 命令fifo深度
-response FIFO depth
响应fifo深度,该值大于maximum burst size,一般为该值的2倍。 -Master clock domain synchronizer depth -Slave clock domain synchronizer depth 这个两个值采样默认即可。
需要注意的是,maximum burst size这个值越大,那么占用的fpga内部RAM越多,所以要酌情设置。
下面介绍下pcie IPCore.在Library-interface protocols-pci找到IP compilerfor pci express这个选项,然后双击,即可出现以下页面:
图10 pcie IPCore interface
图10右侧部分的页面中,各参数含义如下: -Device Family
这个根据工程选择的器件来定,在该页面不可设置 -Gen2 lane rate mode
这个选项表示是否使用pcie gen2的速度模式,能否勾选与所选期间有关,GX125不支持该选项。
-Number of lanes
表示使用的pcie的通道数目,由于Avalon总线位宽的限制,GX125只能使用x4 mode。 -Reference clock frequency
Pcie工作的参考时钟,有100MHz与125MHz两个选项,一般选择100MHz; -Use 62.5MHz application clock
表示是否使用62.5MHz的工作时钟,该选项能否勾选与所选器件以及应用有关,本设计中不勾选该选项; -Test out width
测试用数据位宽,有9bit,64bit和none三个选项,本设计中选64bit,也可以选none -pci base address registers(type0 configuration space)
这部分参数是设置pcie所用的bar空间的大小以及位宽。Qsys系统中,bar空间的大小在这个页面不能设置,只能由与bar空间连接的模块的地址空间来决定。Bar空间的位宽有32bit-nonprefetchable与64bit-prefetchable两种,据查,nonprefetchable是指读取后原来的值可能被破坏,而prefetchable则是指读取后,原来的值不被破坏的意思。如果采用了64bit-prefetchable这种模式,那么就是有两个相邻的32bit的bar空间组合而成。即如果bar0采用了64bit-prefetchable位宽模式,那么bar1就被占用了,即bar1显示的occupied状态。本设计中,bar01采用64bit-prefetchable模式,bar2采用32bit nonprefetchable模式,用于dma的csr设置;bar3采用32bit nonprefetchable模式,用于参数设置等功能;bar4与bar5没有使用。一般的pcie设备里面,bar空间只有6个。
图11 PCIE IPCore Parameter Set Page
-Device Identification Registers
这个目录下的参数设置了当前使用的pcie核的一些身份信息,在配置空间里面,在Qsys系统下,逻辑自身读取不到这些寄存器,每个公司都有自身的ID,以做区分。Altera公司的参数设置如上图所示。
图12图11 PCIE IPCore Parameter Set Page(Cont.)
-Buffer configuration
这个参数设置了接收与发送数据的payload的大小,该值不仅与器件有关系,还要符合pcie协议中规定的数据长度。本设计中,Maximun payload size选择为256Bytes,RX buffer credit allocation选择为Maximun,其余灰色的选项是系统自动根据前面的设置计算出来的。 -Avalon-MM Settings
这个选项设置了与Avalon总线相关的参数。 -Peripheral mode
是指pcie的工作模式,有两个选项Requester/Completer和Completer-only;
本设计中选项Requester/Completer,有关Requester与Completer的相关资料,要参考PCIE2.1的相关标准,里面有详细的描述。
图13图11 PCIE IPCore Parameter Set Page(Cont.)
Address Translation这个选项下的参数直接与数据传输相关,即DMA传输数据要依靠这个来完成。
-Address translation table configuration 这个参数是指描述符的属性,即cpu维护的是动态的描述符链还是静态描述符链。所谓动态描述链,是指cpu要实时更新描述链;相对的,静态描述符链则是指描述符链固定不变。选择哪种方式,取决于系统方案,本设计中,采样动态描述符链的方式。即使选择了动态模式,cpu也可以根据情况维护自己的链表是动态的还是静态的。 -Number of address pages
这个参数是指地址翻译表/描述符链中的最大的描述符个数,实际的描述符个数可小于该值,但不可大于该值,该值以2^N的形式存在,最大值为512. -Size of address pages
这个值限制了描述符中每页中传输数据的大小。这个大小与实际应用有关,可根据实际需要来定。本设计中,选择一个page 4Kbytes。
对于以上的三个参数,必须与cpu那边的配置一样,否则DMA传输肯定不会成功。 设置好以上参数以后,点击右下角的finish,即可以生成Qsys系统下的PCIE IPCore了。
以上内容说明了生成用到的component的生成方法以及参数设置等情况,里面涉及到的一些内容没有详细说明,接下来的一部分内容将进行补充。
第一个要补充的内容是有关CRA的描述。CRA是Control Registers Access的缩写,字面意思是控制寄存器访问。在Qsys系统中,fpga的fabric不能访问这些内容,只有cpu才有权限。在Avalon-ST的接口中,fpga的fabric也可以通过接口访问,这里不做说明。pcie IPCore的CRA空间大小共有16Kbytes,这16Kbytes又分为4个子空间,每个子空间4Kbytes,如下表所示:
表7 CRA地址空间分配表
0x0000~0x0fff这个4Kbytes空间只有cpu能否访问,本设计中不做深入探讨。
0x1000~0x1fff这个地址空间是有关地址映射表的,是本设计中软件需要仔细研究的内容 0x2000~0x2fff是保留的。
0x3000~0x3fff是有关中断的一些描述,稍后会介绍。 这里对本设计最为重要的就是地址翻译表了。
Avalon Address 根据(描述符/数据地址)hostMemory的地址和映射表以及固定Slave 地址组成。
hostMemoryAvalon address 0FPGA固定值0x01PCI-E High Address 311211PCI-E Low Address 011位最多支持512个描述符,存放描述符的索引从0-511High indexPCI-E Low Address 12110Slave Base Addr3121203100x1000310x10040x1000Pci-e Address 121010Pci-e h address(64位时有用,32位保留)310...0x1FFF0x1FFF映射表
图14地址转换示意图
下表是translation table的相关说明。
表8 translation table
下面这段说明了Avalon地址的含义。
图15 地址转换示意图
按照以上方式就可以完成地址转换了。
下面补充下有关中断的内容。
PCIE支持的中断类型有以下几种: -MSI interrupt/MSI-X interrupte -Legacy interrupt -INTX interrupt
就本设计而言,由于使用的是Qsys系统,所以MSI/MSI-X interrupt就不支持了,支持的是INTX虚拟中断。因为INTX通常情况下是采用管脚的方式给cpu处理,所以pcie这边的INTX是虚内的中断管脚。当触发一个中断时,PCIE IPCore的配置空间里面有关中断的寄存器会发生变化,这样PCIE IPCore会发送一个中断TLP包给cpu,当cpu收到中断后,再查询PCIE IPCore配置空间里面的寄存器,以确认触发了哪个中断,从而响应对应的中断处理程序。PCIE IPCore的配置空间里面涉及到中断的寄存器有以下几个:
表9 Register Map
表10 Address 0x0040 interrupt status register
我们用到的是配置空间里面地址为0x0040寄存器中的第16bit,也就是说,本设计的Qsys系统最多只能支持16个中断。该地址寄存器是只读寄存器,也即cpu 通过配置空间的该寄存器获取当前中断的状态。
表11 interrupt enable register
本设计中,使用的是Qsys的中断方式,配置空间中的该地址寄存器的低16bit是中断使能寄存器,该寄存器与地址寄存器0x0040中Qsys系统下的中断是一一对应的。
配置空间里面的这两个地址寄存器是产生虚拟pcie中断的前提,在配置空间里面还有
个寄存器需要设置:
表12 Command Register (Offset 04h)
这个寄存器是控制pcie产生INTX中断的。
表12 Status Register (Offset 06h)
从这个寄存器的状态,可以获知当前有没有INTx类型的虚拟中断产生。
只有把以上有关中断相关的寄存器都设置对了,才能正确的将fpga fabric产生的中断通过pcie接口反馈到cpu端。
以上内容补充了CRA,地址转换,中断等相关内容,下面补充下如何创建自己的component.
启动Qsys,双击左上角的New Componet或者File->New Component,如下图所示:
图16 new component示意图
双击New Componet,弹出的页面如17,
图17 new component参数页面
Component type下各参数含义如下: -Name
Component的名字,可以以任何你喜欢的名字命名,英文字母在前,可以有下划线。 -Display Name
component对外显示的名称,最好与Name一样。 -Version
版本号,方便维护 -Group
图18 Group分类选项
Component的分类,可根据实际用途选择类别。 -Description
对当前Component的描述,比如功能啥的。 -Icon
Component图标,可空白。 -Document
当前Component的参考文档,可以空白。
Files下各参数含义如下:
图19 Files页面示意图
这个页面要求用户选择需要创建component的verilog/VHDL源文件。这个源文件可以使用该页面最上面的Templates选项来选择,如图20所示:
图20 Templates选项
这里面有好多现成的例子可用,只要选中对应列即可。 另外一种方法是自己写源文件,然后点击图21中左下角的+号,选择文件的位置即可。
图21 源文件选择页面 当选则了源文件之后,“Analyze Synthesis Files”这个选项就变成黑色的了,如图22所示:
图22 选择文件之后的页面 选择的文件是自己是写的源代码,代码结构如下:
源文件是带有中断的slave module,其中各信号说明如下: Address :地址总线,位宽根据需要来定 Read :读命令 Readdata :读数据 Write :写命令 Writedata :写数据 Waitrequest :反馈信号 Clk :时钟 Reset :复位信号 ins_irq0_irq :中断信号
以上信号中,时钟是必须的,其余的最好都留着,且这些信号都必须符合Avalon总线的时序要求。但对于各信号的定义,除了时钟信号,复位信号,中断信号是有固定还以外,其余各信号可以根据需要自己定义,随意使用,只要满足Avalon总线时序即可。
在选择好了文件以后,必须进行的一项工作是综合,即点击图22中的“Analyze Synthesis Files”按钮,让Qsys系统先分析下源文件,以确定各信号的含义以及属性。至于后面的
正在阅读:
pcie调试总结06-20
PHP 正则表达式常用函数使用小结01-25
迷人的夏天作文300字07-08
法宣在线_4.2《中华人民共和国水污染防治法》练习题及答案05-09
镉镍电池项目可行性研究报告07-09
2013北京中考英语单选及完形填空08-12
七年级(上)语文写作训练教学设计04-07
申报高级经济师专业工作总结02-02
开花和结果 习题精选07-28
媒介融合的整理版01-21
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 调试
- 总结
- pcie
- 对监狱特警队建设的几点思考
- 多分支结构
- 3、中国大唐集团公司集控值班员考核试题库《电气运行》2
- 足球联赛积分管理系统设计与实现(含代码)
- 磷酸铁锂材料生产项目可行性研究报告
- 马克思复习资料整理(20个原理)
- 中小企业是国民经济的重要组成部分
- 《背影》教材分析
- 大唐景泰发电厂抢发电量管理办法 (2016修订)
- 别墅施工组织设计
- 2011年中考英语复习三年经典真题题库9 非谓语动词
- 《化工原理》习题集
- 大连海事大学2014年硕士研究生招生简章(校对版) - 图文
- 冀教版小学语文五年级上册《鸬鹚》导学案
- 2016届道路桥梁工程技术专业大学生毕业自我鉴定优秀范文
- 基于NIOSII的I2C总线接口技术
- 高一新人教版政治必修2考案1 第一单元学习质量检测题 Word版含解
- 行测备考之常识判断 政治基础知识练习题
- 纸盘画社团活动总结
- 唑来膦酸与帕米膦酸二钠治疗恶性肿瘤骨转移疼痛