“畫完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瀏覽量
34744 -
電磁波
+關注
關注
21文章
1503瀏覽量
55821 -
仿真工具
+關注
關注
0文章
38瀏覽量
11344 -
KiCAD
+關注
關注
6文章
324瀏覽量
10452
發布評論請先 登錄
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文件有哪些?
把Gerber變成電磁波:推薦一款基于Gerber的openEMS仿真工具 - gerber2ems
評論