“持續(xù)更新 8 年,Github 超過(guò) 1k star 的項(xiàng)目。一種使用文本替代原理圖的語(yǔ)言。”
追蹤 skidl 項(xiàng)目很久了,之所以之前沒(méi)有分享是因?yàn)槔习姹局荒苤С?KiCad 5.0 符號(hào)庫(kù)的解析,而且生成的網(wǎng)表也僅能支持 KiCad 6,所以用起來(lái)比較麻煩。最近作者又更新了一個(gè)大版本,全面支持 KiCad 7 和 KiCad 8,雖然仍有一些問(wèn)題,但跑起來(lái)比之前方便了很多。AI 時(shí)代的到來(lái),讓自動(dòng)化設(shè)計(jì)又多了一個(gè)研究的方向。由于 skidl 的設(shè)計(jì)初衷就是用文本描述原理圖,這對(duì)于機(jī)器學(xué)習(xí)來(lái)說(shuō)無(wú)疑是非常合適的!感興趣的小伙伴趕緊學(xué)習(xí)起來(lái)吧,有興趣進(jìn)一步討論的也可以私信我或留言。SKiDL 簡(jiǎn)介
通過(guò) SKiDL Python 軟件包,您可以用文本描述電子元件之間的連接。生成的 Python 程序可對(duì)常見(jiàn)錯(cuò)誤進(jìn)行電氣規(guī)則檢查,并輸出網(wǎng)表,作為 PCB Layout 工具的輸入。-
項(xiàng)目主頁(yè):https://github.com/devbisme/skidl
-
License: MIT
-
文檔:http://devbisme.github.io/skidl
-
用戶論壇:https://github.com/devbisme/skidl/discussions
skidl 希望做到的,提供一個(gè)選項(xiàng),既可以通過(guò)傳統(tǒng)方式設(shè)計(jì)原理圖(下圖一),也可以用代碼的方式實(shí)現(xiàn)(下圖二):
功能
-
語(yǔ)法強(qiáng)大、靈活(因?yàn)樗?Python)。
-
允許對(duì)電子電路進(jìn)行簡(jiǎn)潔描述(想象一下不需要在多頁(yè)原理圖中追蹤信號(hào))。
-
允許對(duì)電子電路進(jìn)行文本描述(想想在電路中使用 diff和 git)。
-
針對(duì)常見(jiàn)錯(cuò)誤(如未連接器件的 I/O 引腳)執(zhí)行電氣規(guī)則檢查 (ERC)。
-
支持電子設(shè)計(jì)的平鋪/分層/混合描述。
-
支持設(shè)計(jì)復(fù)用(想象一下使用 PyPi 和 Github 發(fā)布電子設(shè)計(jì))。
-
可創(chuàng)建智能電路模塊,這些模塊的行為/結(jié)構(gòu)可通過(guò)參數(shù)改變(想想濾波器,其元件值可根據(jù)你所需的截止頻率自動(dòng)調(diào)整)。
-
可與任何 ECAD 工具配合使用(只需兩種方法:一種用于讀取元件庫(kù),另一種用于輸出正確的網(wǎng)表格式)。
-
充分利用 Python 生態(tài)系統(tǒng)的所有優(yōu)勢(shì)(因?yàn)樗?Python)。
舉例
下面的 SKiDL 程序描述了一個(gè)由分立晶體管構(gòu)建的雙輸入 AND 門,作為一個(gè)非常簡(jiǎn)單的例子:
以下是輸出的網(wǎng)表,可以直接在 KiCad 中導(dǎo)入:from skidl import *
# Create part templates.
q = Part("Device", "Q_PNP_CBE", dest=TEMPLATE)
r = Part("Device", "R", dest=TEMPLATE)
# Create nets.
gnd, vcc = Net("GND"), Net("VCC")
a, b, a_and_b = Net("A"), Net("B"), Net("A_AND_B")
# Instantiate parts.
gndt = Part("power", "GND") # Ground terminal.
vcct = Part("power", "VCC") # Power terminal.
q1, q2 = q(2) # Two transistors.
r1, r2, r3, r4, r5 = r(5, value="10K") # Five 10K resistors.
# Make connections between parts.
a & r1 & q1["B C"] & r4 & q2["B C"] & a_and_b & r5 & gnd
b & r2 & q1["B"]
q1["C"] & r3 & gnd
vcc += q1["E"], q2["E"], vcct
gnd += gndt
generate_netlist(tool=KICAD8) # Create KICAD version 8 netlist.
(export (version D)
(design
(source "/home/devb/projects/KiCad/tools/skidl/tests/examples/svg/simple_and_gate.py")
(date "07/19/2024 05:54 AM")
(tool "SKiDL (1.2.2)"))
(components
(comp (ref
(value GND)
(footprint )
(fields
(field (name F0)
(field (name F1) GND))
(libsource (lib power) (part GND))
(sheetpath (names /top/18388231966295430075) (tstamps /top/18388231966295430075)))
(comp (ref
(value VCC)
(footprint )
(fields
(field (name F0)
(field (name F1) VCC))
(libsource (lib power) (part VCC))
(sheetpath (names /top/12673122245445984714) (tstamps /top/12673122245445984714)))
(comp (ref Q1)
(value Q_PNP_CBE)
(footprint )
(fields
(field (name F0) Q)
(field (name F1) Q_PNP_CBE))
(libsource (lib Device) (part Q_PNP_CBE))
(sheetpath (names /top/5884947020177711792) (tstamps /top/5884947020177711792)))
(comp (ref Q2)
(value Q_PNP_CBE)
(footprint )
(fields
(field (name F0) Q)
(field (name F1) Q_PNP_CBE))
(libsource (lib Device) (part Q_PNP_CBE))
(sheetpath (names /top/12871193304116279102) (tstamps /top/12871193304116279102)))
(comp (ref R1)
(value 10K)
(footprint )
(fields
(field (name F0) R)
(field (name F1) R))
(libsource (lib Device) (part R))
(sheetpath (names /top/17200003438453088695) (tstamps /top/17200003438453088695)))
(comp (ref R2)
(value 10K)
(footprint )
(fields
(field (name F0) R)
(field (name F1) R))
(libsource (lib Device) (part R))
(sheetpath (names /top/12314015795656540138) (tstamps /top/12314015795656540138)))
(comp (ref R3)
(value 10K)
(footprint )
(fields
(field (name F0) R)
(field (name F1) R))
(libsource (lib Device) (part R))
(sheetpath (names /top/11448722674936198910) (tstamps /top/11448722674936198910)))
(comp (ref R4)
(value 10K)
(footprint )
(fields
(field (name F0) R)
(field (name F1) R))
(libsource (lib Device) (part R))
(sheetpath (names /top/2224275500810828611) (tstamps /top/2224275500810828611)))
(comp (ref R5)
(value 10K)
(footprint )
(fields
(field (name F0) R)
(field (name F1) R))
(libsource (lib Device) (part R))
(sheetpath (names /top/3631169005149914336) (tstamps /top/3631169005149914336))))
(nets
(net (code 1) (name A)
(node (ref R1) (pin 1)))
(net (code 2) (name A_AND_B)
(node (ref Q2) (pin 1))
(node (ref R5) (pin 1)))
(net (code 3) (name B)
(node (ref R2) (pin 1)))
(net (code 4) (name GND)
(node (ref
(node (ref R3) (pin 2))
(node (ref R5) (pin 2)))
(net (code 5) (name N$1)
(node (ref Q1) (pin 2))
(node (ref R1) (pin 2))
(node (ref R2) (pin 2)))
(net (code 6) (name N$2)
(node (ref Q1) (pin 1))
(node (ref R3) (pin 1))
(node (ref R4) (pin 1)))
(net (code 7) (name N$3)
(node (ref Q2) (pin 2))
(node (ref R4) (pin 2)))
(net (code 8) (name VCC)
(node (ref
(node (ref Q1) (pin 3))
(node (ref Q2) (pin 3))))
)
注意事項(xiàng)
skidl 在 Windows 上運(yùn)行的時(shí)候經(jīng)常會(huì)碰到問(wèn)題。最常見(jiàn)的問(wèn)題是沒(méi)有正確設(shè)置符號(hào)庫(kù)的環(huán)境變量,導(dǎo)致無(wú)法找到符號(hào)庫(kù),解析錯(cuò)誤。這個(gè)錯(cuò)誤可以在代碼中加入以下語(yǔ)句解決:
os.environ["KICAD8_SYMBOL_DIR"] = "C:\symbols"
“=” 號(hào)后面的路徑為實(shí)際的符號(hào)路徑。
如果您使用的不是 KiCad 8,而是其他版本的 KiCad,那么最好設(shè)置一下默認(rèn)工具:
set_default_tool(KICAD8)
同樣的,輸出網(wǎng)表的時(shí)候也要指定網(wǎng)表的版本(K8/K7/K6 網(wǎng)表格式有變動(dòng)):
generate_netlist(tool=KICAD8)
此外, 目前版本的 skidl 還可以直接生成原理圖和 PCB,但功能尚不完備,環(huán)境配置比較復(fù)雜,建議編程基礎(chǔ)較好的小伙伴嘗試。結(jié)束語(yǔ)
skidl 的具體使用方式,這里就不再贅述了,有興趣的小伙伴可以自行閱讀 skidl 的文檔,遇到問(wèn)題也可以搜索倉(cāng)庫(kù)中的 issue 和 forum,作者 Dave 也非常樂(lè)意與大家互動(dòng),解答大家的問(wèn)題。 最后總結(jié)一下 skidl 做了什么:用 python 代碼實(shí)現(xiàn)圖形界面的原理圖設(shè)計(jì)。具體的實(shí)現(xiàn)方式為:- 通過(guò)環(huán)境變量找到需要使用的原理圖符號(hào),parse出符號(hào)的引腳編號(hào)(名稱)
- 在文本編輯器(或IDE)中使用編程語(yǔ)言連接這些管腳
- 生成 KiCad 格式的網(wǎng)表
-
電路原理圖
+關(guān)注
關(guān)注
40文章
347瀏覽量
38333 -
python
+關(guān)注
關(guān)注
56文章
4797瀏覽量
84682 -
KiCAD
+關(guān)注
關(guān)注
4文章
160瀏覽量
8760
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論