# 教程总述
**对于高速电路设计一直比较感兴趣,想自己做一个XX派,但苦于资料太少了。** 过去6个月在摸索中完成了全志H6开发板。相信肯定也会有其他小伙伴有类似的想法,因此就有了这样一个《从零入门ARM高速电路设计》教程。
**本教程,将给出一个可行的学习路径**,分享我自己在做的过程中的一些经验(看别人似乎挺容易的,但自己操作起来怎么那么难,eg. BGA焊接),以及设计过程中的一些考量。
考虑到高速电路设计本身就是一个复杂的领域,包含原理图设计,PCB设计,焊接和调试,软硬件联调等步骤,涉及了硬件工程师,PCB工程师,嵌入式软件工程师等岗位,很难由一个教程就将知识完全涵盖。**对于网络上面讲得比较好的内容,我会给出资源地址,推荐大家去读原文。对于缺乏的内容,我会补充自己的知识和经验。**
我作为高速电路设计的初学者,肯定有知识和经验上面的不足,要是有错误或者资料的补充,欢迎在评论区指出和补充。**大家可以一起完善这个教程。**
项目主页:[https://oshwhub.com/logicworld/h6_board](https://oshwhub.com/logicworld/h6_board)
# PCB设计
上部分已经完成了层叠阻抗的设计,现在开始正式布局和布线工作。
## 模块化布局
**布局部分高速板和低速MCU板的布局经验是类似的**,加上前面一节<密密麻麻的PCB>的培训视频中,也有比较多的讲解和演示,我这里简单做一个说明,我自己大概是怎么布局的。
1. **规划各个模块大致的摆放位置:**
1. 先把主控芯片放到板子的中心位置;
2. 再把DDR放置上去,调整DDR的方向和位置,使得从主控到DDR的信号线最顺。
3. 依次把eMMC,Wifi/BT模组,各种接口(SD卡,USB,HDMI等)放上去,也是看主控到器件的信号线怎么样最顺。
4. 之后,放置PMU和其他零碎的大器件。(PMU要后放是因为,它和主控间的信号连线不是那么明晰)。
5. 最后,再调整一下各个模块之间的放置关系,同时考虑小器件的摆放空间。
6. 每个模块的电阻,电容,电感等小器件,可以先不动。
7. Tip:可以使用飞线隐藏显示功能,只显示你关心的器件的飞线,这样可以看得清一些。具体见[LCEDA帮助文档-飞线小节](https://prodocs.lceda.cn/cn/pcb/view-ratline/index.html)。
2. **抓取每个模块的小器件,放到模块的附近:**
1. **大致根据信号的流向,放置这些小器件。尽量放到正面,方便后面的焊接**,实在没办法的时候,可以放到背面。典型的电容一般会放到背面,这样可以离芯片的电源管脚会比较近。
2. 如果,空间不够,可以整体移动一下模块的位置。
3. **放置小器件时,注意焊接是否方便。** 特别是使用烙铁焊接时,注意是否有放烙铁头的空间。
4. 此时不需要非常精细的位置,大致位置是对的就可以,后面布线时,还需要调整。
5. **其中DDR和主控芯片的去耦电容在此时就确定位置是困难的,可以先大致放到芯片的周围**,等后面DDR布线完成之后再考虑。除了这个部分以外,其他部分的器件应该都基本在其位置上面了。
6. Tip:可以使用布局传递功能,根据原理图选中相应模块的器件,将布局传递到PCB上面。具体见[LCEDA帮助文档-布局传递](https://prodocs.lceda.cn/cn/schematic/design-placement-transfer/index.html)。
3. 整体再做一下模块间的距离的调整,和小器件的微调。
1. **不知道模块和模块之间应该留多少空隙以供走线,我的方案是参考原厂标案来设计**,特别是DDR和主控芯片的间距是重要的,太长太短都会出问题,太短到时候绕等长没有空间,太长的话不满足信号线绝对长度要求。其他模块之间相隔远一些倒也问题不大,可以留足走线空间。
4. 至此就完成了模块化的布局,后面布线时发现问题依然是可以调整的。**这个部分我大约花了2天时间每天2-3个小时。**
## BGA扇出-原来是有套路的
**高速PCB的布线困难一个很重要的原因就是因为BGA的存在**,BGA的焊盘太过于密集,一个不小心就可能导致内部的焊盘走线走不出来。而且会随着芯片的pitch(即相邻焊盘中心的距离)减少,而困难明显增加,其中LPDDR3是0.8mm的pitch,H6/RK3399主控都是0.65mm的pitch,而eMMC是0.5mm的pitch。
### 对于0.65mm pitch的芯片
* 对于外面的2-3圈焊盘,见缝插针,尽可能从第一层拉出来。
![BGA出线_外圈.png](//image.lceda.cn/pullimage/S6oBLdFcV8OAJWMqhtK8Cbr36WzntYfgoFm3fBBn.png)
* 对于4-5圈焊盘,需要打8mil/16mil的过孔,从底层出线。
![BGA出线_4-5圈.png](//image.lceda.cn/pullimage/p0eF5AUie0ZHZ85AFxuJ9JLjpcwbICsML8YQFx8e.png)
### 对于0.5mm pitch的芯片
一开始我以为我的板子上面都是0.65mm及以上 pitch的BGA,直到我在拉eMMC的时候发现怎么都没有办法从两个焊盘之间拉出第二圈的焊盘。**查了一下才发现eMMC芯片竟然是0.5mm pitch的。** 如果,大面积的0.5mm pitch的芯片,那是需要盲埋孔才行,直接经费爆炸,常用于手机这样的高密度PCB上面(HDI)。查了一圈发现了[两种方案](https://www.amobbs.com/thread-5660013-1-1.html):
1. **切掉部分外圈的焊盘:** 来自[方案](https://oshwhub.com/gloomyghost/yuzukih616)
* 可以看到下图中eMMC的最外圈焊盘是一个扁椭圆形。
![emmc_切焊盘.png](//image.lceda.cn/pullimage/kXjzMZwmmLj03HCE1ukbktiYCXSAN20tfIWxfQCm.png)
2. **利用未连接(NC)焊盘(去掉NC焊盘或者挪为他用):** 这个是我目前采用的方案,不用重新制作封装库。
* eMMC里面有很多NC的焊盘,我们可以将这些焊盘利用起来,为我们的走线让步。
* 比如下图中,我使用的方案是EMMC-D4, EMMC-D6,VDDI占用了三个NC焊盘(C3,C5和C1)。
* **注意:最好去选定型号的eMMC芯片手册中看一下焊盘定义,确保他们是NC,而不是RFU。**
![emmc_重新定义焊盘_2.png](//image.lceda.cn/pullimage/RO3uMYbJMuOX49ePZPE421H9hGIwAPad07I4cm50.png)
### 各种pitch的扇出方案
**后来我在看视频的时候,发现了一个不错的视频,将各种pitch的芯片扇出都做了一下总结。** [《8层二阶盲埋孔飞行控制板PCB设计解析 | BGA出线设计》](https://www.bilibili.com/video/BV1gu411S7g1)。虽然视频主要是讲0.4mm/0.5mm pitch盲埋孔的扇出,但是,在P6部分,对于0.8mm/0.65mm pitch的芯片也做了一下演示。总结为三类情况:
1. 0.4mm/0.5mm pitch:盲埋孔;
2. 0.6mm/0.65mm pitch:8mil/16mil通孔,两个相邻过孔出不了线;
3. 0.8mm/1.0mm及以上pitch:8mil/16mil通孔,两个相邻过孔可以出一根线;
## 高速电路设计的大山-DDR与蛇形等长
### 什么叫蛇形走线?
**相信很多人都应该见过内存条上面弯弯绕绕的走线,这种走线方式就叫做蛇形走线。** 蛇形走线的目的是为了让多条信号线走线长度相等。
![内存条.png](//image.lceda.cn/pullimage/fuP1tuk1IMe2gyhhPTlc4nDLFF1AlJlIVJhNlyDg.png)
### 为什么要等长?
**走线长度相等的目的是为了让信号沿着不同的信号线从源端同时到达目标端。**
粗听这样一个目的,**会觉得光速那么快,板子那么小,能差多少时间呢。** 这句话在低速电路下,确实是成立的,也确实不会关心不同信号之间的时延问题。在低速电路中,我们都是假设从源端出发的信号,瞬间就到达目标端。
**但是,在高速场景下确实是一个需要关心的问题**,我们可以来简单做个计算。我目前的板子上面的DDR可以跑到888MHZ,因为DDR上升沿和下降沿都可传输数据,也就是每条传输1776M次数据,即1776MT/s。一次数据传输周期长度为1/1776M=5.63e-10秒=0.563纳秒。如果,两根数据线上面信号时间差超过了0.563纳秒的话,可以想见,前后的数据串了,CPU将读到错误的数据。
**那么,我们看看0.536纳秒信号在板子上面走了多远?** 真空中光速是3e8米/秒,板子中的信号传输速度[大约是1/2光速](https://blog.csdn.net/weixin_45875994/article/details/128458623),即1.5e8米/秒。因此,0.536纳秒✖1.5e8米/秒=0.0804米=8.04厘米=3200mil;实际中信号差要求是需要远小于一个数据传输周期的,比如:RK3399要求DQ和DQS之间差小于5皮秒(大约30mil),DQS差分线内部小于1皮秒(大约6mil)。RK3399板子的速率比较高,因此比较严格一些,**一般可以按照等长组内的最大信号线长度差要求在100mil以内,差分线长度差在10mil以内来办。**
### 哪些信号算一组?
这个问题一开始还折腾了我一段时间,网上信息很杂乱,也没有权威的说法。**后来我在RK3399的硬件设计指南里面找到了清晰的说明。** 以下用LPDDR3为例来讲,其他DDR可以参考RK3399的硬件设计指南。RK3399的硬件设计指南见[这里](https://www.mr-wu.cn/rockchip-rk3399-reference-design/)。
* 数据组:
* 分为4组:
* 第一组为DQ0-DQ7,DM0,DQS0P/DQS0M;
* 第二组为DQ8-DQ15,DM1,DQS1P/DQS1M;
* 第三组为DQ16-DQ22,DM2,DQS2P/DQS2M;
* 第四组为DQ23-DQ31,DM3,DQS3P/DQS3M;
* 组内的DQ和DQS小于5皮秒(大约30mil),可以放松为组内的最大信号线长度差要求在100mil以内。
* 四组数据组之间的时间差小于150皮秒(大约900mil),可以认为是比较容易满足的。
![rk3399_数据组.png](//image.lceda.cn/pullimage/0QbzDqJe4MoVNPDkp7LeWl6plbXLkBP5Ci19kb3Z.png)
* 控制/命令组:
* 只有一组,把除了数据组的信号外都放到这个组里面,包括:CLKP/CLKN,CSn, CKE, LPDDR3_A[0:9]。
* 组内的CLK和其他信号线小于5皮秒(大约30mil),可以放松为组内的最大信号线长度差要求在100mil以内。
* 和四组数据组的时间差小于150皮秒(大约900mil),可以认为是比较容易满足的。
![rk3399_控制组.png](//image.lceda.cn/pullimage/RKFBcLKZMOMWjzBARTbjwSPABKyTMMznwHJrebOy.png)
* 下面是我用LCEDA里面的等长网络组管理器,管理等长组:
![等长网络组管理器.png](//image.lceda.cn/pullimage/a5RjXk9bVDnqf6SDfpYQXOCbsuc06sg7Ol3RSAL2.png)
* **接下来就可以在界面中看到每个组内的线的长度了**;你也可以加一个设计规则约束,提醒自己是否满足等长要求了。
![等长应用.png](//image.lceda.cn/pullimage/qFtgi7PnTbZo5lB5MEBNuBTjS967TMEJFayqxd0I.png)
### 同组同层
**DDR布线时你会听到一个经验/规则叫同组同层,即DDR中同一组的信号线,要走在同一层**,比如:都走在顶层,或都走在底层,首尾位置打过孔和主控/DDR焊盘相连接。
**这么操作的目的也是为了信号线等时,因为,多一个过孔会对信号产生时延。** 如果同一组的信号线中过孔数量有多有少,那么,就不能简单的看信号线长度来估计时间了。必需采用Allegro里面的物理模型来估计信号时延,这个一般的PCB设计软件里面是没有的。
**因此,简单点的操作方式就是同组同层,然后,看信号线长度来估计信号延时。**
### 2W/3W线距约束
**一般来说重要的信号线(比如:CLK,CSn,CKE,LPDDR3_A)是需要满足3W要求**,剩下满足2W要求。3W是指两条信号线的中心距离为线宽的3倍及以上,即两条信号线的最近边的距离为线宽的2倍及以上。目的是为了减少信号线之间的串扰。[电路板走线分隔开多远才能减少串扰?设计中的经验规则 - 3W规则](https://www.bilibili.com/video/BV1K94y1F7mj)
因为,**我的50Ω阻抗线是5mil,宽于原厂标案的4mil,导致这个3W要求实在是难以完全满足。** 另外,3W要求往往在源端和终端是更难以满足的,因此,Allegro/AD里面可以设置规则放松源端和终端的线距要求。但是,LCEDA还没有这个功能,一旦全部设上3W的线距要求,那么,我怎么也满足不了,哪怕我是4mil的线宽。
**最终只能放弃这个要求,转而变成毛估估哪些线之间要线距宽一些,尽力而为。**
### DDR拉线
万事具备只欠拉线了,但是,**这个拉线可没有那么容易,完全是带着镣铐跳舞。** 你需要满足线宽(阻抗要求),满足有参考平面(阻抗要求),满足线距(生产工艺和信号防串扰要求),满足线长(信号等长/等时要求),同组同层(信号等时要求)等要求下,把线从主控拉到DDR。
**DDR的布线是整个PCB中最难的部分**,我找到了一个比较好的视频,[《DDR3高速PCB设计模块全流程实战》](https://www.bilibili.com/video/BV1oy4y1v7z1)。视频中演示了一根线一根线的拉通DDR和主控芯片,相信你看完之后,对于DDR布线有一个基本的感觉。
### LCEDA中的工具
**DDR的布线功能基本卡着LCEDA的边界在走**,比如:我刚开始画PCB时,LCEDA才上线了差分线的等长调节功能。画图前,你可以看看LCEDA的帮助文档,看看他们都有什么样的功能,比如:[差分线布线](https://prodocs.lceda.cn/cn/pcb/route-differential-pair-routing/index.html),[等长调节](https://prodocs.lceda.cn/cn/pcb/route-equal-length-tunning/index.html)。
接下来你就可以对着原厂的标案,在你自己的PCB上面开始实战DDR布线了。花上2-3天每天3小时左右,你就可以完成第一次DDR布线了。**最后,别忘了DDR走线的相邻层是需要有参考平面的,否则,DDR可能只能跑到100-200MHZ。**
## 拉线工程师
**当你翻过DDR这座大山之后,你的面前将是一片坦途。** 剩下的eMMC,USB,HDMI,SD卡,WIFI/BT,GPIO,按键等等都是只是时间问题。你只需要看一看硬件设计指南里面的注意事项(下图是一个24M晶振的例子),参考一下原厂标案的设计,然后花上一个星期每天2-3小时,就可以完成了。**等你拉了3-4天之后,基本上你就有拉线工程师,玩连连看的感觉了。**
PS:在你会画DDR之前,很可能是无法仅看设计要点就自己画PCB的,但是,画完DDR之后,那些设计要点里面的词汇,基本就没有什么新花样了。
![24M晶振.png](//image.lceda.cn/pullimage/4QumgqRiFWUaoCKBdXmACAh66H1EtPAO8EIUHTmw.png)
## 小结
**至此,你将完成PCB上面大部分的布局和布线工作**,下一部(也是PCB章节的最后一部分)将讲述电源和电源平面分割的设计。