跳伞法速成PCIe【1】:PCIe入门与例程讲解

PCIe是一种相当复杂的通信协议,因此查过相关资料的朋友可能会察觉到,网上的教程虽然详尽,但内容又多又杂,手上的项目又十分紧急,根本没有那么多时间摸透PCIe各种各样的原理。楼主当时在学习的过程中也走了很多弯路,浪费了很多时间去了解对工程没啥大用的东西,所以为了能让有幸看到这篇帖子的朋友快速入门PCIe,楼主掏出了几个月使用PCIe的心得和几年的应试教学经验,尽可能以最简单地方法帮助到各路朋友们~。

既然是快速入门,我们便使用跳伞法来进行学习。也就是将结论作为起点,从已有的简单案例出发,积累对PCIe的感性认识,然后再照猫画虎进行模仿与改编,最后才通过归纳/分析等方法深化到对PCIe的理性认识。这样我们不仅能先快速上手眼前的项目,还能略过非常多不必要的细节节省精力。

那么一开始我们就先抱着一个游客的心态,简单参观以下PCIe的一个简单项目吧。

1.打开官方的PCIe示例工程

        技术圈里有一个挺有意思的现象,就是找一个复杂项目容易,但要想找一个既简单又说明问题,符合小白的工程那可太难了!这里楼主有一个小tip,就是去抱官方的大腿~要说这个世界上谁最想让我们学会这些技术,除了老板那可能就是这些供应商了。所以它们也会画很大的力气做一些简单的示例工程方便我们学习,不仅提供了设计案例,还给出完整的仿真工程供我们欣赏,那我们当然要全盘笑纳了。。。

        1.1找到PCIeIP核

                随便新建一个Vivado工程,在IP Catalog中搜索PCIe,双击7 Series Integrated Block for             PCI    Express,这样就进入了PCIe IP配置界面

        1.2生成PCIeIP核

                PCIeIP核的配置又多又杂,一上来死记硬背没啥用还啥也记不住,咱先不管它,直接默           认点OK即可,项目生成后咱们回头再来看,到时才叫有图有真相。

        1.3打开官方示例工程

                右击Source界面里的PCIe核,选择Open IP Example Design,给这个示例工程安个家,然后静静等待工程加载完毕,即得到官方示例工程

2.PCIe在例程中的连线与结构

        2.1打开原理图,总览例程结构

                点击左边栏中RTL ANALYSIS下的Schematic,即可加载出项目的原理图框架。可以看到这个结构十分简单,输入输出直接与PCIe相连,而PCIe的工作具体由另一个APP模块控制,这样的框架就已经足够实现简单的FPGA端的PCIe设计啦

        2.2例程总接口的说明(含PCIe的FPGA工程怎么用?)

                这个例程将在电路上怎么用呢,我做了一个简单的示例图如下。

  1. pci_exp_rx/tx接口:可以看见两设备是通过pci_exp_rx/tx接口进行PCIe的通信的,它们就是PCIe的物理层接线。
  2. 传输速率:单个数据线的传输速率非常快,最大可以到5GT/s,也就是0.2ns一个数据。所以咱的100MHz(10ns一个周期)时钟压根就不够用,这才请出IP核让它来完成这么快的通信。。。
  3. 时钟和复位:俩哥时钟得一致,这没啥可说的。

        2.3PCIe的接口说明(PCIe如何工作?)

                简单了解完例程的外部电路后,我们再回到该工程上来,从接口开始了解这个PCIeIP核吧。我们把接口分成几类。

                1.与外部通信的接口

                        如图所示。这些接口的功能我们已经在上一部分说过了, 这里就不加赘言

                2.时钟,复位与标志信号

        如图所示,标记出了PCIe的时钟,复位与标志信号,它们最多只过了一个触发器来做同步就直接做到APP层,作为APP用户的总时钟和复位:

user_clk_out:PCIe核与APP的AXI通信时钟,是由输入的系统时钟变频得到的。它的数值在之前PCIe的配置界面可以看到,后面我们会对其做一个总结。

user_reset_out:PCIe复位,高有效。要注意的是它和user_clk_out同步,但和输入的系统复位是异步且相反的。

user_lnk_up:顾名思义,就是一个信号表明‘PCIe已经做好了战斗准备,请下命令吧’的意思

                3.AXI通信接口

        终于来到核心了,AXI接口,PCIe核与外部的通信方式。这一part我们将会说明大伙最最关心的数据处理流程。

                        3.1PCIe数据流向

        如图为整个系统的数据大致流向,有两点具体说明一下。

  • 注意这里RX和TX是两组数据,有很多例程会把它们在APP层内串联起来,这是为了做回环(loop-back)测试,实际应用中这是两种数据,一种是要从CPU传来的数据,一种是要发给CPU的数据。
  • PCIe_IP核内的数据处理:这里有物理层,链路层,传输层三层的数据处理,也是很多教程喜欢着重探讨的内容。但其实这部分内容IP核都已经帮我们做好了,虽然rxn,rxp上的数据经过了重重处理,但我们要应对的PCIeIP核的AXI数据非常简单原始,所以目前没什么太大必要了解那么多层复杂的数据处理。当然,这些内容再我们在了解大局之后会详加介绍,届时理解起来也会更加容易

                        3.2AXI数据接口

        如图所示,rx和tx数据流向和上图展示的一致,但是单单一个数据线是做不到稳定传输的,可以看到AXI通信有很多控制线,对于数据接收端来说,AXI接口如图标记,它们共同实现了数据的稳定传输,它们的时序这里多说无益,我们会后续结合仿真和文档来说明时序,等不及的朋友可以先查阅AMD官方手册pg054-13~40页和46~90页浏览。


                4.物理层接口

        PCIeIP核上pl打头的均为物理层接口,它们描述和控制了物理层通信的链路状态,也就是该含PCIe的设备FPGA与其链路伙伴,即另一个含PCIe通信的设备如CPU之间的链路状态。注意不是这个工程里PCIe核与APP层的通信状态。

        其接口非常多但是不是非常重要,我们可以在后期有需求的时候再回看技术手册,了解其接口信息。感兴趣的同学可见pg054-23~28页

        

                5.配置接口

        PCIeIP核上cfg打头的接口可以认为是广义上的配置接口。它又可以分为一般配置接口,中断接口,错误上报接口

        和常用的ADC,DDS等外部功能芯片类似,PCIeIP核内部也有很多寄存器来设置PCIe的功能和运作,而我们作为用户可能需要向寄存器里面写数/读数,因此芯片供应商也给我给出了配置接口来实现这一部分功能。

                        5.1一般配置接口

        一般配置接口使得用户可以读取PCIe配置空间中的信息。用户设计提供了一个 10 位配置地址线cfg_mgmt_dwaddr[9:0],该地址选择 1024 个配置空间双字 (DWORD,也就是四个字节) 寄存器,再通过各个输出端口返回所选寄存器的状态。虽然例程中PCIeIP核没有使用这些接口,但是这有助于我们对配置空间的理解。图中接口的详细功能也是在需要的时候再去了解就可以,感兴趣的同学可以见pg054-28页~33页。

                        5.2中断接口

        这个接口会比较重要,早期可以深入了解一下。中断传输数据的时序图如下,上下分别为非MSI中断模式和MSI中断模式的数据传输示意图,这里简单介绍一下各个接口,同学们将其结合时序图理解。

        cfg_interrupt:中断请求信号。我们可以拉高此输入,请求PCIeIP核传输中断信息,这个信号需要拉高知道用户接收到cfg_interrupt_rdy回复。

        cfg_interrupt_assert:不用于 MSI 中断。在中断期间选择数据类型,是Assert还是Deassert消息。

        cfg_interrupt_di:中断数据输入。对于 MSI,在多向量中断中,cfg_interrupt_mmenable[2:0] 指示值决定了端点提供的消息数据的低位位数,而cfg_interrupt_di[7:0] 的其余高位未使用。对于单向量中断,不使用 cfg_interrupt_di[7:0]。对于传统中断消息(Assert_INTx、Deassert_INTx),仅支持 INTA (00h)(有印象就行)。

        cfg_interrupt_stat:中断状态显示。

        cfg_pciecap_interrupt_msgnum[4:0]:PCIe功能-中断信息号,不是很重要。

        

                        5.3错误上报接口

        PCIe用来及时收集错误信息的接口,不是很重要,例程也没有,所以在入门阶段先不加介绍了。

3.总结与展望

        3.1总结        

        这篇文章是着重于如何快速入门PCI Express(PCIe)技术,特别是针对那些时间紧迫、需要迅速掌握PCIe以完成项目的同学们。因此我们提出了一种高效的学习方法,即“跳伞法”,从结论出发,通过简单的案例快速积累感性认识,然后模仿和改编,最后通过归纳和分析深化理性认识。

文章的主要内容可以分为以下几个部分:

  1. 官方示例工程的使用

    • 我们建议从官方提供的简单示例工程开始学习,因为这些示例通常既简单又具有指导性。
    • 介绍了如何在Vivado工程中找到并生成PCIe IP核,以及如何打开官方示例工程。
  2. PCIe例程的结构和接口

    • 描述了PCIe例程的物理层接口(pci_exp_rx/tx)和传输速率,以及时钟和复位的重要性。
    • 解释了PCIe IP核的接口,包括与外部通信的接口、时钟、复位与标志信号,以及AXI通信接口。
  3. AXI数据接口

    • 讨论了PCIe数据流向,包括RX和TX数据的处理。
    • 强调了AXI接口的重要性,这是PCIe核与外部通信的主要方式。
  4. 物理层接口

    • 描述了以“pl”开头的物理层接口,这些接口描述和控制了物理层通信的链路状态。
  5. 配置接口

    • 讨论了以“cfg”开头的配置接口,包括一般配置接口、中断接口和错误上报接口。
    • 特别提到了中断接口的重要性,并解释了相关的信号和功能。
        3.2下一篇文章展望

        在文章的结尾,请容我再次强调学习方法的实用性和效率,重视实践和模仿的思路,在入门阶段不必深入了解所有细节,而是先建立起对PCIe的整体认识,然后在后续开发需要的时候再来补充细节。

        因此沿袭这样的思路,我们下一章会对官方例程进行仿真,直观地观察

        1.该例程与其他设备通信地过程与时序

        2.该例程内部PCIeIP核对输入数据的处理

        3.该例程内部PCIeIP核与用户程序APP层的通信时序

        4.该例程内部用户程序APP层对数据的处理与操作

        3.3感谢

        感谢各位朋友们翻看到了这里,你们的关注是我更新博客最大的动力!

        之后,这个博客将会专注于高效,易懂的硬件开发内容,不仅传播技术,并且还会分享我对高效学习技巧的理解,希望能在各个方面帮助到看到这些博客的朋友们,谢谢啦:)

        

        

  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值