最近在做一个PCIE转网口的项目,具体框图如下:SOC这边的板子是我们自己开发的,但是无法满足输出四个网口的需求,就想到了用PCIE2.0进行转接,右侧的网口扩展板是外购的,刚好满足PCIE2.0接口,并输出四路网口。于是采用了此架构进行设计,外购的板子和我们的SOC核心板间通过标准的PCIE金手指进行连接 。但是在实际设计过程中发现金手指有很多引脚,而且很多定义也不是很清晰,在网上查阅资料,没有一个说的是全面的,只能一个一个的找,查阅各种资料,为了方便大家以后的设计,我在设计完成之后进行了总结,并以此文作为后续复习的资料,同时分享给大家作为设计参考。下面进入正题!
下图就是PCIEX1的金手指,正反两面共36个引脚,其中分为左右两部分,左半部分是所有PCIEX1,PCIEX2,PCIEX4,PCIEX8等共用的引脚,右侧的差异就是差分对通道数的差异,具体大家在设计时候详细了解即可,本次只对PCIEx1的各个引脚定义进行理解分析,基本可以代表所有的PCIE引脚。
上面是左半部分金手指的引脚定义,两面各11个脚,此部分通用于所有的PCIE金手指,定义及使用设计说明如下:
+12V: 当板卡端有大功率的负载,如显卡,声卡等,这个电源是一定要用的,主板端一定要设计有此12V电源,此12V到板卡端后,基本还会有一个转5V的DCDC,功耗的话要具体看声卡或者显卡的规格书决定此12V的设计电流值,如果主板端主电源有DC15,DC24V或者以上,那么直接一颗宽压DCDC就可以得到12V,如果主板端只有12V或者低于12V供电的电源,那么建议直接用5V做升压,boost的方案来设计。另外,如果板卡端的负载功耗低,比如我的这个方案,是转网口的,理论功耗没有多大,但是我外购了两家的板卡,发现其中有一家没有用这个12V,直接悬空了,另一家的竟然用到了这个12V!所以,重点来了:大家在任何时候都要把这个12V设计进去,作为预留方案,如果真的不需要,那BOM就可以省事了,节约成本。若果真是有显卡声卡这种,那么直接上件就好了。这样才稳妥,可以应对各种情况,切勿为了省空间,或者觉得麻烦,而直接不要这个12V!
RSVD:说明中是保留针脚,也就是作为预留设计来用的,理论上可以充当一些扩展功能用,一般当板卡用12V供电的时候,如果功耗很大,那么金手指的通流量就会受到考验,此时可以把这个脚当做12V输入来用,如下图所示:
+3.3V:此电源必须一直有,属于板卡比较重要的电源,作为PHY芯片或者处理器的主电源,如果确定了上述的12V没有用到的话,那么板卡的所有功耗都会由此3.3V来承担,所以设计上建议多留点余量,直接按照5A的电流去布线。
SMCLK,SMDAT:刚开始接触PCIE的时候这两个我就觉得比较奇怪,功能类似于IIC,或者PHY芯片的MDIO,MDCK管理总线,所以在想,这两个应该就是为了寻址用的,肯定是要设计进去的,而且网上很多资料都查询不到这两个脚的信息或者是说的稀里糊涂的,很多人甚至都不知道这两个信号的存在。其实,SMBus在x86处理器系统中得到了大规模普及,其主要作用是管理处理器系统的外部设备,并收集外设的运行信息,特别是一些与智能电源管理相关的信息。PCI和PCIe插槽也为SMBus预留了接口,以便于PCI/PCIe设备与处理器系统进行交互。所以从这段话中我们就找到了答案,这个确实是管理总线,典型的就是当有多个PCIE负载同时运行,需要用到这个总线进行查看各个负载的实时情况,或者有些负载必须要用到这个总线来读取寄存器的时候,则会用到。所以大多数时候我们都只是预留,以防万一,因为很多PCIE设备基本是不需要这个总线管理的。比如SSD,网卡,声卡等。下面的SSD电路我们看到:只有数据线时钟线,电源,WAKE,复位,CLKREQ,其他的全都不需要。而还有一个PCIE转网口的方案,挂载了一个PHY芯片,用到了这个总线,见下面第二图。所以结论:要看具体的挂载设备是否需要通过此总线进行寻址等配置,如果不需要,那么直接不用即可。
WAKE#信号与3.3Vaux:当PCIe的负载设备进入休眠状态时:3.3V会停止供电,但是3.3Vaux必须要用一个独立的电源保持一直有电状态【它是给EEPROM或者其他寄存器等供电的,功耗不大,使用LDO即可。】此时PCIe负载设备通过该WAKE信号向处理器系统提交唤醒请求,使处理器系统重新为该PCIe设备提供主电源3.3V。WAKE#是一个Open Drain信号,一个处理器的所有PCIe设备可以将WAKE#信号进行线与后,统一发送给处理器系统的电源控制器。当某个PCIe设备需要被唤醒时,该设备首先置WAKE#信号有效,然后再经过一段延时之后,处理器系统开始为该设备提供主电源Vcc,并使用PERST#信号对该设备进行复位操作。此时WAKE#信号需要始终保持为低,当主电源Vcc上电完成之后,PERST#信号也将置为无效并结束复位,WAKE#信号也将随之置为无效,结束整个唤醒过程。
当PCIE的负载不需要睡眠模式时:WAKE#便不需要了,因此使用WAKE#信号唤醒PCIe设备的机制也不需要了。WAKE默认拉低即可。另外,如果WAKE和通用GPIO脚可以复用,而此时不用WAKE,却想用来做GPIO口,那么一定要注意软件上把WAKE的底层代码直接删除掉,否则在使用时候会影响到PCIE。所以,很多时候大家在设计的时候,3.3V和3.3Vaux直接用同一个电源进行供电,保持一直有电就可以了。现在的固态硬盘SSD【原理图见上面】,基本都是采用这种模式。
JTAG:JTAG(Joint Test Action Group)是一种国际标准测试协议,与IEEE 1149.1兼容目前绝大多数器件都支持JTAG测试标准。JTAG信号由TRST#、TCK、TDI、TDO和TMS信号组成。其中TRST#为复位信号;TCK为时钟信号;TDI和TDO分别与数据输入和数据输出对应;而TMS信号为模式选择。主要用于芯片内部测试【板卡厂商自己调试板卡的过程】,所以我们在自己设计的时候,是直接用他们的板卡的,不需要我们进行调试了,这几个脚就不用了,直接悬空即可。
PWRGD或者PERST#:该信号为全局复位信号,这个就不说了,复位的重要性和功能就不多赘述了。其他的辅助功能可以不用,复位总不能也不要吧? 由处理器系统提供,处理器系统需要为PCIe插槽和PCIe设备提供该复位信号。PCIe设备使用该信号复位内部逻辑。当该信号有效时,PCIe设备将进行复位操作,一般都是低电平复位。我们设计时候直接默认拉高。
PRSNT1#:热插拔检测,这个和下面的这部分一起讲解。
PRSNT2#:和上半部分金手指的PRSNT1一起构成了PCIE负载板卡的检测,如下图所示:当金手指与核心板对插之后,PRSNR1直接接地了,而PRSNT2接到了CLKREQ上,本来CLKREQ是默认高电平的,对插之后,由于PRSNT1和PRSNT2的短路,直接被拉低,也就检测到了PCIE设备,输出同步时钟。所以在设计的时候,两个检测脚直接短接在一起即可。【当CLKREQ为低电平,其对应的时钟启动输出,否则不输出。这是热拔插的信号意义,也可以不使用REQ功能,直接在任何情况下都拉低。】
RSVD:保留针脚,和上半部分的是一个作用。如果有些PCIE设备支持CLKREQ功能,那么一般就可以作为CLKREQ来使用,如下图所示:
HSOP,HSON:这个就按照字面意思理解即可,接处理器的第0个通道的差分信号发送端。
HSIP,HSIN:这个也是,按照字面意思理解即可,接处理器的第0个通道的差分信号接收端。
REFCLK+,REFCLK-:接处理器的差分信号时钟,这个时钟不是上面差分数据的时钟,而是处理器和PCIE设备的同步工作时钟,要理解清楚。