工作中遇到這樣一件事情,某個新產品在靜電測試時遇到問題,FPGA總被復位;經過查找,這個產品主要的情況是:6層PCB,FPGA絕大多數走線在內層,且沒有跨分割之類的不符合規則的布線;沒有屏蔽外殼,地線(PE)在PCB板和結構中繞了個圈。結論是,做靜電測試時,靜電放電電流經過了較長地線路徑,產生了較大的輻射,干擾了FPGA(所以機殼地和電源地最好分開)。但有這個結論還不夠,怎么才能定量的確定多長的地線,怎么走的地線在靜電測試時不會對電路產生影響呢?
我找到的解決方案是使用電磁場仿真軟件。大名鼎鼎的Ansoft就有這樣的解決方案套裝。簡單介紹一下:
Maxwell:基于標量場(例如電勢)計算的電磁場仿真軟件,適合用來計算電機磁場、電容、特征阻抗等。
HFSS:基于S參數(解釋看這里)計算的電磁場仿真軟件,適合用來計算與電磁波相關的問題。
SIWave:用于計算信號PCB信號完整性和電源完整性。
與PSpice、Multisim之類的仿真軟件不同,上述這些仿真軟件是有限元分析軟件(解釋看這里)。
再提下兩個軟件:ADS和Hyperlynx。安捷倫的ADS(ADS = Advanced Design System,不是開發ARM的ADS),ADS雖然也能分析電磁波,但是它的分析方法是基于預設模型的,無法解決任意結構的電磁問題。舉個例子,假設你自己做了個很奇怪的連接器,你想知道這個連接器到底能傳輸多高頻率的信號,ADS是沒辦法仿真的。Hyperlynx是一個專門用于分析PCB上走線的信號完整性的軟件,同樣,它也是基于預設模型的。
在學習Ansoft軟件的過程中,我發現他們可以解決很多我之前很想知道,但什么書都說不明白問題。我決定開始寫一些關于信號完整性基礎的文章,這些文章都將是對我工作中遇到的一些問題的分析。先從信號完整性的本質開始吧。
我是一只魚(不靠譜工程師) 于2012年2月
信號完整性問題本質:1.信號傳輸延遲,2.反射造成的。
下圖是一個多層PCB上的傳輸線,為了方便理解,我把它弄成筆直的。圖中土黃色的是銅皮,綠色的是FR4,也就是PCB的基板。這是個“微帶線”,也就是PCB上相鄰層有地平面的表層走線:
在上圖中,下方是一個抽象的信號源端口,上方是一個抽象的負載端口。這個微帶線模型有150mm長,但只有2mm寬,這是因為信號傳播時的,微帶線周圍的電磁場主要分布在這2mm的區域中,所以沒有必要建立更寬的模型。
在實際電路中,傳播到負載端的電場強度被彈了回來,然后又被信號源彈了出去,然后又彈回來,如此往復。下文中,我們會對這個過程進行詳細的分析。
為了解釋信號完整性的本質,我們先來看這樣兩個信號完整性的基本公式,為了方便,我用Matlab的語法來寫,相信大家能看懂:
v = c / sqrt(ε) (1)
Γ = (Z1 - Z0) / (Z1 + Z0) (2)
式1是介質中電磁波傳播速度的計算式,v是介質中的電磁波傳播速度,c是真空光速,ε是介質的介電常數。真空的介電常數為1,空氣比真空大一點點,其他材料的介電常數都大于1。也就是說,不管電磁波或者導線里的電信號在什么東西里傳播,速度都要比光速慢。
式2是信號在傳輸時遇到不同的介質,例如,從芯片管腳到PCB走線時的反射系數計算公式,以此為例,Z1是PCB的阻抗,Z0是芯片管腳的阻抗。這個公式指出,一旦傳輸介質的阻抗不同,信號就會出現反射;這個現象和高中物理學的,光線在空氣和玻璃的界面發生反射很像吧。
假設我們要在PCB上的一條走線上傳輸信號,雖然電路原理認為信號以光速傳播,但是在介質(PCB基板、綠油等材料)的環繞下,速度會慢一些,假設一個很短的脈沖在PCB上傳輸時,因傳輸速度快很可能負載還沒有接收到信號,信號源已經發送完了。
一般情況下,PCB的走線的阻抗和信號源芯片、負載芯片管腳的阻抗都不一樣,這樣信號到達負載芯片的時候,又被反射向信號源,反射回來的信號會疊加在原來的信號上,讓信號出現失真;對大多數芯片來說來說,負載芯片管腳的反射,會讓信號的幅度變為原來的2倍或更多(不要想到直流信號去了,我們一直在講變化的信號)。如果只是變成原來的2倍我們也就忍了,但是負載芯片反射回信號源芯片的信號到達信號源芯片的管腳上,又會發生二次反射,再反射向負載芯片,疊加在原來的信號上;假設傳輸的信號是一個很短的脈沖,在二次反射到來前的這段時間里,負載芯片管腳上的電壓一般已經穩定了,而再次到來的二次反射信號會讓負載芯片管腳的電壓再次發生變化——這就造成了傳輸波形的嚴重失真。下面這張圖簡述了這個過程。不過本文所用信號第一次反射到達信號源時,信號源輸出已恢復為零,所以下圖忽略了反射與信號源的疊加。
上述我們對信號傳輸過程中造成的變化有了一個大概的認識,現在解釋下PCB的阻抗是怎么回事。電路原理認為信號在導體中傳輸是不會遇到阻礙的,但實際情況是,PCB上的走線是有“分布參數”的,也就是,走線雖然沒有繞圈,也會存在電感;走線雖然與地平面的相對面積很小,也會存在電容。電容和電感的交流阻抗公式:ZC = 1 / jωC,ZL = jωL,可以看出,雖然PCB走線的分布參數很小,但當信號的頻率ω足夠大時,ZC和ZL就會發揮作用。
我們可以將傳輸線微元化,將每一段微元建立起這樣的RLCG模型:
則可推導出微元的阻抗為Z0 = sqrt((R + jwL) / (G + jwC))。對于一般的PCB,由于R很小,G很大,微元的阻抗可以簡化為Z0 = sqrt(L / C),這就是傳輸線的特征阻抗。需要注意的是,特征阻抗是用于交流信號的;另外,公式中的RLCG,都與傳輸線自身的結構有關。
如果有點暈了,就只需要記住,對于高頻信號,PCB的走線不再是良好的導體。
回到v = c / sqrt(ε)和Γ = (Z1 - Z0) / (Z1 + Z0)這兩個公式,假設信號源阻抗為20歐、PCB走線特征阻抗為40歐、負載阻抗為1000歐,我們再來看看信號的傳輸過程,看下面這張圖,這是對上面的微帶線模型仿真的結果:
圖中,紅色的是信號源波形,藍色的是負載端波形,綠色的是信號源反射波形。可見,信號源波形剛進入微帶線就發生了反射,反射系數為Γ = (40 - 20) / (40 + 20) = 0.33,圖中反射波形的幅值恰好就是信號源波形的0.33倍左右(紅線和綠線最高點縱坐標),這個反射波形同時疊加在信號源上,輸出到微帶線上,也就是說,傳輸信號峰值實際為1.33V。當微帶線上的信號到達負載端時,再次發生反射,反射系數為Γ = (1000 - 40) / (1000 + 40) = 0.92,這個反射的波形同時疊加在傳輸波形上,輸入負載端,也就是說,負載端接收到得信號峰值實際為1.33 * (1 + 0.92)= 2.55(V),圖中負載端信號的幅值恰好就是2.5V左右。
如果負載端信號幅值變大我們也就忍了,問題是還有傳輸延遲,和傳輸延遲造成的二次反射疊加。
紅色波形的最大值與藍色波形的最大值之間相差大約1ns,用v = c / sqrt(ε)驗算下,v = 3.0e8 / sqrt(4.2) = 1.46e8(m/s),這段微帶線的長度為150mm,所以傳輸延遲t = s / v = 0.15 / 1.46e8 = 1.03e-9(s),也就是1.03ns,這和仿真結果是吻合的。我們再來看從負載端反射回去的波形,經過1.03ns,在3.56ns左右,從負載反射回的波形到達信號源,同時又被信號源反射回了負載(這一次反射系數是負的,請自行計算),又經過1.03ns,在4.6ns左右,又反射到了負載端,出現一個負向波形,然后又被反射……像踢皮球吧?本來一個漂漂亮亮的紅色波形,被踢成了藍色波形那個丑樣。
再說一次,造成信號完整性問題的本質是傳輸延遲和信號反射。
解決信號完整性問題有兩個思路:消除傳輸延遲和消除信號反射。消除傳輸延遲,那就是超光速,以現在的人類科技是做不到了,只有消除信號反射了,從Γ = (Z1 - Z0) / (Z1 + Z0)這個式子看,只要Z1 = Z0,Γ不就是零了嗎?這就是所謂的阻抗匹配。很多的書上說了很多的阻抗匹配的方法,這里我就不再贅述了。給出一個阻抗匹配的仿真結果:
圖中,紅色的是信號源波形,藍色的是負載端波形,綠色的是信號源反射波形??梢姡杩蛊ヅ鋾r,波形反射幾為0,信號波形除了那該有的1.03ns傳輸延遲,沒有失真。