# KiCad DRC設計規則    ## 頂層語句 (Top-level Clauses) 在 KiCad 中,設計規則檔案的語法由頂層語句開始,以下是常見的頂層語句: ```plaintext (version <版本號>) (rule <規則名稱> <規則語句> ...) ``` - **`version`**:指定語法版本,應設為 `1`。 - **`rule`**:定義一個規則,包含規則名稱與規則語句。 範例: ```plaintext (version 1) (rule "HV" (constraint clearance (min 1.5mm)) (condition "A.hasNetclass('HV')")) ``` ## 規則語句 (Rule Clauses) 規則語句用於描述設計規則的細節,以下是常見的語句: - **`constraint`**:定義約束條件。 - **`condition`**:指定規則的條件。 - **`layer`**:指定規則適用的層。 - **`severity`**:設定違規的嚴重程度。 範例: ```plaintext (rule "HV" (layer "outer") (constraint clearance (min 1.5mm)) (condition "A.hasNetclass('HV')")) ``` ## 常見約束類型 (Constraints) 以下列出一些常見的約束類型及其用途: | 約束類型 | 變數類型 | 描述 | |----------|----------|------| | `clearance` | `min` | 定義不同網路銅箔對象的電氣間隙。 | | `track_width` | `min/opt/max` | 檢查走線的寬度。 | | `hole_size` | `min/max` | 檢查焊盤或貫孔的鑽孔大小。 | | `edge_clearance` | `min/opt/max` | 檢查對象與板邊的間隙。 | | `thermal_relief_gap` | `min` | 指定熱焊盤與敷銅區域的最小間隙。 | | `annular_width` | `min/opt/max` | 檢查貫孔的孔環寬度。 | | `assertion` | `"<expression>"` | 檢查給定的表達式。 | | `courtyard_clearance` | `min` | 檢查封裝 Courtyard 之間的間隙。 | | `diff_pair_gap` | `min/opt/max` | 檢查差分對中耦合走線之間的間隙。 | | `diff_pair_uncoupled` | `max` | 檢查差分對正負走線非耦合部分的間隙。 | | `disallow` | 項目類型列表 | 指定一個或多個對象類型不被允許。 | | `hole_clearance` | `min` | 檢查焊盤或貫孔中的鑽孔與不同網路的銅箔對象之間的間隙。 | | `hole_to_hole` | `min` | 檢查焊盤和貫孔中機械鑽孔之間的間隙。 | | `physical_clearance` | `min` | 檢查給定層上兩個對象之間的間隙,包括非銅層。 | | `length` | `min/max` | 檢查符合規則條件的網路的總走線長度。 | | `silk_clearance` | `min/opt/max` | 檢查絲印層上的對象與其他對象之間的間隙。 | | `skew` | `max` | 檢查符合規則條件的網路的偏斜值。 | | `via_count` | `max` | 計算每個與規則條件匹配的網路的貫孔數量。 | | `zone_connection` | `solid/thermal_reliefs/none` | 指定焊盤與敷銅區域之間的連接方式。 | 範例: ```plaintext (rule "Pad to Track Clearance" (constraint clearance (min 0.2mm)) (condition "A.Type == 'Pad' && B.Type == 'Track'")) ``` ## 表達式函數 (Expression Functions) 表達式函數用於檢查對象的屬性或關係,以下是一些常見的函數: - **`A.hasNetclass('<netclass_name>')`**:檢查 A 是否屬於指定的網路類別。 - **`A.intersectsArea('<zone_name>')`**:檢查 A 是否與指定區域相交。 - **`A.isPlated()`**:檢查 A 是否有鍍敷孔。 - **`A.memberOfFootprint('<footprint_reference>')`**:檢查 A 是否屬於指定的封裝。 - **`A.enclosedByArea('<zone_name>')`**:檢查 A 是否完全位於指定區域內。 - **`A.existsOnLayer('<layer_name>')`**:檢查 A 是否存在於指定層。 - **`A.fromTo('x', 'y')`**:檢查對象是否存在於兩個指定焊盤之間的銅路徑上。 - **`A.getField('<field_name>')`**:獲取指定欄位的值(僅適用於封裝)。 - **`A.hasComponentClass('<component_class_name>')`**:檢查 A 是否屬於指定的元件類別。 - **`A.isMicroVia()`**:檢查 A 是否為微型貫孔。 - **`A.isBlindBuriedVia()`**:檢查 A 是否為盲埋貫孔。 - **`AB.isCoupledDiffPair()`**:檢查 A 和 B 是否為同一差分對的成員。 範例: ```plaintext (rule "copper keepout" (constraint disallow track via zone) (condition "A.intersectsArea('zone3')")) ``` ## 違規等級 (Severity Names) 違規等級用於設定規則違反時的嚴重程度: - **`warning`**:警告。 - **`error`**:錯誤。 - **`exclusion`**:排除在外。 - **`ignore`**:忽略。 範例: ```plaintext (rule "silk_board_edge_clearance" (constraint silk_clearance) (severity ignore) (condition "A.memberOfFootprint('J*') && B.Layer=='Edge.Cuts'")) ``` ## 更多範例 ### 定義差分對間隙 ```plaintext (rule "dp clock gap" (constraint diff_pair_gap (opt "0.8mm")) (condition "A.inDiffPair('/CLK')")) ``` ### 防止焊料從 SMD 焊盤吸走 ```plaintext (rule "holes_in_pads" (constraint physical_hole_clearance (min 0.2mm)) (condition "B.Pad_Type == 'SMD'")) ``` ### 確保元件與電路板邊緣的機械間隙 ```plaintext (rule "front_mechanical_board_edge_clearance" (layer "F.Courtyard") (constraint physical_clearance (min 3mm)) (condition "B.Layer == 'Edge.Cuts'")) ``` ### 禁止貫孔蓋油處有絲印 ```plaintext (rule "silk_over_via" (constraint silk_clearance (min 0.2mm)) (condition "A.Type == '*Text' && B.Type == 'Via'")) ``` ### 不同網路的貫孔間距 ```plaintext (rule "Distance between Vias of Different Nets" (constraint hole_to_hole (min 0.254mm)) (condition "A.Type == 'Via' && B.Type == 'Via' && A.Net != B.Net")) ``` ### 不同網路焊盤之間的間隙 ```plaintext (rule "Clearance between Pads of Different Nets" (constraint clearance (min 3.0mm)) (condition "A.Type == 'Pad' && B.Type == 'Pad' && A.Net != B.Net")) ``` ### 貫孔孔洞到走線的間隙 ```plaintext (rule "Via Hole to Track Clearance" (constraint hole_clearance (min 0.254mm)) (condition "A.Type == 'Via' && B.Type == 'Track'")) ``` ### 對差分對指定較大的間隙 ```plaintext (rule "dp clearance" (constraint clearance (min "1.5mm")) (condition "A.inDiffPair('*') && !AB.isCoupledDiffPair()")) ``` ### 散熱焊盤使用實心連接(不使用熱焊盤) ```plaintext (rule "heat_sink_pad" (constraint zone_connection solid) (condition "A.Fabrication_Property == 'Heatsink pad'")) ``` ### 要求熱焊盤連接完整四個輻條 ```plaintext (rule "fully_spoked_pads" (constraint min_resolved_spokes 4)) ``` ### 設定所有區域的熱焊盤間隙和輻條寬度 ```plaintext (rule "defined_relief" (constraint thermal_relief_gap (min 10mil)) (constraint thermal_spoke_width (min 12mil))) ``` ### 電容器下方禁止銅填充 ```plaintext (rule "no_copper_under_caps" (constraint physical_clearance (min 0mm)) (condition "A.Type == 'Zone' && B.Reference == 'C*'")) ``` ### 禁止焊盤使用自定義阻焊開窗 ```plaintext (rule "disallow solder mask margin overrides" (constraint assertion "A.Soldermask_Margin_Override == null") (condition "A.Type == 'Pad'")) ``` ### 允許連接器的絲印與板邊相交 ```plaintext (rule "silk_board_edge_clearance" (constraint silk_clearance) (severity ignore) (condition "A.memberOfFootprint('J*') && B.Layer=='Edge.Cuts'")) ``` ### 高電流網路的走線寬度檢查 ```plaintext (rule "high-current" (constraint track_width (min 1.0mm)) (constraint connection_width (min 0.8mm)) (condition "A.hasNetclass('Power')")) ``` ### 分別設定鑽孔和槽孔的尺寸限制 ```plaintext (rule "Plated through-hole size" (constraint hole_size (min 0.2mm) (max 6.35mm)) (condition "A.isPlated() && A.Hole_Size_X == A.Hole_Size_Y")) (rule "Plated slot size" (constraint hole_size (min 0.5mm)) (condition "A.isPlated() && A.Hole_Size_X != A.Hole_Size_Y")) ``` ### 忽略特定貫孔之間的間隙違規 ```plaintext (rule "hole_to_hole_uvia_exclusion" (condition "A.Via_Type == 'Blind/buried' && B.Via_Type == 'Micro'") (constraint hole_to_hole) (severity ignore)) ``` ## 基於製造標準的 PCB 設計規則 在實際的 PCB 設計過程中,遵循業界標準的設計規則非常重要,這可以確保您的設計能夠被可靠地製造出來。以下介紹一些基於 IPC 標準和常見製造能力的設計規則。 ### IPC 標準規則 IPC (Institute for Printed Circuits) 是電子行業協會,提供了廣泛採用的 PCB 設計和製造標準。以下是一些基於 IPC-2221 和 IPC-7351 標準的設計規則。 #### 導線寬度與電流關係 根據 IPC-2221 標準,銅箔走線所能承載的電流與其寬度和厚度有關: | 電流 (A) | 外層走線寬度 (1oz 銅箔) | 內層走線寬度 (1oz 銅箔) | |----------|-------------------------|-------------------------| | 0.5 | 0.15mm (6mil) | 0.25mm (10mil) | | 1.0 | 0.25mm (10mil) | 0.36mm (14mil) | | 2.0 | 0.5mm (20mil) | 0.7mm (28mil) | | 3.0 | 0.75mm (30mil) | 1.0mm (40mil) | | 4.0 | 1.0mm (40mil) | 1.3mm (52mil) | | 5.0 | 1.25mm (50mil) | 1.6mm (64mil) | 在 KiCad 中實現此規則的例子: ```plaintext (rule "High Current 2A" (constraint track_width (min 0.5mm)) (condition "A.hasNetclass('Power2A')")) (rule "High Current 5A" (constraint track_width (min 1.25mm)) (condition "A.hasNetclass('Power5A')")) ``` #### 爬電距離和電氣間隙 爬電距離 (Creepage) 是沿表面測量的兩個導體之間的最短路徑,而電氣間隙 (Clearance) 是兩個導體間的最短直線距離。這些值根據工作電壓、污染程度和絕緣材料來確定: | 工作電壓 | 基本間隙 (無污染) | 中度污染間隙 | 爬電距離 (標準 FR4) | |----------|-------------------|--------------|---------------------| | 0-50V | 0.1mm (4mil) | 0.2mm (8mil) | 0.25mm (10mil) | | 51-150V | 0.5mm (20mil) | 0.8mm (32mil)| 1.3mm (50mil) | | 151-300V | 1.5mm (60mil) | 2.0mm (80mil)| 2.5mm (100mil) | | 301-500V | 2.5mm (100mil) | 3.0mm (120mil)| 5.0mm (200mil) | KiCad 9 新增加了爬電距離設計規則檢查功能,可以這樣設定: ```plaintext (rule "Creepage 150V" (constraint creepage (min 1.3mm)) (condition "A.hasNetclass('HV') && B.hasNetclass('GND')")) ``` ### 常見製造能力限制 不同的 PCB 製造商有不同的製造能力限制,以下是一些通用的限制: #### 標準製造能力 | 參數 | 標準能力 | 高級能力 | 超高能力 | |--------------------|----------------|----------------|---------------| | 最小走線寬度 | 0.15mm (6mil) | 0.1mm (4mil) | 0.075mm (3mil)| | 最小間距 | 0.15mm (6mil) | 0.1mm (4mil) | 0.075mm (3mil)| | 最小鑽孔直徑 | 0.3mm (12mil) | 0.2mm (8mil) | 0.15mm (6mil) | | 最小環寬(環徑) | 0.2mm (8mil) | 0.125mm (5mil) | 0.1mm (4mil) | | 最小絲印寬度 | 0.15mm (6mil) | 0.1mm (4mil) | 0.08mm (3mil) | | 最小阻焊開窗 | 0.25mm (10mil) | 0.2mm (8mil) | 0.15mm (6mil) | 在 KiCad 中實現這些規則: ```plaintext # 標準製造能力規則 (rule "Min Track Width" (constraint track_width (min 0.15mm))) (rule "Min Clearance" (constraint clearance (min 0.15mm))) (rule "Min Hole Size" (constraint hole_size (min 0.3mm))) (rule "Min Annular Ring" (constraint annular_width (min 0.2mm))) ``` ### 多層板設計規則 多層板設計時,需要考慮更多的設計規則: #### 層間對位 層間對位錯誤可能導致貫孔無法正確連接各層。通常的設計規則是: ```plaintext (rule "Via Annular Ring" (constraint annular_width (min 0.125mm)) (condition "A.Type == 'Via'")) ``` #### 阻抗控制走線 高速信號需要阻抗控制,需要根據板層堆疊和材料特性計算走線寬度。常用的阻抗值有: - 單端信號:50Ω - 差分信號:90Ω-100Ω 差分阻抗 (每條走線約 45Ω-50Ω) 對於 FR4 材料,1.6mm 厚的板子,外層 1oz 銅箔,典型的走線寬度為: - 50Ω 單端走線:約 0.3mm (12mil) - 100Ω 差分走線:約 0.2mm (8mil) 寬,間距 0.2mm (8mil) ```plaintext (rule "50ohm Impedance" (constraint track_width (opt 0.3mm)) (condition "A.hasNetclass('50ohm')")) (rule "100ohm Differential" (constraint track_width (opt 0.2mm)) (constraint diff_pair_gap (opt 0.2mm)) (condition "A.inDiffPair('*')")) ``` ### 特殊應用設計規則 #### 高頻設計 高頻設計需要特別注意信號完整性和電磁干擾: ```plaintext # 高頻走線彎曲 (rule "RF Traces" (constraint track_width (min 0.2mm) (opt 0.3mm)) (condition "A.hasNetclass('RF')")) # 隔離高頻區域 (rule "RF Isolation" (constraint clearance (min 0.5mm)) (condition "A.hasNetclass('RF') && !B.hasNetclass('RF')")) ``` #### 高壓設計 高壓設計需要更大的間隙,通常基於 IPC-2221 標準: ```plaintext (rule "High Voltage Isolation" (constraint clearance (min 3mm)) (constraint physical_clearance (min 4mm)) (condition "A.hasNetclass('HV') && !B.hasNetclass('HV')")) ``` #### 低電流感測 對於電流感測電路,走線間的對稱性和阻抗匹配很重要: ```plaintext (rule "Current Sense" (constraint track_width (opt 0.5mm)) (constraint length (max 10mm)) (condition "A.hasNetclass('I_SENSE')")) ``` ### 常見設計檢查點 除了設計規則外,還應當檢查以下幾點,以確保 PCB 設計的可製造性: 1. **熱焊盤設計**:確保大型焊盤採用適當的熱焊盤連接,以避免焊接問題 2. **銅平衡**:確保各層銅箔分佈均勻,避免板子彎曲 3. **鑽孔堆疊**:避免鑽孔過於密集,可能導致板子強度下降 4. **過孔覆蓋**:確定是否需要覆蓋過孔,以防止焊料流入 5. **元件間距**:確保元件間有足夠間距,便於組裝和維修 6. **測試點**:添加足夠的測試點,便於製造後測試 ### 設計規則檢查 (DRC) 最佳實踐 使用 KiCad 的 DRC 功能時,建議採用以下最佳實踐: 1. **循序漸進檢查**:先修復嚴重錯誤,再處理警告 2. **定期運行 DRC**:設計過程中定期運行 DRC,避免錯誤積累 3. **建立規則庫**:為不同類型的設計建立特定的規則檔案 4. **分層檢查**:分別檢查各個層的問題 5. **記錄例外**:對於有意忽略的設計規則違規,做好文檔記錄 ```plaintext # 設定例外規則,但加上說明,便於追蹤 (rule "Specific Via Exception" (constraint clearance (min 0.1mm)) (severity warning) (condition "A.Type == 'Via' && A.Net == 'GND' && B.Net == 'GND'")) ``` ## 進階表達式用法 在條件表達式中,您可以使用以下項目來表示測試對象: - **`A`**: 第一個(或唯一)測試項目 - **`B`**: 第二個測試項目(對於需要兩個項目的規則) - **`L`**: 當前測試的層 您可以使用邏輯運算符組合多個條件: - **`&&`**: 邏輯與 - **`||`**: 邏輯或 - **`!`**: 邏輯非 範例: ```plaintext (condition "A.hasNetclass('HV') && !A.enclosedByArea('Shield*')") ``` 您還可以使用條件表達式中的算術運算: ```plaintext (constraint clearance (min "1.5mm + 2.0mm")) ``` ## 規則優先順序 規則應按照具體到一般的順序排列。後面的規則優先於前面的規則;一旦找到匹配的規則,就不再檢查前面的規則。 範例: ```plaintext # 一般規則 (rule "General Clearance" (constraint clearance (min 0.2mm))) # 特定規則(優先於一般規則) (rule "HV Clearance" (constraint clearance (min 0.5mm)) (condition "A.hasNetclass('HV')")) ``` ## 使用萬用字元 在表達式函數的參數中,支持簡單的萬用字元: - **`*`**: 匹配任意數量的字符 - **`?`**: 匹配任意單個字符 範例: ```plaintext (condition "A.memberOfFootprint('R*')") # 匹配所有以 R 開頭的封裝 (condition "A.memberOfFootprint('U?')") # 匹配 U1, U2, U3 等 ``` ## 注意事項 1. **版本語句**必須是第一個語句,表示檔案的語法版本。 2. **規則順序**應按具體情況排序,後面的規則優先於前面的規則。 3. 使用 `Cmd+/` 可對選中的行添加或取消註釋。 4. KiCad 9 中,設計規則檢查(DRC)的性能得到顯著改進,大型設計的檢查速度更快。 5. 對於複雜條件,可將相關規則分成多個單獨的規則,以提高可維護性。 ## 實際應用場景 ### 高速信號設計 ```plaintext # 差分對規則 (rule "diff_pair_general" (constraint diff_pair_gap (min 0.1mm) (opt 0.2mm)) (condition "A.inDiffPair('*')")) # USB差分對特定規則 (rule "diff_pair_usb" (constraint diff_pair_gap (min 0.15mm) (opt 0.25mm)) (constraint clearance (min 0.3mm)) (condition "A.inDiffPair('/USB*')")) # 控制差分對走線長度 (rule "diff_pair_length" (constraint length (max 50mm)) (condition "A.inDiffPair('/USB*')")) ``` ### 電源設計 ```plaintext # 主電源走線規則 (rule "main_power" (constraint track_width (min 1.0mm)) (constraint clearance (min 0.3mm)) (condition "A.hasNetclass('Power')")) # 敏感模擬電源規則 (rule "analog_power" (constraint track_width (min 0.5mm)) (constraint clearance (min 0.25mm)) (condition "A.hasNetclass('Analog') && A.Name == '*VCC'")) ``` ### 射頻設計 ```plaintext # RF相關區域的走線控制 (rule "rf_area" (constraint track_width (min 0.25mm) (opt 0.3mm)) (constraint via_count (max 3)) (condition "A.intersectsArea('RF_Zone')")) # 阻抗控制 (rule "50ohm_traces" (constraint track_width (opt 0.35mm)) (condition "A.hasNetclass('RF')")) ``` ## 文件 更完整的文件請參考 [KiCad 官方文件](https://docs.kicad.org)。 KiCad 9 版本中的設計規則檢查功能已有顯著改進,包括增強的爬電距離設計規則檢查和更完整的設計規則表達式支援。使用 KiCad 9 版本的用戶可以利用這些新功能創建更強大和靈活的設計規則。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up