このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
CMOS 電圧比較器の SPICE 変換
この例では、CMOS 電圧比較器の典型的な実装と、関数 subcircuit2ssc
を使用して SPICE サブサーキットを Simscape™ コンポーネントに変換する方法を説明します。CMOS 電圧比較器は、アナログ デジタル コンバーター (ADC) または弛張発振器の回路で使用できます。
システムの小信号周波数応答を取得するために、この例には、入力 u、出力 y、およびパラメーター [定常状態からシミュレーションを開始] が選択された状態の Solver Configuration ブロックが含まれています。関数 linmod
を使用してこのモデルを線形化することができます。
CMOS 電圧比較器のサブサーキットを開く
この例では、この電圧比較器のサブサーキットを Simscape コンポーネントに変換し、それを既存のモデル内で解析します。ee_CMOS_comparator.cir という名前の SPICE ネットリストは、CMOS 電圧比較器のモデルを説明するネットリストです。
% Display ee_CMOS_comparator.cir type('ee_CMOS_comparator.cir')
* CMOS Voltage Comparator * Simulation of Two-stage comparator * Input Signals VIN VP 0 AC 1V VOS VN 0 DC 0V * Power Supplies VDD VDD 0 DC 5V VSS VSS 0 DC -5V * External Components CL VOUT 0 2pF X1 VDD VSS VP VN VOUT COMPARATOR1 * Subcircuit for CMOS Voltage Comparator .SUBCKT COMPARATOR1 VDD VSS VP VN VOUT M1 N1 VN N2 VSS NMOS1 W=680u L=5u M2 N3 VP N2 VSS NMOS1 W=680u L=5u M3 N1 N1 VDD VDD PMOS1 W=5u L=5u M4 N3 N1 VDD VDD PMOS1 W=5u L=5u M5 N2 N4 VSS VSS NMOS1 W=5u L=5u M6 VOUT N3 VDD VDD PMOS1 W=60u L=5u M7 VOUT N4 VSS VSS NMOS1 W=30u L=5u M8 N4 N4 VSS VSS NMOS1 W=30u L=5u IS 0 N4 20u .MODEL NMOS1 NMOS VTO=1 KP=17U + LEVEL=1 + GAMMA=0.8 LAMBDA=0.015 PHI=0.6 + LD=0.5U CJ=5E-4 CJSW=10E-10 + U0=425 MJ=0.5 MJSW=0.5 CGSO=0.4E-9 CGDO=0.4E-9 .MODEL PMOS1 PMOS VTO=-1 KP=8U + LEVEL=1 + GAMMA=0.4 LAMBDA=0.02 PHI=0.6 + LD=0.8U CJ=5E-4 CJSW=10E-10 + U0=200 MJ=0.5 MJSW=0.5 CGSO=0.4E-9 CGDO=0.4E-9 .ENDS * Analysis *.DC VIN -1e-3 1e-3 1e-5 .AC DEC 10 1e-1 1e6 .PROBE .END
CMOS Comparator サブシステムを開く
ee_CMOS_comparator
モデルを開きます。これは、Simscape Electrical™ の Additional Components ライブラリの SPICE ブロックを使用して SPICE ネットリストをモデル化したものです。このモデルには、CMOS Comparator というサブシステムが含まれています。このサブシステムは電圧比較器のサブサーキットを手動で実装したものであり、これを、SPICE サブサーキットから変換した Simscape コンポーネントに置き換えます。
% Open model open_system('ee_CMOS_comparator') set_param(find_system('ee_CMOS_comparator','FindAll', 'on','type','annotation','Tag','ModelFeatures'),'Interpreter','off')
% Display CMOS Voltage Comparator Subsystem open_system('ee_CMOS_comparator/CMOS COMPARATOR','force');
サブシステムは、比較器を図解で説明します。以下のプロットは、CMOS 比較器回路の出力を示しています。
ee_CMOS_comparator_plot;
ゲインはおよそ 100 dB、帯域幅はおよそ 3 kHz です。DC スイープ入力電圧と AC スイープ周波数の最小値と最大値を定義するために、モデルの最上位に戻って、Define Sweep Parameters とラベル付けされたブロックをダブルクリックします。モデル内で Plot DC AC simulation results をクリックしてシミュレーションを実行し、結果をプロットします。
ただし、複数のサブサーキットをもつ大規模な SPICE ネットリストの場合、手動による変換は非効率で時間がかかり、エラーが発生しやすくなる可能性があります。Simscape Electrical には、関数 subcircuit2ssc
を使用して SPICE ネットリストを自動的に変換する方法が備わっています。
SPICE サブサーキットの Simscape コンポーネントへの変換
.cir
または .lib
の拡張子をもつ SPICE コンポーネントを、関数 subcircuit2ssc
を使用して Simscape コンポーネントに変換できます。関数 subcircuit2ssc
は、SPICE ネットリスト内の .subckt
セクションを、それぞれ単一のコンポーネントに変換します。
検証ファイルを含む一時ディレクトリを作成し、現在の作業ディレクトリを変更します。
ee_CMOS_comparator_temporary_directory;
検証ファイル ee_comparator_traf.mat
および ee_comparator_freq.mat
は、SPICE の転送特性および小信号周波数応答のデータを保存する MATLAB ファイルです。
関数 subcircuit2ssc
を使用して、電圧比較器のサブサーキット ee_CMOS_comparator.cir
を Simscape ファイルに変換し、+myComparator
という新しいディレクトリに配置します。
subcircuit2ssc('ee_CMOS_comparator.cir','+myComparator');
Netlist converted. Review Simscape component files and make manual edits for any unsupported items before building the Simscape library located at: +myComparator.
関数 ssc_build
を使用して Simscape ライブラリを生成します。
ssc_build myComparator;
Generating Simulink library 'myComparator_lib' in the current directory '/tmp/Bdoc22b_2023970_1441071/tp671c8824_9d80_4798_9a36_5093984ed097' ...
シミュレーション結果の検証
CMOS Comparator サブシステムを変換後のコンポーネントに置き換えて、端子を再結線しなければなりません。認証コードを確認するには、MATLAB コマンド ウィンドウで edit ee_CMOS_comparator_verification と入力します。スクリプトは、変換によって生成された Simscape コンポーネントをモデルに自動的に接続します。その後、線形化の方法を使用して、Simscape モデルの転送特性と小信号周波数応答を取得します。転送特性の入力電圧は -1 V ~ 1 V の範囲である一方、ボード線図の周波数範囲は 0.1 Hz ~ 1 GHz です。最後にスクリプトは、純粋な SPICE ネットリスト モデル、Simscape サブシステムを含む元のモデルと、subcircuit2ssc
を使用して取得した変換後の Simscape コンポーネントを含むモデルのシミュレーション結果を、プロットして比較します。
以下のプロットは、3 つの異なるモデルからのシミュレーション結果を示しています。変換後の Simscape コンポーネントを含むモデルの転送特性と周波数応答は、元の SPICE ネットリストのものと一致しています。
ee_CMOS_comparator_verification;
クリーン アップ
最後に、一時ディレクトリおよびそのサブディレクトリをすべて削除します。
% Delete temporary directory if exist('originalDirectory','var') cd (originalDirectory); rmdir(temporaryDirectory,'s') clear temporaryDirectory originalDirectory; end