KiCad:インバータの設計(回路シミュレーション)
メモ
使用したKiCadのバージョン:(5.1.8)-1
KiCadには回路シミュレータとしてngspiceが入っており、回路シミュレーションを行うことができます。ここでは、過去のMakeLSI:の試作されたチップの測定データから作られたSPICEモデルを使い、インバータのシミュレーションまでを行います。 https://makelsi.github.io/images/docs/KiCad/inv_66.png
回路の準備
シミュレーション用回路のプロジェクト作成
LSI設計ではシミュレーションを行うための回路を「テストベンチ(test bench)」と呼んだりします。ここでもそれに倣って、テストベンチ(tb)を作成します。
https://makelsi.github.io/images/docs/KiCad/inv_31.png
次に「新規プロジェクトを作成します」をクリックします。
https://makelsi.github.io/images/docs/KiCad/inv_32.png
開かれたウィンドウにて、ファイル名は「tb」と入力し、「プロジェクト用に新しいディレクトリーを作成」にチェックが入っていることを確認した後、「保存」をクリックします。
https://makelsi.github.io/images/docs/KiCad/inv_33.png
※KiCadのドキュメントを見ると、”Use a unique directory for each KiCad project. Do not combine multiple projects into a single directory.”と書いてあり、ひとつのフォルダに複数のプロジェクトを入れる(ひとつのフォルダに複数の.proファイルが存在する)のは良くないみたいです。問題が起こることを避けるためにも、プロジェクト作成毎に新しいディレクトリー(フォルダ)を作成するようにしましょう。
シミュレーション用回路の作成
プロジェクトウィンドウにて「tb.sch」をダブルクリックして回路図を開きます。
https://makelsi.github.io/images/docs/KiCad/inv_34.png
ウィンドウ右側の「階層シートを作成」をクリックして、真ん中あたりに適当な大きさで描きます。
https://makelsi.github.io/images/docs/KiCad/inv_35.png
すると、ウィンドウが出てきます。
https://makelsi.github.io/images/docs/KiCad/inv_36.png
この出てきたウィンドウの「ファイル名」に、作成していたインバータの回路図の相対パスを含めたファイルの名前を入力します。「../InverterTutorial.sch」と入力します。「../」は「現在のディレクトリの1つ上のディレクトリ」を意味するもので、InverterTutorial.schはエクスプローラー等で確認するとわかりますが、tbのプロジェクトフォルダの1つ上にあるため、そのパスも含めて指定できます。
https://makelsi.github.io/images/docs/KiCad/inv_37.png
すると、確認のウィンドウが出てくるので「はい」をクリックします。(ここで、確認のウィンドウが出てこない場合は「ファイル名」に入力されたファイルが存在していない場合で、新規に作られます。)
https://makelsi.github.io/images/docs/KiCad/inv_38.png
すると、今度はパスのタイプを選択するウィンドウが出てくるため、ここでは「Use Relative Path」(相対パス)を指定します。「Use Absolute Path」(絶対パス)を選択するとプロジェクトフォルダを移動させたときに、階層シートのリンクが絶対パスになるため、パスの修正が必要になります。
https://makelsi.github.io/images/docs/KiCad/inv_39.png
次は階層シートの階層ピンを配置します。
https://makelsi.github.io/images/docs/KiCad/inv_40.png
階層シートをクリックすると置かれていた階層ピンが順に呼び出されるので、それらを配置していきます。まずはVDDを左側の上あたりに置きます。
https://makelsi.github.io/images/docs/KiCad/inv_41.png
順に置いていきます。入力は左側、出力は右側に置かれます。
https://makelsi.github.io/images/docs/KiCad/inv_42.png
次に、「シンボルを配置」をクリックして、電源シンボルを置いていきます。
https://makelsi.github.io/images/docs/KiCad/inv_43.png
出てきたウィンドウで、矩形波の電源として「VPULSE」のシンボルを使いたいので検索します。「VPU」まで入力すると出てきたので、それをクリックして「OK」を押します。
https://makelsi.github.io/images/docs/KiCad/inv_44.png
階層シートの左あたりをクリックして置きます。
https://makelsi.github.io/images/docs/KiCad/inv_45.png
次は直流電圧源「VDC」を置きたいので、同じような手順で配置します。
https://makelsi.github.io/images/docs/KiCad/inv_46.png
https://makelsi.github.io/images/docs/KiCad/inv_47.png
再び「シンボルを配置」をクリックし、OpenRule1umのシンボルライブラリに含まれている「0」のシンボルを選択します。これはシミュレータのngspiceでは、基準となる電位(=0V)を明確に示さないといけないため、VSSと0Vを接続します。
https://makelsi.github.io/images/docs/KiCad/inv_48.png
VPULSEの下あたりに置いてみました。
https://makelsi.github.io/images/docs/KiCad/inv_49.png
次に配線を行います。「ワイヤーを配置」をクリックして配線します。
https://makelsi.github.io/images/docs/KiCad/inv_50.png
配線ができました。
https://makelsi.github.io/images/docs/KiCad/inv_51.png
ここからは主にシミュレーションの設定を行います。
VDCのシンボルをダブルクリックしてシンボルプロパティを開きます。
https://makelsi.github.io/images/docs/KiCad/inv_52.png
開いたウィンドウで、「Spice モデルを編集...」をクリックします。
https://makelsi.github.io/images/docs/KiCad/inv_53.png
DCの欄に電源電圧(VDD)は5Vにしたいので、「5」を入力して「OK」をクリックします。
https://makelsi.github.io/images/docs/KiCad/inv_54.png
次はVPULSEも同じように設定していきます。VPULSEのシンボルをダブルクリックしてシンボルプロパティを開き、「Spice モデルを編集...」をクリックします。
https://makelsi.github.io/images/docs/KiCad/inv_55.png
下の画像のように各値を変更して、終えたら「OK」をクリックしてください。
信号はDC5Vの周期=1000nsec、duty比が50%(=パルス幅が周期1000nsecの半分の500nsec)の信号です。(立ち上がり時間、立ち下り時間は信号がどれくらい速く変化するかを指定するパラメータですが、適当に設定しています。)
https://makelsi.github.io/images/docs/KiCad/inv_56.png
パラメータが変更されました。
https://makelsi.github.io/images/docs/KiCad/inv_57.png
Spiceモデルのダウンロード
MOSFETなどの素子の特性はSPICEモデルで表されており、これを使ってシミュレーションを行うことができます。そのSpiceモデルはMakeLSI:で過去に試作されたチップの測定から作られたものがGitHubにあげられており、今回はそれを使ってみます。下記のリンクからZIPファイルでダウンロードする場合には、緑のボタンの「Code」を押して、「Download ZIP」でダウンロード出来ます。
Measure/16PTSにあるmos_PTS06.libが今回使うSPICEモデルが書かれたファイルです。ここでは「16PTS」のフォルダごとプロジェクトフォルダ直下に置いてください。
https://makelsi.github.io/images/docs/KiCad/inv_58.png
すると、プロジェクトウィンドウにも置いたフォルダが表示されます。
https://makelsi.github.io/images/docs/KiCad/inv_59.png
Spiceモデルファイルの読み込み設定
まず、Spiceモデルファイルを置いたパスを絶対パスで読み込ませる必要があるため、Windowsエクスプローラなどで「mos_PTS06.lib」を右クリックしてプロパティを開き、「場所」の項目にあるファイルパスをコピーします。
回路図の編集に戻り、「テキストを配置」をクリックします。
(下の画像ではPCの画面サイズが小さいため、右側に「テキストを配置」がありません。その時はメニューバーからも選択できます。)
https://makelsi.github.io/images/docs/KiCad/inv_60.png
「テキスト」の欄に「.include 」を入力した後、先ほどコピーしたパスを貼り付け、続けて「\mos_PTS06.lib」を入力して、「角度」を「左」にして、「OK」をクリックします。
https://makelsi.github.io/images/docs/KiCad/inv_61.png
テストベンチの上あたりに置いてみました。
https://makelsi.github.io/images/docs/KiCad/inv_62.png
シミュレーションコマンドの追加
シミュレーションコマンドを回路図に書いておくと、シミュレータに読み込ませることができます。
今回は入出力の電圧の波形を見たいので、トランジェント解析(.tran コマンド)を使います。パラメータはとりあえず、時間ステップは1ns、2000nsまでのシミュレーションを実行、データの保存開始時間は0sから、最大時間ステップは1000nsとしています。
https://makelsi.github.io/images/docs/KiCad/inv_63.png
同じようにテストベンチの上あたりに置いてみました。
https://makelsi.github.io/images/docs/KiCad/inv_64.png
シンボルのアノテーション
シンボルのアノテーションを行います。配置した各シンボルのIDのようなもの(リファレンス)を自動で振ってくれます。ウインドウ上側の「回路図シンボルをアノテーション」をクリックします。
https://makelsi.github.io/images/docs/KiCad/inv_65.png
出てきたウィンドウで「アノテーション」をクリックした後、閉じます。
VDC、VPULSEともにアノテーションされました。
https://makelsi.github.io/images/docs/KiCad/inv_66.png
SPICEモデル名の変更
今回使うSPICEモデルファイル「mos_PTS06.lib」には、PMOSのモデル名が「pchOR1ex」、NMOSのモデル名が「pchOR1ex」として定義されています。本来ならばEeschemaで使うシンボルライブラリのSPICEモデル名とそのSPICEモデルファイルで定義されたモデル名が統一されていれば、ここの手順は必要ないのですが、統一されていなかったため変更する手順を踏みます。
回路図にてインバータの階層シートをダブルクリックすると、その階層の回路図に移動できます。そこで、PMOS_OR1とNMOS_OR1の下の画像の赤枠で囲った部分がSPICEモデル名を書く所です。ここをテキストの置換を使って変更します。
https://makelsi.github.io/images/docs/KiCad/inv_67.png
「テキストの検索と置換」をクリックします。
https://makelsi.github.io/images/docs/KiCad/inv_68.png
まずはPMOS_OR1の方から変更します。「検索」の欄に「PMOS_OR1 l=1u w=6u」の文字列の一部「PMOS_OR1 l」と入力してください。そして「交換」の欄に「pchOR1ex l」と入力してください。そして、「すべてのコンポーネント フィールドを検索」にチェックを入れて、「全て置換」をクリックします。
(単純に「検索」の欄に「PMOS_OR1」を入れて、「交換」の欄に「pchOR1ex」を入れて置換してしまうと、SPICEモデル名だけでなく、その上に緑色で同じ名前が書かれているシンボル名までも変更されてしまうので注意してください。)
https://makelsi.github.io/images/docs/KiCad/inv_69.png
SPICEモデル名の部分だけが置換されました。
https://makelsi.github.io/images/docs/KiCad/inv_70.png
NMOS_OR1についても同じように変更します。
https://makelsi.github.io/images/docs/KiCad/inv_71.png
変換が終わりました。
https://makelsi.github.io/images/docs/KiCad/inv_72.png
SPICEモデル名の変換はこれで終わりです。「シートから抜ける」をクリックしてテストベンチの回路に戻ります。
https://makelsi.github.io/images/docs/KiCad/inv_73.png
回路の保存
これでテストベンチは完成しました。「保存(全てのシート)」をクリックして保存しましょう!
https://makelsi.github.io/images/docs/KiCad/inv_74.png
回路シミュレーション
メニューバーの"ツール"→"シミュレーター"をクリックしてシミュレーターを開きます。
https://makelsi.github.io/images/docs/KiCad/inv_75.png
開かれたウィンドウにて、「設定」をクリックします。
https://makelsi.github.io/images/docs/KiCad/inv_76.png
出てきたウィンドウにて、「カスタム」のタブを開くと、先ほど回路図に書いていたSpiceコマンドが読み込まれています。もし読み込まれていない場合は、「回路図から指令をロード」をクリックして下さい。
ウィンドウ下側の「.include ライブラリー指令の絶対パスを追加」にチェックを入れて、「OK」をクリックして下さい。
https://makelsi.github.io/images/docs/KiCad/inv_77.png
シミュレーション画面が切り替わり、あとは「実行/停止」ボタンを押すとシミュレーションが実行されます。
https://makelsi.github.io/images/docs/KiCad/inv_78.png
正常に終了すれば、下の画像のようになります。
https://makelsi.github.io/images/docs/KiCad/inv_79.png
次はシミュレーション結果の波形を表示させます。「信号を追加」をクリックします。
https://makelsi.github.io/images/docs/KiCad/inv_80.png
出てきたウィンドウにて、Ctrlキーを押しながら下の2つの信号を選択し、「OK」をクリックしてください。
https://makelsi.github.io/images/docs/KiCad/inv_81.png
すると、インバータの入力電圧波形V(A)と、出力電圧波形V(X)が表示されます。
入力信号に対して出力信号は反転しており、インバータの動作を確認出来ました!
https://makelsi.github.io/images/docs/KiCad/inv_82.png
波形の任意の場所の電圧を読み取りたい場合は、右側の読み取りたい信号名を右クリックし、「カーソルを表示」をクリックします。
https://makelsi.github.io/images/docs/KiCad/inv_83.png
すると、カーソルが現れて、カーソルを動かして右下の値からカーソルの位置の電圧値を読み取ることができます。
https://makelsi.github.io/images/docs/KiCad/inv_84.png
ネットリストの出力
https://makelsi.github.io/images/docs/KiCad/inv_85.png
そして、「Spice」のタブに移動し、「ネットリストを生成」をクリックします。
https://makelsi.github.io/images/docs/KiCad/inv_86.png
保存先のウィンドウが出てきますが、ここではそのまま「OK」をクリックします。
https://makelsi.github.io/images/docs/KiCad/inv_87.png
ネットリストを確認する
出力されたネットリストをメモ帳で開いてみると下のようになります。回路図作成直後のネットリストとは違い、電源やSpiceコマンドなども書かれています。KLayoutでLVSに直接このようなネットリストを使うと、それらの記述は対応していないためエラーが起きますが、get_referece(KLayout:OpenRule1umのget_referenceについて)でそれらをコメントアウトする処理などをしています。そのため、このネットリストでもLVSに対応しています。 https://makelsi.github.io/images/docs/KiCad/inv_88.png
以上が、インバータの設計チュートリアルでした。お疲れさまでした!
もし、SPICEモデル名の変更を元に戻す必要がある場合は、同じようにしてPMOSは「PMOS_OR1」に、NMOSは「NMOS_OR1」に戻してください。
リンク
History
2020/12/3~:Okawa作成。
2021/1/8:Ver. 1.0
2021/3/12 Okawa:Ver. 1.1 回路を階層化した方法に変更。
2021/3/15 Okawa:若干の修正と追記。
2021/3/16 Okawa:若干の修正とプロジェクト作成時の注意を追記。