XSCHEM の使い方 その2:基本的な素子の使い方
1.はじめに
ここでは XSCHEM で使う基本的な素子について説明します.XSCHEM でのシミュレーションの流れについては使い方その1を見てください.
XSCHEM で使えるシンボルにはおおきく分けて3種類 (Verilog とかを考えるともうちょっと分類することも可能ですが) あります.
回路図のノードに対応するもの
回路素子に対応するもの
制御用の要素
2.回路図のノードに対応するシンボル
2.1 GND
とりあえずこれがないと何も解析できません.電位の基準点であり,任意の電流を流すことができる理想グラウンドです.SPICEでは伝統的にノード名「0」が理想グラウンドです.
SPICE3はノード「0」がなかったらエラーになっていたような気がするんですが,ngspice では gnd / ノード0 がなくても解析はできます.ただ,電位の基準がどうなるか分からないので,基本的にお勧めはしません.例えば下のような回路をDC解析してみます.(skywater-130nm-examples/tutorial/xschem_2/gnd.sch)
まだ紹介していない電圧制御電圧源 (VCVS) E1 を使っていますが,E1 は V1 の電圧をコピーする電源です.DC解析で V1 をスイープすると,同じようにE1 の電圧もスイープされます.左側はGNDがない回路,右側はGNDがある回路になっています.抵抗値は同じなので同じ挙動を示すはずですが,vc1 と vc2 の電圧をプロットすると下のようになります.
まったく違う値です.解析した回路は1:1 の抵抗分圧回路なので普通に考えると vc2 の方が正しそうですが,vc1 がなぜこういう値になったかというと,vn が 0 V になっていないからです.
vc1,vp,vn の電位差は合っています.ただ vn が 0 V でないだけです.確かに左側の回路図では vn = 0 V にする要素は何もないわけで,別に ngspice がおかしな結果を返したわけではありません.とはいえ,結果を見誤りやすいので回路にはちゃんと GND を付けましょう.
2.2 lab_pin, lab_wire
回路図のノードに名前をつけるのが lab_pin と lab_wire です.lab_pin と lab_wire の違いはよく分かりません.出力されるネットリストは同じだしマニュアルにも書かれていないし…
lab_pin を使う意味はいくつかあります.
1つは名前が分かりやすくなること.何も指定しない場合,ノード名は netXX という名前が機械的につけられます.観測したいノードの名前をいちいち調べるのは面倒なので,適切な名前をつけましょう.ちなみにノード名を「0」にするとグラウンドになります.
2つ目は,同じ名前の複数の lab_pin は回路図上で離れていても短絡されていると見なされるということ.GNDの説明で使った回路図には vp,vn が2つずつ使われていますが,vp同士,vn同士はつながっていないように見えてつながっています.
これを lab_pin を使わずに書くと,下のようになります.
配線が込み入っていて見にくいです.lab_pin をうまく使って見やすい回路図を描きましょう.
また,lab_pin はシンボルを作るときにも使います.そちらは別記事の回路の階層化の説明に書きます.
2.3 VDD
vdd は電源電圧のノードです.バイポーラだから VCC を使いたい,という人もいるかも知れませんが vcc はありません.まぁ SkyWater 130 nm は CMOSプロセスですし.
vdd はノードに名前をつけるという点では lab_pin と似ています.別に lab_pin で vdd という名前をつけても問題ないですが,vdd (GND のところで説明しませんでしたが,gnd も) は lab_pin 違ってグローバルなノードとして定義されます.下図のような回路を作ります.VDD は vdd で vc は lab_pin です.
この回路のネットリストを出力すると,下のようになります.
vc はノードに名前がついただけですが,VDD,GND は ".global" で定義されています.これはプログラミング言語のグローバル変数のようなもので,どこからでも参照できます.つまり,サブサーキット (シンボル) の中からでも参照できるということです.このあたりは回路を階層化しないと違いが分かりにくいので,回路の階層化のところであらためて説明します.
3.受動素子
3.1 抵抗
抵抗です.SPICEネットリストをテキストで書くときの素子名で言うと R.シンボルは res.sym と res_ac.sym の2種類ありますが,実は res_ac の方は AC値を指定しているだけで,両方ともネットリストでは R です.他の素子でもそうですが,AC値を指定すると AC解析をするときには AC で指定した値,それ以外 (AC解析時の動作点解析も含む) のときには DCの方が使われます.
ネットリストでは下のような感じ.
3.2 インダクタンス
インダクタンス (L) です.結合 (K) が別途素子として用意されています.結合は相互インダクタンスではなく結合係数での指定です.
結合係数は
$$
k = \frac{M}{\sqrt{L_1L_2}}
$$
で定義され,$${-1\le k \le 1}$$ です.$${|k|=1}$$ が密結合,$${k=0}$$ なら結合なし.インダクタンスは単独で使う場合には極性はありませんが,K を使う場合には極性が意味を持ちますので注意しましょう.
3.3 キャパシタンス
キャパシタンスもシンボルが2種類ありますが,使うのは capa.sym の方です.capa-2 の方は極性があるシンボルになっていますが,中身が空です.記号にこだわりのある人用でしょうか.ちなみに SPICE の C には極性はないので,見た目以外に差はありません.
3.4 メモリスタンス
残念ながらメモリスタはありません.
4.電源
3.1 電圧源・電流源
回路図を見やすくするための素子として,電源とグラウンドがあります.この2つは SPICE の素子 (Element) ではなくてノードに対応しています.SPICE においては"0" という名前のノードが理想グラウンドとして扱われます.回路図中にグラウンドがないと解析ができません.電圧が定義できないですから.xschem におけるグラウンドのシンボルはこの0番ノードです.1つの回路図中にいくつ置いても,それらはすべて同一のノード (理想グラウンド) につながっていることになります.
電源も同じように扱えるようにしたシンボルが vdd です.
3.2 {電圧|電流}制御{電圧|電流}源
3.3 電流計
ノードを指定すれば決まる電圧に対して,電流は素子を指定する必要があります.そのため,回路中で電流値を測りたい場合はその場所に電圧0の電圧源を挿入するという方法が使われます.
別に電圧源を使ってもいいですが ngspice では電流計測用の電圧0の電圧源に "ammeter" という名前がついています.
電流源のところでも触れたように,電流の向きは混乱しやすいです.ammeter のシンボルは矢印になっていて方向が分かりやすくなっています.
5.非線形素子
理想スイッチ
6.制御用の要素
5.パラメータの使い方
.param