虛擬麵包板
上一階你學到一個殘酷的事實:在真實板子上,佈線本身就是一個電路元件,而一張完美的電路圖仍可能失敗。但在板子之前還有一步——一個複製設計分文不費、犯錯只賠上幾秒鐘的地方。SPICE 是一支程式,它接過你的電路,藉由解開它的方程式,算出每一處的電壓與電流實際上會是多少。把它想成一塊虛擬麵包板:你把零件接好、按下執行,然後你不是聞到一股焦味,而是從一張圖上讀出答案。
這名字是個老縮寫——Simulation Program with Integrated Circuit Emphasis(積體電路導向的模擬程式)——1970 年代誕生於加州大學柏克萊分校,本是為了幫助晶片設計師,他們顯然沒辦法用麵包板去搭一顆埋在矽裡頭的電晶體。今天每一支認真的類比模擬器,都是那具原始引擎的後代。最有名的免費版本是 LTspice(來自 Analog Devices);許多工具底下包著的開源引擎是 ngspice;而大多數 EDA 套件(你上一階認識的那些電路圖加 PCB 的軟體,如 KiCad 或 Altium)都把一個 SPICE 模擬器附在編輯器旁邊,於是你能在動手鋪任何銅之前就先模擬。
網表與參考節點 0
在每一張畫得漂漂亮亮的電路圖底下,SPICE 其實是依著一份網表在運作——那是電路的原始碼,一份列出元件、以及它們所連接的各點的純文字清單。當你畫好電路圖、按下執行,工具會悄悄地把你的圖編譯成正是這份清單。每一個連接點——每一處導線的交會——都是一個節點,而每一行元件實際上是在說:「一顆 1.6 k 的電阻坐落在節點 in 與節點 out 之間。」
有一個節點很特別。每個電壓都是一個差值——一個讀數只有相對於某個講好的零點才有意義——所以 SPICE 要求一個參考,而它永遠叫做節點 0:也就是接地節點。這是模擬器釘進地裡的那根樁,是其餘所有節點電壓據以衡量的基準。忘了接上節點 0,模擬器就沒了錨點而拒絕執行;這是最常見的新手錯誤,而第 2 篇正是專講節點與接地。
* RC low-pass filter -- a SPICE netlist V1 in 0 AC 1 SIN(0 1 1k) ; source from node 'in' to ground (0) R1 in out 1.6k ; resistor between 'in' and 'out' C1 out 0 100n ; capacitor from 'out' to ground (0) .op ; DC operating point .ac dec 50 10 1Meg ; AC sweep: 10 Hz .. 1 MHz (Bode) .tran 0 5m ; transient: 0 .. 5 ms (the movie) .end
SPICE 如何把那份清單變成數字?靠的是節點分析——正是你曾用手算過的那套方法。它在每個節點寫下克希何夫電流定律(流入等於流出),把那些方程式堆成一個矩陣,一口氣解出所有節點電壓。當零件是非線性的(一顆二極體、一顆電晶體)、或牽涉到時間時,它沒辦法一次解完,於是它反覆迭代:猜測、檢查、修正、重複,直到數字不再變動。那個迴圈、以及當它就是不肯安定下來時會發生什麼,是這一階後面收斂的故事。
幾種核心分析一覽
模擬器不是只有一顆按鈕;它有一小族分析,每一種都向電路問一個不同的問題。第一種是直流工作點(`.op`):把每個電源凍結在它穩定的數值上,然後問:「一切會停在哪裡?」這正是你找出一顆電晶體靜態電流與電壓——它的偏壓、它的 Q 點——的方式,那是其餘每種分析都要立足其上的靜止狀態。如果工作點錯了,下游沒有一樣會對。
從那裡這一族開枝散葉。直流掃描讓一個電源在一段範圍內逐步變化、並把結果畫成圖——這是描出一顆二極體 I-V 曲線、或一個放大器轉移特性最自然的辦法。交流分析用一個微小的訊號在許多頻率上搖動電路,回報增益與相位對頻率的關係——那正是一張波德圖,幾秒鐘就替你畫好。而暫態分析讓時間像電影一樣往前跑,於是你能看著一個濾波器振鈴、一顆 555 振盪、或一條供電軌在負載跳動後如何恢復。
還有三種,即使在這個入門層次也值得記住名字。雜訊分析把每顆電阻與每個元件貢獻的隨機嘶聲全加總起來,告訴你電路的雜訊地板。蒙地卡羅分析把電路跑上數百次,每次都讓每個零件在它的容差範圍內隨機抖動一下,於是你看見一整批真實量產品——而非一份理想化的副本——會如何散布。而參數掃描則在某個數值(比方一顆電阻)逐項走過一張清單的同時,重跑任一種分析,於是你能看著一個設計的趨勢,而不是用猜的。這些你會不斷用到;它們各自會在第 3 篇及之後得到妥善處理。
模擬的好壞,全看它的模型
這裡是這一階最重要的一句話:模擬的好壞,完全取決於它的模型。 一顆電阻很簡單——SPICE 確切知道歐姆定律。但一顆二極體、一顆電晶體、一顆運算放大器呢?每一個的背後都站著一個元件模型:一束方程式與數字,用來近似那個真實零件的行為。模擬器並不認得你的零件;它認得的是你交給它的那個模型,而它會忠實地算出那個模型的後果——連同它所有的缺陷。
這正是為什麼有信譽的廠商會替每一顆認真的晶片,在它的資料表旁邊發布一份 SPICE 模型——常常是一個`子電路`(一個內部零件預先接好的小方塊)。把那顆運算放大器真正的原廠模型放進去,模擬就承接了它真實的失調、頻寬與轉動率極限。改用一個泛用的理想模型,你可能會得到一個漂亮、但真零件永遠端不出來的結果。最大的罪過,是去相信一個從沒人驗證過的模型所吐出的數字。
SPICE 看不見的東西
遲早,某次模擬會拒絕跑完——「收斂失敗」或「時間步長太小」。這很少代表電路壞了;通常是你要求解算器去做某件物理上彆扭的事,比方讓一個理想電源去和一個理想開關互相抗衡,而四下沒有任何電阻來吸收這個矛盾。哄好一個倔強的模擬是一種技巧,而不是一場驚慌。完整的工具箱在第 5 篇,但這裡先給你它的精神。
- 讀那則真正的錯誤訊息。SPICE 幾乎總會指出它卡住的那個節點、或那個時刻——從那裡開始查,別從頭查起。
- 在網表太過理想之處,加進一小劑現實:在一個完美電源上串一顆小電阻,或在一個節點上跨接一顆小電容,給解算器一個物理上抓得住的東西。
- 幫它找到起點:設定初始條件,或讓 SPICE 用較溫和的電源/gmin 步進,一步步走進工作點,而不是縱身一躍。
- 對一個快速的暫態,限制最大時間步長,好讓解算器無法一步跨過一個陡峭的邊緣、從而跟丟了整件事。
- 放寬容差只當作最後手段,而且一旦跑得動就把它們再調緊——一個收斂到錯誤答案的模擬,比一個誠實地失敗的模擬還要糟。
現在來到最深的一層誠實,也是這一階存在的理由。SPICE 解的是你打進去的那張電路圖——而電路圖是一則虛構,其中每一條導線都是完美的。它看不見你的佈線:兩條靠得很近的走線之間的雜散電容、一條長長的接地回流路徑的電感、一條細走線的電阻。那些寄生效應對一次預設的模擬而言隱形,在真實板子上卻具決定性,這也正是為什麼一個在 SPICE 裡頭呼嚕作響的電路,到了工作檯上可能尖叫起來。模擬便宜地抓住低級錯誤;它不取代動手搭與量測——它替你掙得一份有信心地動手的權利。