本节我们重点讲解一下一个非常重要的问题:那就是如果用户自己做的板子没有参考黑金AX7103原理图,或者网上买了其他家成熟的PCIe FPGA硬件,那么用户需要注意哪些地方才能让我们封装的LabVIEW FPGA PCIe Socket CLIP完美适配呢?
不知道大家还记不记得我们曾在第五章里面,告诉大家如何修改FPGA引脚来适配自己板子上的晶振时钟,让FPGA能够运行起来;同理,PCIe也有几个非常重要的引脚可以在xdc顶层约束文件里面修改。编译的时候会自动覆盖底层网表文件里面的引脚定义。这一点我们比黑金和米联客以及大多数FPGA开发板厂商做的好,因为他们基本上不会在顶层xdc里面写上相对路径的PCIe Lane引脚定义。
首先,找到我们需要修改的FPGA终端模板文件里面的xdc约束文件,比如本书配套的ARTIX7开发板AX7103,默认的路径如图7-49所示:
C:\Program Files (x86)\National Instruments\LabVIEW 2015\Targets\NI\FPGA\NiAdept
图7-49:找到FPGA PCIe终端对应的模板文件夹
图7-50:找到这个FPGA顶层xdc约束文件
然后,右击通过notepad++打开这个xdc约束文件,找到PCIe引脚定义的地方,如图7-51所示。
图7-51:打开xdc顶层约束文件,找到PCIe引脚定义
因为很多7系列FPGA家族芯片内部具备多个不同BANK的PCIe引脚,特别是Kintex7和Virtex7系列,所以用户需要根据板子实际的原理图来修改这个xdc顶层文件。以黑金AX7103开发板举例说明,先打开对应底板原理图,找到PCIe相关针脚定义,如图7-52所示。这些引脚其实可以分成3类:PCIe总线复位引脚;PCIe总线差分时钟输入引脚;PCIe总线不同位宽的差分数据引脚。这3类引脚在前面图7-51里面都定义过了,如果用户自己画的板子或者网上买的其他家的板子引脚定义不一样,那么照葫芦画瓢对应修改一下就可以了。
图7-52:打开PCIe底板原理图,找到PCIe总线核心的3大类引脚
然后,打开AX7103开发板上插着的核心板AC7100原理图,找到PCIe复位引脚,就是J20,如图7-53所示。接着需要寻找一下PCIe的差分时钟引脚,这个引脚非常重要,如果找不到或者设置不对,那么PCIe总线肯定初始化不了,在核心板原理图上可以看到有两个MGT_CLK信号,但是实际接到PCIe插槽的是MGT_CLK1,也就是F10,如图7-54所示。
图7-53:在AC7100核心板上找到PCIe复位引脚:J20
图7-54:在核心板AC7100原理图上找到PCIe差分时钟输入引脚:F10
但是细心的用户可能发现了,黑金的AC7100核心板在画板子布局布线的时候,将PCIe X4模式下的数据收发差分对引脚0和1弄反了,2和3是对的,如图7-55所示。这个细节导致无数用户付出了惨痛代价。很多用传统Verilog开发FPGA的用户,看原理图不仔细,或者说黑金太随意了,为了自己的布局方便,把0跟1故意调换了一下,那么在Vivado里面默认的PCIe引脚就不对了,必须要人为调整才行。
图7-55:仔细检查一下PCIe X4或者X8数据差分对顺序是否正确
为了方便我们广大LabVIEW FPGA用户开发,我们特地在顶层xdc里面将PCIe X4全部引脚定义拉出来,用户只要自己根据实际情况修改就行,而无需在网表里面定义,简化了大家的编程,也避免了一些不必要的错误。希望这一点能够引起开发者的注意!!!重要的事情说三遍,0跟1互换了,所以引脚定义也要变,如图7-56所示。
图7-56:PCIe数据差分对引脚要跟原理图保持一致
最后我来再来看看黑金的Kintex7开发板AX7325上面的PCIe引脚定义约束文件是如何编写的,如图7-57所示。K7开发板上默认是PCIe X8接口,因为X8向下兼容X4模式,所以如果我们要把这个X8改成X4模式,需要注释掉一些Lane,同时还需要根据实际原理图选择正确的引脚定义,如图7-58所示。需要注意的是,K7芯片有两个完全独立的PCIe X4,或者说是一个PCIe X8,因此,如果要设置成X4模式,需要根据原理图正确选择。
图7-57:将Kintex7-325T-FFG900-PCIe X8模式改成X4模式
图7-58:根据原理图选择正确的PCIe数据传输引脚(K7有两个PCIe X4,比较特殊)