
(已验证)四层M.2,PCIe协议FPGA加速卡
简介
(已验证)四层M.2,PCIe协议FPGA加速卡,使用Artix7 50T芯片,极致抠门极致省成本。 计算卡用途,只有PCIe接口部分引出,其他IO均未使用(除调试配置接口外)
简介:(已验证)四层M.2,PCIe协议FPGA加速卡,使用Artix7 50T芯片,极致抠门极致省成本。 计算卡用途,只有PCIe接口部分引出,其他IO均未使用(除调试配置接口外)开源协议
:Public Domain
描述
更新历史:V1.1 修正了一些拼写错误,添加了一点额外说明
目录:
1. 需求
2. 选型/设计考量
3. PCB设计/打样注意事项
4. 焊接/验证
5. 其他/参考资料
1. 需求
此卡主要是个人对FPGA加速计算卡的探索,同时作为在四层板下进行PCIe高速信号设计的一次尝试。基于这两点需求,赛灵思的Artix7系列的FPGA非常适合这类需求,最多4条PCIe2.0可以提供2GB/s的总带宽,随便玩玩应该是碰不上什么带宽瓶颈(最主要的是价格可以承受),另外,DDR内存肯定没法上了,在22x80mm的长宽限制下放进DDR至少需要6~8层板,打板价格又是另一个等级(有人可能想说免费打板,但接着看)。
另外得先说明白,这个板子是在KiCAD 8设计然后导入到LCEDA的(为了生成一个预览图和方便大家查看),原因是KiCAD自带了M.2插槽的封装用起来比较方便,如果真的需要修改/打板,请下载原工程,因为一我没有检查导入后是否都正常,二我在原工程里添加了很多注解。原工程和导出pdf原理图在附件里。BOM表也请以附件为准。
(给审核看的:原理图在项目页面预览异常,点进LCEDA后可以正常显示,求放过)
最后叠个甲:这玩意原本的设计目标就是究极丐中丐,用料拉胯,供电一坨,IO等于没有,在能用的前提下一切向成本低头。
仅供个人研究学习PCIe通信和FPGA加速计算方面的知识使用。
2. 选型/设计考量
设计非常简单,电路图大体只有三个部分,一个是FPGA和PCIE的连接,一个是电源,最后是一些配置Flash相关的电路。
FPGA:赛灵思Artix7 XC7A50T,484引脚封装版本,可用LUT约32K。LC全新110,x宝全新约70,小黄鱼剪板约30~40。

理论上可直接更换成相同封装的100T/200T来获取更多LUT资源,但是需要考虑两个问题,就是散热和供电。
首先是散热,50T版本,测试使用了四条PCIe链路,LUT利用率50%,在开放式+无散热片+无气流情况下,芯片温度轻松突破70度(内部XADC读出),这对于FPGA来说已经是比较危险的了。如果换成更大资源的版本,温升可能会更夸张。

其次是供电,M-Key的M.2插槽提供单3.3V供电,瞬时最大电流2.5A,对于大部分设备的供电应该都是足够了。

与此同时,赛灵思官方有提供7系列FPGA的功耗估算Excel表格: https://www.xilinx.com/products/technology/power/xpe.html
根据计算,XC7A50T在特别极限情况下可以汲取约3~4W功耗,其中1V轨电流最大(约3A)。因此,如果需要更换成更多资源版本,请自行修改供电部分,让1V电源轨提供足够多的电流,留足余量。
但还是不建议上任何大于此规模的FPGA,因为一颗50T满载的时候已经接近M2供电极限了(还要考虑DCDC损耗)


(两张图分别是计算结果和计算参数)
因为这个板子只用到了引脚中很少的一部分,空出来很多Bank和引脚,对于不用的Bank,官方说法(大致意思非原文)“Bank悬空可能导致ESD防护等级降低,建议将Bank供电以及所属引脚都接入等电势面上”(7 Series FPGAs
PCB Design Guide)
我的理解是不用的Bank以及所属引脚全接在一起。但是考虑到这部分引脚完全没有引出(全被藏芯片底下了),所以我只是将不用的Bank供电接地,Bank所属的引脚保持悬空。

下图是本次设计所使用的全部信号的电压标准,如果想接入别的信号,请务必阅读规范,确定电压标准。

电源:使用EA3059C芯片(注意后面带个C),三路输出,可以分别提供最大3/2/2A的电流,其中3A那路给1V,剩下分别出1.8V和1.2V,电感使用长江微电的TCore系列,1.5uH 4.5A电流。


Artix7系列FPGA的核心供电需要1V和1.8V电压,本设计使用了PCIe,还需要提供一路1.2V供收发器使用,最后因为Flash和JTAG,还需要一路3.3V电压给IO,以上共计四路。前三路由DCDC降压,而3.3V直接取自电源。
由于3.3V的IO供电直接取自插槽,因此需要检查插槽供电能否满足需求。M.2规范写定主机提供的3.3V供电电压波动5%以内,供电电流最大2.5A。而经过实际测量(我身边的台式机和笔记本),约为3.2V左右,符合标准,也能满足给JTAG和Flash的供电电压(一般也是5%误差内)。如果想得到一个稳定的3.3V,应该要先升压,然后再降压回来。
赛灵思的FPGA有一点比较好的地方,就是大部分型号的片子的上电时序都是“推荐”而非“必须”,只是如果不按照时序来上电可能会导致IO口的一些奇怪行为,在大型系统里面还是得注意一下。
当然,本设计中还是做了上电时序控制的,以避免PCIe可能潜在的问题。DCDC部分的上电顺序使用RC延迟电路,而3.3V供电经过一颗开关芯片,当1.8V电压出现后才开启3.3V的IO电压,最后的上电顺序是:1V、1.2V、1.8V、3.3V

(DCDC分压电阻需要自己计算,因为一来我记不清我用了哪些电阻了,二是很多时候我们不一定找得到和原理图上完全一样的阻值
自行计算,挑选合适的电阻即可)

(这个芯片有个内部限流功能,这里15K对ILIM下拉,等同设置1.7A限流值,绰绰有余)
Flash:华邦的128MBit Flash存储芯片。买的时候注意看封装,WSON-8封装有两种大小。下面是我用的

注:建议自行修改PCB更换成速度更快的Flash类型。因为现在这款Flash,FPGA初始化较慢,可能会导致主机第一次上电无法认出FPGA,需要重启才行。
3. PCB设计/打样注意事项
整板的设计围绕两个点展开,一是PCIE信号走线,二是M.2卡的外形规范。剩下的基本上是走通就行(当然供电部分可能也得考虑一下)
PCIe2.0的单链路频率来到了2.5GHz,属于是比较脆弱的高频信号。工程师也知道这玩意很脆弱,因此Artix7芯片里有均衡器,加上主板上一般都有retimer,应对这点速率的信号还是比较轻松的。
当然,有均衡器和retimer不代表着板级设计可以放飞走线和阻抗。四层板设计肯定是高速信号放在最优先那一级。首先把FPGA放到靠近接口的地方,供电后移,然后PCIe信号的过孔控制在2个(每根线),差分对组内严格等长(正/负等长),组间不做等长(PCIe可以这样干,别差的太离谱都行),顶层走线参考GND,底层走线参考1.2V平面,两个平面之间放置回流电容,信号线过孔旁边放回流过孔。
另外,设计中最小过孔为0.3/0.45mm,最小线宽线距为5/5mil,线宽线距需要根据阻抗进行调整,关于阻抗后文会提到。

然后是M.2卡的外形规范。M.2规范规定手指部分的厚度为0.8mm,如果PCB压成1.0mm厚度,负公差+斜边才可以插进去(而且比较困难)。0.8mm不需要斜边即可插入。本设计使用0.8mm厚度。

关于长宽,规范规定长度最大80mm,这肯定是没法超。然后宽度最大22mm,但是有个问题,484引脚封装的Artix7大小为23x23mm,如果还想加上外形框丝印,宽度就来到了24mm,本设计使用了24x80mm大小。
好在很多厂商给M2插槽周围预留了一定宽度余量,一般不需要担心。但是笔记本厂商可能真的会卡着规范来做(特别是轻薄本一类),比如我就遇到了(见下图),刚好能蹭着电池卡进去(高情商:固定螺丝都不用)

当然更好的方法就是更换FPGA封装,同样是XC7A50T,CSG325封装也有4条PCIe链路,尺寸比22mm小不少。但因为价格问题(指洋垃圾太少),本设计还是坚持使用484引脚封装。

关于阻抗控制,我选择控制在100欧姆(非共面差分),根据板厂不同,在保持最小线宽5mil或以上的前提下,0.8mm厚的四层一般只有两种层叠可以达到这个要求:一般是7628和2116。


我选择的是7628叠构,以5/5mil的线宽线距为基准,然后让CAM工程师帮我调整PCIe走线宽度和间距,确认生产稿,阻抗精度10%。本项目的资金大头也就花在了制板上,一般会花费200~300多不等。
(阻抗示意图)
如果你好奇阻抗准不准,我确实做了阻抗报告,顶层阻抗均值101欧,底层阻抗均值99欧。最大最小值均在10%内
最后是一些电源走线的考量,电源层由第三层和底层组成,其中通过电流较大的1V(最大3A)和1.2V(最大1A)占据了第三层主要空间,同时1.2V一直延申到PCIe线处作为底层参考面。输入进DCDC芯片的3.3V线路也放在第三层用较宽的铺铜,剩下1.8V和给IO的3.3V属于是能走通就行,几乎没什么电流。

层叠结构:F.Cu--In1.Cu--In2.Cu--B.Cu
4. 焊接/验证
焊接顺序很简单,先焊接电源,测试电压都正常后,再焊接FPGA和剩余部件即可。
其中需要注意的点是BGA器件的防潮和除湿,在焊接前一定一定要将芯片放入烤箱里以120~130度烘烤24小时(别偷懒),不然内部的水分在焊接时变成水蒸气顶炸芯片,炸一片还挺心疼的。
另外建议,如果购买的是带原厂无铅球的芯片,要么在PCB上刷一层锡膏,要么给芯片重新植成有铅低温球。因为无铅球的附着力比较差,在不做以上措施的前提下,一次焊接成功的概率较低,我选择了后者。

(重新植球中)
由于使用了0.8mm板厚,整个板子传热十分迅速,因此风枪温度不需要太高。我使用的150度有铅焊锡(不推荐,建议用183度含银有铅锡膏,因为更低温度的焊锡通常含有Bi元素,这玩意会导致焊锡很脆),全程260度热风焊接。
焊接完成后,使用万用表二极管挡,正极接地,负极探各个IO和手指部分,出现0.3~0.7v的压降即说明焊接正常。
前面的检查都没问题的话,就可以用JTAG上机了,Vivado应该能很顺利的认出来。
提示:板子里有个TVS二极管的焊盘,可以把测试电源从那里接进去

再接下来,就是对PCIe功能进行验证,这里我主要参考了:
1. https://blog.csdn.net/lum250/article/details/121318547 (XDMA Linux平台调试过程),参考这个生成了测试工程
2. https://numato.com/kb/getting-started-with-pci-express-on-aller-artix-7-fpga-board-with-m-2-interface/ ,参考引脚约束文件
3. https://github.com/Xilinx/dma_ip_drivers/ ,linux平台下的官方xdma驱动
这部分我就不写这么详细了,默认大家都已经具备相对应的基础,这里仅列出几个注意点。
首先引脚约束文件是基于参考2里面的教程修改而来的,我的板子上只有一个用户LED(AA18引脚),这个用户LED会用于指示是否成功和主机建立起PCIe连接。将这个LED和user_lnk_up信号相连即可。其他两个LED约束得删掉。
然后时钟引脚修改成E10和F10。PCIe复位信号接在了P16上,其他都不变。
注意,有些机器可能会出现插上这张卡后,关机又自动开机的问题,原因我怀疑可能出在PEWAKE信号上,主机监测到PEWAKE信号是低电平的话会自动开机。可以在BIOS里关掉PCIe唤醒,或者在FPGA里面设置上拉(对应引脚是N17)(但是不一定管用,我这台式机就总是被唤醒,而笔记本没问题)。如果有大佬知道具体原因可以在评论区告知。
测试系统使用的是Ubuntu20.04,不用安装到本地硬盘,直接从U盘LiveCD启动就可以完成所有测试,进了LiveCD后再下载驱动文件,如果网络不好可以先提前下载。
将M2卡插入主机,主机开机(给FPGA供上电),将比特流烧入FPGA,再将主机重启一次,如果PCIe连接成功建立,板子上的用户LED会亮起。之后进Linux系统,按照参考连接1的步骤编译、安装、测试驱动即可。下面是一些测试图片

(左边是用户LED,右边是DONE指示)

(成功建立4x5GT/s的连接,即2.0x4满速)

(安装驱动后成功识别xdma设备)

(测试通过)
5. 其他/参考资料
1. 原理图参考了极客堂电子的M2 FPGA卡,和油管主Phil's Lab的M2 FPGA卡设计,感谢无私的分享。
2.自己做着玩的,所以BOM表具体到型号没必要,核心器件就那么几个,剩下的电容电阻差不多是按经验挑。详情可以看附件
3.后续这张卡的玩法还在摸索中。现在主要的问题是怎样解决散热问题。
4.本来想用FPGA内部自带的眼图测试功能来测测信号质量的,但是折腾两天没弄明白,遂放弃
5.但是开学后可能会找实验室用示波器测测,权当学习一下怎样测量高速信号 了,如果有后续会更新到这里。
6.欢迎关注我的B站账号:怎么取名字这么难额啊
7.如果有什么疑问或者建议或者单纯的就是想骂两句,都十分欢迎在评论区留下您的想法!
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程工程成员
知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。


评论