“畫完PCB,打板之前,你是不是也心里打鼓:
“這根差分線到底90 Ω還是88 Ω?Stub 會不會把 5 GHz 信號打回原形?”
跑去借 50 GHz 網絡分析儀?貴到哭。
用商業 SI 軟件?授權費能再買一輛車。
別急,今天給你安利一個寶藏項目:gerber2ems,結合開源的 openEMS solver, 讓你用家里電腦能跑 3D 全波 FDTD,直接看 S 參數、阻抗曲線,還帶動畫的那種!”

項目背景Antmicro 這幫老哥日常給 FPGA、RISC-V 板子做高速接口,信號完整性必須過關。可他們偏偏鐘愛開源:KiCad 畫板、openEMS solver。于是干脆寫了 gerber2ems:把“Gerber + 鉆孔+ 疊層”一鍵翻譯成 openEMS 能吃的 3D 模型,跑完還能跟 VNA 實測對波。項目指路
GitHub地址:https://github.com/antmicro/gerber2emsLicense:Apache 2.0
關于 openEMS 的使用,可以參考:
gerber2ems 是一個 Python 腳本,旨在使用開源工具簡化信號完整性(SI) 仿真流程。它接收 PCB 生產文件(Gerber、鉆孔文件、疊層信息)作為輸入,并使用openEMS來仿真走線的信號完整性性能。openEMS 是一款免費開源的電磁場求解器,采用FDTD(時域有限差分) 方法:
https://github.com/thliebig/openEMS-Project/
安裝
安裝 OpenEMS
安裝以下軟件包 (在 Debian/Ubuntu 上):
sudo aptupdatesudo apt install build-essential cmake git libhdf5-dev libvtk9-dev libboost-all-dev libcgal-dev libtinyxml-dev qtbase5-dev libvtk9-qt-dev cython3 pippip install--break-system-packages numpy scipy matplotlib h5py setuptools# 推薦使用此命令,因為 Debian 安裝的 numpy 版本較舊,常導致版本沖突
克隆倉庫、編譯并安裝openEMS。
建議使用bb991bb3這次提交 (commit),這是與 gerber2ems 一同測試過的最新版本。
gitclonehttps://github.com/thliebig/openEMS-Project.gitpushd./openEMS-Projectgit checkout bb991bb3git submodule update --init --recursive./update_openEMS.sh ~/opt/openEMS --pythonpopd
安裝 gerber2ems 腳本
1. 安裝依賴:
sudoapt install gerbv python3.11pipxpipxensurepath
2. 克隆并安裝gerber2ems:
gitclonehttps://github.com/antmicro/gerber2ems.gitpushd./gerber2emspipx install --system-site-packages .popd
注意:如果你想使用ems2paraview命令,還需運行sudo apt install paraview python3-paraview。
你可以使用內置的示例來測試gerber2ems。這些示例是我們的開源硬件信號完整性測試板(https://openhardware.antmicro.com/boards/si-simulation-test-board/)的切片,使用KiCad SI wrapper生成。部分選定的示例在專用的vna.csv文件中包含了VNA(矢量網絡分析儀) 的測量數據,這使我們能夠將 openEMS 的仿真結果與真實世界的測量數據進行比較。
cd./gerber2ems/examples/stub_shortgerber2ems -a
使用方法
如需快速查閱,請使用gerber2ems --help。
要仿真一條走線,請遵循以下步驟:
-
準備輸入文件并將它們放入
fab/文件夾 (詳見PCB 輸入文件準備部分)。 -
準備配置文件
simulation.json(詳見配置準備部分)。 -
運行
gerber2ems -a(過程詳見幾何結構創建部分)。 -
在
ems/results目錄中查看結果 (詳見結果部分)。 -
運行
gerber2ems -a --export-field并使用Paraview查看電場動畫 (詳見Paraview部分)。
結果
下面展示了stub_short示例的仿真輸出。該軟件返回以下幾類輸出:
S 參數和阻抗數據
仿真過程中收集的阻抗和 S 參數數據,以帶表頭的 CSV 格式存儲。
S 參數圖表
每次激勵期間測量的各 S 參數的圖表。

史密斯圓圖
每次激勵的 S-11 參數圖。

阻抗圖表
每個激勵端口的阻抗隨頻率變化的圖表。

stub_short示例包含一個vna.csv文件,可用于驗證仿真結果。

工作原理
項目準備
仿真整個 PCB 對資源消耗極大,因此,盡可能分離出一個小尺寸的感興趣區域:不需要的走線、鋪銅等都應移除。如果整個層都是多余的,你可以在后續步驟中移除它們。
應在坐標文件中使用虛擬元器件標記感興趣的端口。其標號應以 "SP" 開頭,后跟端口號。
鉆孔文件的原點應置于左下角。
在現實中被端接且會存在于仿真中的每條走線或鋪銅,都應使用仿真端口進行端接或連接到地。
目前,電容不參與仿真。對于高頻仿真,可以用一條走線將其短路來近似處理。
PCB 輸入文件準備
腳本需要多個輸入文件來創建幾何結構。這些文件都應位于 "fab" 文件夾中,具體如下:
-
Gerber 文件- 每個需要仿真的銅層都應有一個對應的 Gerber 文件,命名格式如下:
"<可選文本>-<來自疊層文件的名稱>.gbr" -
疊層文件- 一個描述 PCB 疊層的文件,名為
stackup.json。格式示例:
{"layers":[{"name":"F.Cu","type":"copper","color":null,"thickness":0.035,"material":null,"epsilon":null,"lossTangent":null},{"name":"dielectric 1","type":"core","color":null,"thickness":0.2,"material":"FR4","epsilon":4.5,"lossTangent":0.02}],"format_version":"1.0"}
-
鉆孔文件- Excellon 格式的帶電鍍通孔的鉆孔文件。文件名應以
"-PTH.drl"結尾。 -
坐標文件- 描述端口位置的文件。文件名應以
"-pos.csv"結尾。-
坐標應相對于左下角給出。
-
端口的區域根據
simulation.json文件中的Width(寬度) 和Length(長度) 值,使用下表中的公式計算:
-
| 旋轉 [°] | X 范圍 | Y 范圍 | 波傳播方向 |
| 0 | (PosX?Width/2,PosX+Width/2) | (PosY,PosY+Length) | 沿 Y 軸 |
| 90 | (PosX?Length,PosX) | (PosY?Width/2,PosY+Width/2) | 與 X 軸相反 |
| 180 | (PosX?Width/2,PosX+Width/2) | (PosY?Length,PosY) | 與 Y 軸相反 |
| 270 | (PosX,PosX+Length) | (PosY?Width/2,PosY+Width/2) | 沿 X 軸 |
-
文件示例:
# Ref Val Package PosX PosY Rot SideSP1 Simulation_Port Simulation_Port 3.0000 11.7500180.0000 top
配置準備
simulation.json文件用于配置整個仿真過程。你可以在example_gerbers文件夾中找到示例文件。此文件中的所有尺寸單位均為微米 (micrometers)。該配置文件包含三個部分:
雜項
-
format_version- 指定配置文件的格式。編寫新配置時,應使用最新的支持版本 (可在constants.py文件中查看)。 -
frequency-start指定了感興趣的最低頻率,stop指定了最高頻率 (單位:Hz)。 -
max_steps- 仿真的最大步數,達到此步數后仿真將無條件停止。 -
pixel_size- 像素大小,單位為微米。用于 Gerber 轉換 (默認值:5) (由于 libcairo 的限制,對于較大的板子需要增加此值,但應盡量保持其盡可能小)。 -
via/plating_thickness- 過孔電鍍層厚度 (單位:微米)。 -
via/filling_epsilon- 過孔填充材料的介電常數。如果未填充,則應為 1。
網格
-
inter_layers- 相鄰 PCB 層之間 Z 軸上的網格線數量 (默認值:4)。 -
optimal- 基本網格間距 (單位:微米) (用于金屬邊緣的單元) (默認值:50)。 -
diagonal- 網格間距 (單位:微米) (用于有對角線路徑的區域) (默認值:50)。 -
perpendicular- 網格間距 (單位:微米) (用于路徑與網格垂直的區域) (默認值:200)。 -
max- 最大網格間距 (單位:微米) (用于板區之外) (默認值:500)。 -
cell_ratio/xy- 最佳相鄰單元尺寸比 (X/Y 軸) (默認值:1.2)。 -
cell_ratio/z- 最佳相鄰單元尺寸比 (Z 軸) (默認值:1.5)。 -
margin/xy- X/Y 軸的邊距大小 (單位:微米) (網格超出 PCB 的距離) (默認值:1000)。 -
margin/z- Z 軸的邊距大小 (單位:微米) (默認值:1000)。 -
margin/from_trace- 根據感興趣網絡的邊界框限制仿真空間 (默認值:True) (如果為 False,則使用板的邊界框)。
網格間距選項應遵循:
optimal<=diagonal<=perpendicular<=max<=λmin/10端口
ports是一個端口列表。每個端口都有以下參數:
-
width- 端口寬度 (單位:微米)。 -
length- 端口長度 (端口目前由微帶線片段組成,其長度應至少為網格單元尺寸的 8 倍) (單位:微米)。 -
layer- 端口所在的銅層編號 (從頂部開始計數)。 -
plane- 微帶線參考平面所在的銅層編號 (從頂部開始計數)。 -
excite- 仿真器是否應將此端口用作輸入端口 (對于多個激勵端口,它們將在單獨的仿真中被激勵)。
差分對/走線
differential_pairs/traces是被仿真信號的列表。每個信號可以有以下字段:
-
start_p,stop_p,start_n,stop_n- 用于信號的端口號 (差分對)。 -
start,stop- 用于信號的端口號 (單端走線)。 -
name- 可選名稱,用于識別信號。 -
nets- 在生成網格時要包含的網絡列表 (例如["/CSI_A_CLK_N","/CSI_A_CLK_P"])。如果未指定,將使用netinfo.json文件中的數據。如果該文件也不存在,則在生成網格時會考慮所有網絡 (GND除外)。
幾何結構創建
這是一個通過-g標志啟動的自動步驟。該腳本會定位創建幾何結構所需的所有文件 (Gerber、鉆孔文件、pnp 文件、疊層文件、仿真配置文件)。然后,它使用gerbv將 Gerber 文件轉換為 PNG。接著,這些 PNG 被處理成三角形并輸入到幾何結構中。此過程還會添加過孔和端口的幾何形狀。所有物體都根據疊層文件放置在正確的 Z 軸高度上。
你可以使用AppCSXCAD(在安裝 openEMS 時已安裝) 查看生成的幾何結構,它被保存在ems/geometry/geometry.xml文件中。
仿真
這是一個通過-s標志啟動的自動步驟。該腳本會加載幾何結構和配置文件。它將所有信息輸入引擎并開始仿真,對每個激勵端口進行迭代。
在這一步,用戶應驗證指定的時間步數是否足夠。引擎建議它至少是脈沖長度的 3 倍:
```激勵信號長度為: 3211 時間步 (3.18343e-10s)最大時間步數: 10000 ( --> 3.11429 * 激勵信號長度)```
仿真器將幾何結構轉換為 voxels,并開始為網格中的每個邊求解麥克斯韋方程組。它會執行一定數量的時間步 (在配置中指定的最大數量),然后退出。對于每個時間步,來自銅層之間平面的電場數據被保存到ems/simulation文件夾的文件中。端口電壓和電流數據也會被保存。
在仿真過程中,其中一個端口使用高斯脈沖(具有寬帶頻率內容) 進行激勵。這個脈沖穿過網絡并從其他端口輸出 (也可能輻射到板外)。
你可以通過查看引擎輸出來監控仿真過程:
[@ 20s] 時間步: 4620 || 速度: 294.4 MC/s (3.372e-03 s/TS) || 能量: ~4.16e-16 (- 7.15dB)
通過這種方式,你可以看到:
-
當前處于哪個時間步
-
仿真器每秒處理多少網格體素
-
系統中剩余多少能量
在仿真過程中,能量應隨著其通過端口離開而下降 (激勵脈沖結束后),但由于不精確性和輻射能量,它不會降到 0。
仿真結束后,用戶可以使用Paraview驗證數據 (在下文的一個章節中描述)。
后處理
這是一個通過-p標志啟動的自動步驟。該腳本會加載每個激勵端口的仿真數據。然后,它進行FFT(快速傅里葉變換) 以獲取頻域數據。接著,它將入射波和反射波數據轉換為阻抗和 S 參數。這些數據以 CSV 格式保存在ems/results/S-parameters文件夾中。這些數據也會被自動繪制成圖表,圖表保存在ems/results中。
Paraview
要在 Paraview 中查看仿真數據,請遵循以下步驟:
-
運行
gerber2ems -a --export-field -
運行
ems2paraview
是一個仿真的端口號,在simulation.json中定義,要列出所有可用端口,請使用:ems2paraview -l。
dump locations可以省略 ,或者你可以從以下列表中選擇一個或多個關鍵字:
-
outer- 在板表面上方 100 微米處轉儲場 -
cu-outer- 在外部銅層的 Z 坐標位置轉儲場 -
cu-inner- 在內部銅層的 Z 坐標位置轉儲場 -
substrate- 在每個介電層的中間轉儲場
--oversampling - 可以添加此項以增加導出場的頻率 (通常 OpenEMS 每幾百個時間步轉儲一次 Field) (默認值為 4)。
警告
Field 導出文件可能輕易占用數百 GB 的存儲空間。
動畫
要生成動畫,按以下步驟操作:
-
生成一個 PCB 的 blend 模型 (參見picknblend:https://antmicro.github.io/picknblend/quickstart.html)
-
使用
--export-field標志并增加過采樣率 (--oversampling 16) 運行gerber2ems -
將生成的
*.vtr文件轉換為灰度 png 圖片 (運行ems2png) -
在blender中打開 PCB 的 blend 文件,并附加
EMS_Plane(File>>Append..>>EMS_Plane.blend/Object/EMS_Plane) -
設置平面尺寸 (它應與切片大小大致相同)
-
進入Shading(著色) 工作區
-
在左側的每個紋理節點中,點擊文件夾圖標并選擇第三步生成的編號最小的 png (例如,第一條走線使用
simulation_images/e_field_0_0000,第二條使用simulation_images/e_field_1_0000)。 -
如果動畫只需要顯示一條走線,用一個設置為黑色的 RGB 節點替換掉另一個紋理節點。
-
在紋理節點上,將源類型從Single Image(單個圖像) 更改為Image Sequence(圖像序列),并用相應走線生成的圖像數量更新Frames(幀數) 字段。
-
將視圖模式設置為rendered(渲染),并將
EMS_Plane定位在 PCB 紋理上相應走線的正上方 (你可能需要切換到一個場較強且覆蓋大部分走線的幀)。 -
選擇
EMS_Plane并在圖像序列的第一幀和最后一幀應用任意類型的關鍵幀。 -
在
blendcfg.yaml中添加一個新的預設:
ems_animation:CAMERAS:PHOTO1: truePOSITIONS:TOP: trueRENDERER:FPS: 25SCENE:RENDERED_OBJECT: Object/EMS_PlaneOUTPUTS:- ANIMATION:
13. 運行pcbooth -b .blend -c ems_animation
提示
可以考慮創建一個新的 blend 文件,而不是直接使用picknblend的輸出。在這個新文件中,將picknblend的輸出作為鏈接的 blender 模型添加進來。這將允許你重復使用基礎的 blender 模型來展示不同的走線仿真,并能防止gerber2blend/picknblend意外刷新模型。
結束語
雖然gerber2ems目前對復雜電源網絡仿真支持有限,且大板子仍需高性能硬件支持,但它無疑為硬件開發者打開了信號仿真民主化的大門。下次做SI驗證時,不妨讓它幫你省下幾千刀軟件費!-
Gerber
+關注
關注
3文章
151瀏覽量
34671 -
電磁波
+關注
關注
21文章
1503瀏覽量
55705 -
仿真工具
+關注
關注
0文章
38瀏覽量
11328 -
KiCAD
+關注
關注
5文章
321瀏覽量
10394
發布評論請先 登錄
Allegro 轉Gerber 注意事項Gerber RS274D( 以Gerber6x00 為主)
怎么做GERBER文件?GERBER文件包含哪些內容?
怎么做GERBER文件?GERBER文件包含哪些內容?
gerber
Protel 99 SE轉gerber文件步驟
ad09, gerber這個如何使用?
AD輸出Gerber提示Gerber failed to match all shapes的解決
詳解Altium Designer生成Gerber文件
Allegro轉Gerber注意事項
gerber文件是什么?gerber文件有哪些?
pcb如何生成gerber文件
把Gerber變成電磁波:推薦一款基于Gerber的openEMS仿真工具 - gerber2ems
評論