Vlsi-design-quick-guide
VLSI設計-デジタルシステム
超大規模集積(VLSI)は、数千の*トランジスタ*を1つのチップに結合することで*集積回路*(IC)を作成するプロセスです。 VLSIは、複雑な*半導体*および*通信*技術が開発されていた1970年代に始まりました。 *マイクロプロセッサ*はVLSIデバイスです。
VLSIテクノロジーが導入される前は、ほとんどのICには実行できる機能が限られていました。 電子回路*は、 *CPU、ROM、RAM およびその他の*グルーロジック*で構成されています。 VLSIにより、IC設計者はこれらすべてを1つのチップに追加できます。
主に大規模な統合技術とシステム設計アプリケーションの急速な進歩により、エレクトロニクス業界は過去数十年にわたって驚異的な成長を遂げました。 非常に大規模な統合(VLSI)設計の出現により、高性能コンピューティング、制御、通信、画像およびビデオ処理、および家電製品における集積回路(IC)のアプリケーションの数は非常に速いペースで増加しています。
高解像度および低ビットレートのビデオおよびセルラー通信などの現在の最先端技術は、エンドユーザーにすばらしいアプリケーション、処理能力、および携帯性を提供します。 この傾向は急速に成長すると予想され、VLSI設計とシステム設計に非常に重要な意味を持ちます。
VLSI設計フロー
VLSI IC回路の設計フローを次の図に示します。 設計のさまざまなレベルに番号が付けられ、ブロックは設計フローのプロセスを示します。
仕様が最初に来て、設計されるデジタルIC回路の機能、インターフェース、およびアーキテクチャを抽象的に説明します。
次に、動作の説明を作成して、機能、パフォーマンス、特定の標準への準拠、およびその他の仕様に関して設計を分析します。
RTLの記述は、HDLを使用して行われます。 このRTL記述は、機能をテストするためにシミュレートされています。 ここから先は、EDAツールの助けが必要です。
次に、RTL記述は、ロジック合成ツールを使用してゲートレベルのネットリストに変換されます。 ゲートレベルネットリストとは、ゲート、およびそれらの間の接続に関する回路の説明であり、タイミング、電力、および面積の仕様を満たすように作成されます。
最後に、物理的なレイアウトが作成され、検証されてから製造に送られます。
Yチャート
Gajski-Kuhn Yチャートは、半導体デバイスの設計における考慮事項を捉えたモデルです。
Gajski-Kuhn Yチャートの3つのドメインは、放射軸上にあります。 各ドメインは、同心円のリングを使用して、抽象化レベルに分割できます。
トップレベル(外輪)では、チップのアーキテクチャを検討します。下位レベル(内部リング)で、設計をより詳細な実装に連続的に改良します-
動作記述から構造記述を作成するには、高レベル合成または論理合成のプロセスを使用します。
構造的な記述から物理的な記述を作成するには、レイアウト合成を使用します。
設計階層構造
設計階層には、「分割統治」の原則が含まれます。最も単純なレベルに達するまで、タスクを小さなタスクに分割することに他なりません。 このプロセスは、設計の最後の進化が非常に単純になり、製造が容易になるため、最適です。
指定されたタスクを設計フロープロセスのドメイン(動作、構造、および幾何)に設計できます。 これを理解するために、次の図に示すように、16ビット加算器の設計例を見てみましょう。
ここでは、16ビット加算器のチップ全体が4ビット加算器の4つのモジュールに分割されています。 さらに、4ビット加算器を1ビット加算器または半加算器に分割します。 1ビットの追加は最も単純な設計プロセスであり、その内部回路もチップ上で簡単に製造できます。 これで、最後の4つの加算器すべてを接続して、4ビット加算器を設計でき、さらに進んで、16ビット加算器を設計できます。
VLSI設計-FPGAテクノロジー
FPGA –はじめに
*FPGA* の完全な形式は「 *Field Programmable Gate Array* 」です。 プログラマブル相互接続を備えた1万から100万以上の論理ゲートが含まれています。 ユーザーまたは設計者は、指定された機能を簡単に実行するためのプログラム可能な相互接続を利用できます。 典型的なモデルFPGAチップを図に示します。 I/Oブロックがあり、機能に応じて設計および番号が付けられています。 ロジックレベル構成の各モジュールには、* CLB(設定可能なロジックブロック)*があります。
CLBは、モジュールに指定された論理演算を実行します。 CLBとI/Oブロック間の相互接続は、水平ルーティングチャネル、垂直ルーティングチャネル、およびPSM(プログラマブルマルチプレクサー)を使用して行われます。
含まれるCLBの数は、FPGAの複雑さのみを決定します。 CLBとPSMの機能は、VHDLまたはその他のハードウェア記述言語によって設計されています。 プログラミング後、CLBとPSMはチップ上に配置され、ルーティングチャネルで相互に接続されます。
利点
- 非常に短い時間が必要です。設計プロセスから機能チップまで。
- 物理的な製造工程は含まれていません。
- 唯一の欠点は、他のスタイルよりもコストが高いことです。
ゲートアレイ設計
- ゲートアレイ(GA)*は、高速プロトタイピング機能の点で、FPGAに次ぐランクです。 ユーザープログラミングはFPGAチップの設計実装にとって重要ですが、GAにはメタルマスクの設計と処理が使用されます。 ゲートアレイの実装には、2段階の製造プロセスが必要です。
最初のフェーズでは、各GAチップにコミットされていないトランジスタのアレイが作成されます。 これらのコミットされていないチップは、アレイのトランジスタ間の金属相互接続を定義することで完了する後のカスタマイズのために保存できます。 金属相互接続のパターニングは、チップ製造プロセスの最後に行われるため、ターンアラウンド時間は数日から数週間と短くなります。 以下の図は、ゲートアレイ実装の基本的な処理手順を示しています。
一般的なゲートアレイプラットフォームは、MOSトランジスタの行または列間のセル間ルーティングに、チャネルと呼ばれる専用領域を使用します。 それらは相互接続を簡素化します。 基本的な論理ゲートを実行する相互接続パターンはライブラリに保存され、ネットリストに従ってコミットされていないトランジスタの行をカスタマイズするために使用できます。
最新のGAのほとんどでは、チャネルルーティングに複数の金属層が使用されます。 相互接続された複数の層を使用すると、アクティブセル領域でルーティングを実現できます。そのため、Sea-of-Gates(SOG)チップのようにルーティングチャネルを削除できます。 ここでは、チップ表面全体が非コミットnMOSおよびpMOSトランジスタで覆われています。 隣接するトランジスタは、メタルマスクを使用してカスタマイズし、基本的な論理ゲートを形成できます。
セル間ルーティングでは、コミットされていないトランジスタの一部を犠牲にする必要があります。 この設計スタイルにより、相互接続の柔軟性が高まり、通常は高密度になります。 GAチップ使用率は、使用済みチップ面積を合計チップ面積で割って測定されます。 これはFPGAのそれよりも高く、チップ速度も同じです。
標準セルベースの設計
標準セルベースの設計では、完全なカスタムマスクセットの開発が必要です。 標準セルは、ポリセルとも呼ばれます。 このアプローチでは、一般的に使用されるすべてのロジックセルが開発され、特性評価され、標準セルライブラリに保存されます。
ライブラリには、インバータ、NANDゲート、NORゲート、複雑なAOI、OAIゲート、Dラッチ、フリップフロップを含む数百のセルが含まれる場合があります。 各ゲートタイプは、さまざまなファンアウトに適切な駆動能力を提供するために、いくつかのバージョンで実装できます。 インバーターゲートは標準サイズ、2倍サイズ、4倍サイズにすることができるため、チップ設計者は適切なサイズを選択して、高い回路速度とレイアウト密度を得ることができます。
各セルは、次のようないくつかの異なる特性カテゴリに従って特性化されます。
- 遅延時間と負荷容量
- 回路シミュレーションモデル
- タイミングシミュレーションモデル
- 故障シミュレーションモデル
- 配置配線のセルデータ
- マスクデータ
セルとルーティングの自動配置のために、各セルレイアウトは高さを固定して設計されているため、多数のセルを横に並べて行を形成できます。 電源レールと接地レールは、セルの上下の境界に平行に走っています。 そのため、隣接するセルは共通の電力バスと共通のグランドバスを共有します。 次の図は、標準セルベースの設計のフロアプランです。
フルカスタムデザイン
フルカスタムデザインでは、ライブラリを使用せずに、マスクデザイン全体が新しく作成されます。 この設計スタイルの開発コストは上昇しています。 したがって、設計の再利用の概念は、設計サイクル時間と開発コストを削減することで有名になっています。
最も難しいフルカスタムデザインは、静的または動的にかかわらず、メモリセルの設計です。 ロジックチップデザインの場合、同じチップ上で異なるデザインスタイルの組み合わせを使用して、適切なネゴシエーションを取得できます。 標準セル、データパスセル、および*プログラマブルロジックアレイ(PLA)*。
実際には、デザイナーは完全なカスタムレイアウト、つまり すべてのトランジスタのジオメトリ、方向、および配置。 通常、設計の生産性は非常に低くなります。通常、設計者ごとに1日に数十個のトランジスタ。 デジタルCMOS VLSIでは、人件費が高いため、フルカスタムデザインはほとんど使用されません。 これらの設計スタイルには、メモリチップ、高性能マイクロプロセッサ、FPGAなどの大量生産製品の設計が含まれます。
VLSI設計-MOSトランジスタ
相補型MOSFET(CMOS)技術は、今日、さまざまなアプリケーションで回路を形成するために広く使用されています。 今日のコンピューター、CPU、携帯電話は、いくつかの重要な利点により、CMOSを利用しています。 CMOSは両方の状態で低消費電力、比較的高速、高ノイズマージンを提供し、広範囲のソースおよび入力電圧で動作します(ソース電圧が固定されている場合)
ここで説明するプロセスでは、使用可能なトランジスタのタイプは、金属酸化物半導体電界効果トランジスタ(MOSFET)です。 これらのトランジスタは、シリコンの単結晶からなる半導体層、通常はスライス、またはウェーハで構成される「サンドイッチ」として形成されます。二酸化ケイ素(酸化物)の層と金属の層。
MOSFETの構造
図に示すように、MOS構造には3つの層が含まれています-
- 金属ゲート電極
- 絶縁酸化物層(SiO〜[.small]#2#〜)
- * P –タイプ半導体(基板)*
MOS構造はコンデンサを形成し、ゲートと基板は誘電体と同じ2枚のプレートと酸化物層です。 誘電体の厚さ(SiO〜[.small]#2#〜)は通常10 nm〜50 nmです。 基板内のキャリア濃度と分布は、ゲートと基板端子に印加される外部電圧によって操作できます。 さて、MOSの構造を理解するために、最初にP型半導体基板の基本的な電気的特性を検討してください。
半導体材料中のキャリアの濃度は、常に Mass Action Law に従っています。 マスアクション法は次のように与えられます-
n.p = n _ \ {i} ^ \ {2}
どこで、
- n は電子のキャリア濃度
- p はホールのキャリア濃度
- * n〜i〜*はシリコンの固有キャリア濃度です
ここで、基板にアクセプタ(ボロン)濃度N〜[.small]#A#〜が等しくドープされていると仮定します。 したがって、p型基板の電子および正孔濃度は
n _ \ {po} = \ frac \ {n _ \ {i} ^ \ {2}} \ {N _ \ {A}}
p _ \ {po} = N _ \ {A}
ここで、ドーピング濃度* N〜[.small]#A#〜*は(10 ^ [。small]#15#^〜10 ^ [。small]#16#^ cm ^ [。small]#-3#^)です。固有濃度niより大きい。 次に、MOS構造を理解するために、p型シリコン基板のエネルギー準位図を検討します。
図に示すように、伝導帯と価電子帯間のバンドギャップは1.1eVです。 ここで、フェルミポテンシャルΦ〜[.small]#F#〜は、固有のフェルミレベル(E〜[.small]#i#〜)とフェルミレベル(E〜[.small]#FP#〜)の差です。
FermiレベルE〜[.small]#F#〜はドーピング濃度に依存します。 フェルミポテンシャルΦ〜[.small]#F#〜は、固有のフェルミレベル(E〜[.small]#i#〜)とフェルミレベル(E〜[.small]#FP#〜)の差です。
数学的には、
\ Phi _ \ {Fp} = \ frac \ {E _ \ {F} -E _ \ {i}} \ {q}
伝導帯と自由空間の電位差は電子親和力と呼ばれ、qxで表されます。
したがって、電子がフェルミ準位から自由空間に移動するのに必要なエネルギーは仕事関数(qΦ〜[.small]#S#〜)と呼ばれ、
q \ Phi _ \ {s} =(E _ \ {c} -E _ \ {F})+ qx
次の図は、MOSを構成するコンポーネントのエネルギーバンド図を示しています。
上図に示すように、絶縁性のSiO〜[.small]#2#〜層は8eVの大きなエネルギーバンドギャップを持ち、仕事関数は0.95 eVです。 金属ゲートの仕事関数は4.1eVです。 ここでは、仕事関数が異なるため、MOSシステム全体で電圧降下が発生します。 下の図は、MOSシステムの結合エネルギーバンド図を示しています。
この図に示すように、金属ゲートと半導体(Si)のフェルミ電位レベルは同じ電位です。 表面のフェルミポテンシャルは表面ポテンシャルΦ〜[.small]#S#〜と呼ばれ、マグニチュードはフェルミポテンシャルΦ〜[.small]#F#〜よりも小さいです。
MOSFETの働き
MOSFETは、チャネル領域の近くに配置された2つのp-n接合を持つMOSコンデンサで構成され、この領域はゲート電圧によって制御されます。 両方のp-n接合に逆バイアスをかけるために、基板電位は他の3つの端子電位より低く保たれます。
ゲート電圧がしきい値電圧(V〜[.small]#GS#〜> V〜[.small]#TO#〜)を超えると、表面に反転層が確立され、n型チャネルが形成されます。ソースとドレインの間に形成されます。 このn型チャネルは、V〜[.small]#DS#〜の値に従ってドレイン電流を運びます。
V〜[.small]#DS#〜の値が異なる場合、以下で説明するように、MOSFETは異なる領域で動作できます。
線形領域
V〜[.small]#DS#〜= 0では、反転チャネル領域に熱平衡が存在し、ドレイン電流I〜[.small]#D#〜= 0です。 小さいドレイン電圧V〜[.small]#DS#〜> 0が適用されると、V〜[.small]#DS#〜に比例するドレイン電流がソースからドレインを介してチャネルに流れ始めます。
チャネルは、ソースからドレインへの電流の流れの連続的な経路を提供します。 この動作モードは*線形領域*と呼ばれます。 線形領域で動作するnチャネルMOSFETの断面図を以下の図に示します。
飽和領域の端で
V〜[.small]#DS#〜が増加すると、ドレインの終わりでチャネルの電荷とチャネルの深さが減少します。 V〜[.small]#DS#〜= V〜[.small]#DSAT#〜の場合、チャネルの電荷はゼロに減少します。これは*ピンチ-オフポイント*と呼ばれます。 飽和領域のエッジで動作するnチャネルMOSFETの断面図を以下の図に示します。
飽和領域
V〜[.small]#DS#〜> V〜[.small]#DSAT#〜の場合、ドレイン近くに空乏表面が形成され、ドレイン電圧を増加させることにより、この空乏領域はソースまで広がります。
この動作モードは*飽和領域*と呼ばれます。 ソースからチャネル端に到達する電子は、ドレイン-空乏領域に入り、高電界でドレインに向かって加速されます。
MOSFET電流–電圧特性
MOSFETの電流-電圧特性を理解するために、チャネルの近似が行われます。 この近似がなければ、MOSシステムの3次元分析は複雑になります。 電流-電圧特性の* Gradual Channel Approximation(GCA)*により、解析の問題が軽減されます。
段階的チャネル近似(GCA)
線形モードで動作するnチャネルMOSFETの断面図を検討してください。 ここで、ソースと基板はグランドに接続されています。 V〜[.small]#S#〜= V〜[.small]#B#〜= 0。 ゲート-ソース-ソース(V〜[.small]#GS#〜)およびドレイン-ソース-ソース電圧(V〜[.small]#DS#〜)電圧は、ドレイン電流I〜[を制御する外部パラメーターです。 .small]#D#〜。
電圧V〜[.small]#GS#〜は、しきい値電圧V〜[.small]#TO#〜よりも大きい電圧に設定され、ソースとドレインの間にチャネルを作成します。 図に示すように、x –方向は表面に垂直で、y –方向は表面に平行です。
ここで、図に示すように、ソースエンドでy = 0です。 ソースに対するチャネル電圧は、* V〜[.small] #C(Y)#〜*で表されます。 しきい値電圧VTOは、チャネル領域に沿って、y = 0からy = Lの間で一定であると仮定します。 チャネル電圧V〜[.small]#C#〜の境界条件は-
$$ V _ \ {c} \ left(y = 0 \ right)= V _ \ {s} = 0 \、and \、V _ \ {c} \ left(y = L \ right)= V _ \ {DS} $ $
また、仮定することができます
V _ \ {GS} \ geq V _ \ {TO} および
V _ \ {GD} = V _ \ {GS} -V _ \ {DS} \ geq V _ \ {TO}
Q1(y)を表面反転層の全可動電子電荷とします。 この電子電荷は次のように表すことができます-
Q1(y)=-C _ \ {ox}。[V _ \ {GS} -V _ \ {C(Y)}-V _ \ {TO}]
下の図は、表面反転層の空間ジオメトリを示し、その寸法を示しています。 反転層は、ドレインからソースに移動するにつれて先細りになります。 さて、チャネル長Lの小さな領域dyを考慮すると、この領域によって提供される増分抵抗dRは次のように表すことができます-
dR =-\ frac \ {dy} \ {w。\ mu _ \ {n} .Q1(y)}
ここで、マイナス記号は反転層電荷Q1の負極性によるもので、μ〜[.small]#n#〜は表面移動度であり、一定です。 さて、dR方程式のQ1(y)の値を置き換えます-
dR =-\ frac \ {dy} \ {w。\ mu _ \ {n}。\ left \\ {-C _ \ {ox} \ left [V _ \ {GS} -V _ \ {C \ left( Y \ right)} \ right] -V _ \ {TO} \ right \}}
dR = \ frac \ {dy} \ {w。\ mu _ \ {n} .C _ \ {ox} \ left [V _ \ {GS} -V _ \ {C \ left(Y \ right)} \ right ] -V _ \ {TO}}
今、小さなdy領域での電圧降下は、
dV _ \ {c} = I _ \ {D} .dR
上記の式にdRの値を入れます
dV _ \ {C} = I _ \ {D}。\ frac \ {dy} \ {w。\ mu _ \ {n} .C _ \ {ox} \ left [V _ \ {GS} -V _ \ {C( Y)} \ right] -V _ \ {TO}}
w。\ mu _ \ {n} .C _ \ {ox} \ left [V _ \ {GS} -V _ \ {C(Y)}-V _ \ {TO} \ right] .dV _ \ {C} = I _ \ {D} .dy
チャネル領域全体のドレイン電流IDを取得するには、上記の方程式をチャネルに沿ってy = 0からy = Lおよび電圧V〜[.small] #C(y)#〜= 0からV〜[ .small] #C(y)#〜= V〜[.small]#DS#〜、
C _ \ {ox} .w。\ mu _ \ {n}。\ int _ \ {V _ \ {c} = 0} ^ \ {V _ \ {DS}} \ left [V _ \ {GS} -V_ \ {C \ left(Y \ right)}-V _ \ {TO} \ right] .dV _ \ {C} = \ int _ \ {Y = 0} ^ \ {L} I _ \ {D} .dy
\ frac \ {C _ \ {ox} .w。\ mu _ \ {n}} \ {2} \ left(2 \ left [V _ \ {GS} -V _ \ {TO} \ right] V _ \ { DS} -V _ \ {DS} ^ \ {2} \ right)= I _ \ {D} \ left [L-0 \ right]
I _ \ {D} = \ frac \ {C _ \ {ox}。\ mu _ \ {n}} \ {2}。\ frac \ {w} \ {L} \ left(2 \ left [V_ \ {GS} -V _ \ {TO} \ right] V _ \ {DS} -V _ \ {DS} ^ \ {2} \ right)
線形領域の場合V〜[.small]#DS#〜<V〜[.small]#GS#〜− V〜[.small]#TO#〜。 飽和領域の場合、V〜[.small]#DS#〜の値は(V〜[.small]#GS#〜− V〜[.small]#TO#〜)よりも大きくなります。 したがって、飽和領域の場合、V〜[.small]#DS#〜=(V〜[.small]#GS#〜-V〜[.small]#TO#〜)。
I _ \ {D} = C _ \ {ox}。\ mu _ \ {n}。\ frac \ {w} \ {2} \ left(\ frac \ {\ left [2V _ \ {DS} \ right] V _ \ {DS} -V _ \ {DS} ^ \ {2}} \ {L} \ right)
I _ \ {D} = C _ \ {ox}。\ mu _ \ {n}。\ frac \ {w} \ {2} \ left(\ frac \ {2V _ \ {DS} ^ \ {2}- V _ \ {DS} ^ \ {2}} \ {L} \ right)
I _ \ {D} = C _ \ {ox}。\ mu _ \ {n}。\ frac \ {w} \ {2} \ left(\ frac \ {V _ \ {DS} ^ \ {2}} \ {L} \ right)
I _ \ {D} = C _ \ {ox}。\ mu _ \ {n}。\ frac \ {w} \ {2} \ left(\ frac \ {\ left [V _ \ {GS} -V_ \ {TO} \ right] ^ \ {2}} \ {L} \ right)
VLSI設計-MOSインバーター
インバーターは、すべてのデジタル設計の中核です。 その動作と特性が明確に理解されると、NANDゲート、加算器、乗算器、マイクロプロセッサなどのより複雑な構造の設計が大幅に簡素化されます。 これらの複雑な回路の電気的挙動は、インバータで得られた結果を外挿することでほぼ完全に導き出すことができます。
インバーターの解析を拡張して、NAND、NOR、XORなどのより複雑なゲートの動作を説明できます。これらのゲートは、乗算器やプロセッサーなどのモジュールのビルディングブロックを形成します。 この章では、インバーターゲートの1つの具体化、つまり静的CMOSインバーター、つまりCMOSインバーターに焦点を当てます。 これは確かに現在最も人気があり、したがって私たちの特別な注意に値します。
動作原理
理想的なインバータの論理記号と真理値表を下の図に示します。 ここで、Aは入力で、Bはノード電圧で表される反転出力です。 正論理を使用すると、論理1のブール値はV〜[.small]#dd#〜で表され、論理0は0で表されます。 V〜[.small]#th#〜はインバーターのしきい値電圧で、V〜[.small]#dd#〜/2です。V〜[.small]#dd#〜は出力電圧です。
入力がV〜[.small]#th#〜より小さい場合、出力は0からV〜[.small]#dd#〜に切り替わります。 したがって、0 <V〜[.small]#in#〜<V〜[.small]#th#〜出力は論理0入力に等しく、V〜[.small]#th#〜<V〜[.small ]#in#〜<V〜[.small]#dd#〜は、インバーターのロジック1入力と同じです。
図に示されている特性は理想的です。 nMOSインバーターの一般化された回路構造を下図に示します。
与えられた図から、インバータの入力電圧はnMOSトランジスタのゲート-ソース電圧に等しく、インバータの出力電圧はnMOSトランジスタのドレイン-ソース電圧に等しいことがわかります。 nMOSのソースから基板への電圧は、接地されたトランジスタのドライバとも呼ばれます。 V〜[.small]#SS#〜= 0です。 出力ノードは、VTCに使用される集中容量に接続されています。
抵抗負荷インバータ
抵抗負荷インバータの基本構造を下図に示します。 ここでは、エンハンスメント型nMOSがドライバートランジスタとして機能します。 負荷は、単純な線形抵抗R〜[.small]#L#〜で構成されます。 回路の電源はV〜[.small]#DD#〜であり、ドレイン電流I〜[.small]#D#〜は負荷電流I〜[.small]#R#〜に等しくなります。
回路動作
ドライバトランジスタの入力がしきい値電圧V〜[.small]#TH#〜(V〜[.small]#in#〜<V〜[.small]#TH#〜)より小さい場合、ドライバトランジスタはインカットオフ領域。電流は流れません。 したがって、負荷抵抗の電圧降下はゼロで、出力電圧はV〜[.small]#DD#〜に等しくなります。 ここで、入力電圧がさらに増加すると、ドライバトランジスタがゼロ以外の電流を流し始め、nMOSが飽和領域に入ります。
数学的には、
I _ \ {D} = \ frac \ {K _ \ {n}} \ {2} \ left [V _ \ {GS} -V _ \ {TO} \ right] ^ \ {2}
入力電圧をさらに上げると、ドライバートランジスタが線形領域に入り、ドライバートランジスタの出力が減少します。
I _ \ {D} = \ frac \ {K _ \ {n}} \ {2} 2 \ left [V _ \ {GS} -V _ \ {TO} \ right] V _ \ {DS} -V _ \ {DS } ^ \ {2}
以下に示す抵抗負荷インバータのVTCは、ドライバートランジスタの動作モードと電圧ポイントを示します。
N型MOSFET負荷付きインバータ
MOSFETを負荷デバイスとして使用する主な利点は、トランジスタが占めるシリコン面積が抵抗性負荷が占める面積よりも小さいことです。 ここで、MOSFETはアクティブ負荷であり、アクティブ負荷を備えたインバータは、抵抗負荷を備えたインバータよりも優れたパフォーマンスを提供します。
エンハンスメント負荷NMOS
エンハンスメント型負荷装置を備えた2つのインバーターを図に示します。 負荷トランジスタは、ゲート端子に印加されるバイアス電圧に応じて、飽和領域または線形領域で動作できます。 飽和エンハンスメント負荷インバーターを図に示します。 (a). 単一の電圧供給と簡単な製造プロセスが必要なため、V〜[.small]#OH#〜はV〜[.small]#DD#〜-V〜[.small]#T#〜に制限されます。
線形強化負荷インバーターは図に示されています。 (b). 常に線形領域で動作します。 V〜[.small]#OH#〜レベルはV〜[.small]#DD#〜と等しくなります。
線形負荷インバーターは、飽和エンハンスメントインバーターと比較してノイズマージンが高くなります。 しかし、線形エンハンスメントインバータの欠点は、2つの別個の電源が必要であり、両方の回路が高い電力損失を被ることです。 したがって、エンハンスメントインバーターは、大規模なデジタルアプリケーションでは使用されません。
空乏負荷NMOS
エンハンスメント負荷インバータの欠点は、空乏負荷インバータを使用することで克服できます。 エンハンスメントロードインバータと比較して、デプレッションロードインバータは、負荷のしきい値電圧を調整するためのチャネルインプラントの製造ステップがほとんど必要ありません。
空乏負荷インバータの利点は、VTCの急激な移行、ノイズマージンの改善、単一電源、全体のレイアウト面積の縮小です。
図に示すように、負荷のゲートとソース端子が接続されています。したがって、V〜[.small]#GS#〜= 0です。 したがって、負荷のしきい値電圧は負です。 したがって、
V _ \ {GS、load}> V _ \ {T、load} が満たされている
したがって、負荷デバイスには、入力および出力電圧レベルに関係なく、常に伝導チャネルがあります。
負荷トランジスタが飽和領域にあるとき、負荷電流は
I _ \ {D、load} = \ frac \ {K _ \ {n、load}} \ {2} \ left [-V _ \ {T、load} \ left(V _ \ {out} \ right)\ right ] ^ \ {2}
負荷トランジスタが線形領域にある場合、負荷電流は
I _ \ {D、load} = \ frac \ {K _ \ {n、load}} \ {2} \ left [2 \ left | V _ \ {T、load} \ left(V _ \ {out} \ right)\ right |。\ left(V _ \ {DD} -V _ \ {out} \ right)-\ left(V _ \ {DD} -V_ \ {out} \ right)^ \ {2} \ right]
空乏型負荷インバータの電圧伝達特性を以下の図に示します-
CMOSインバーター–回路、動作、説明
CMOSインバーター回路を図に示します。 ここでは、nMOSおよびpMOSトランジスタがドライバトランジスタとして機能します。一方のトランジスタがオンのとき、他方はオフになります。
この構成は、* complementary MOS(CMOS)*と呼ばれます。 入力は両方のトランジスタのゲート端子に接続されているため、両方を入力電圧で直接駆動できます。 nMOSの基板はグランドに接続され、pMOSの基板は電源V〜[.small]#DD#〜に接続されます。
したがって、両方のトランジスタでV〜[.small]#SB#〜= 0です。
V _ \ {GS、n} = V _ \ {in}
V _ \ {DS、n} = V _ \ {out}
And,
V _ \ {GS、p} = V _ \ {in} -V _ \ {DD}
V _ \ {DS、p} = V _ \ {out} -V _ \ {DD}
nMOSの入力がしきい値電圧より小さい場合(V〜[.small]#in#〜<V〜[.small]#TO、n#〜)、nMOSはカットオフされ、pMOSは線形領域にあります。 したがって、両方のトランジスタのドレイン電流はゼロです。
I _ \ {D、n} = I _ \ {D、p} = 0
したがって、出力電圧V〜[.small]#OH#〜は供給電圧に等しくなります。
V _ \ {out} = V _ \ {OH} = V _ \ {DD}
入力電圧がV〜[.small]#DD#〜よりも大きい場合V〜[.small]#TO、p#〜、pMOSトランジスタはカットオフ領域にあり、nMOSは線形領域にあるため、両方のトランジスタのドレイン電流はゼロです。
I _ \ {D、n} = I _ \ {D、p} = 0
したがって、出力電圧V〜[.small]#OL#〜はゼロに等しくなります。
V _ \ {out} = V _ \ {OL} = 0
nMOSは、V〜[.small]#in#〜> V〜[.small]#TO#〜であり、以下の条件が満たされている場合、飽和領域で動作します。
V _ \ {DS、n} \ geq V _ \ {GS、n} -V _ \ {TO、n}
V _ \ {out} \ geq V _ \ {in} -V _ \ {TO、n}
V〜[.small]#in#〜<V〜[.small]#DD#〜&plus;の場合、pMOSは飽和領域で動作します。 V〜[.small]#TO、p#〜および次の条件が満たされる場合。
V _ \ {DS、p} \ leq V _ \ {GS、p} -V _ \ {TO、p}
V _ \ {out} \ leq V _ \ {in} -V _ \ {TO、p}
入力電圧の値が異なる場合、両方のトランジスタの動作領域を以下にリストします。
Region | V~in~ | V~out~ | nMOS | pMOS |
---|---|---|---|---|
A | < V~TO, n~ | V~OH~ | Cut – off | Linear |
B | V~IL~ | High ≈ V~OH~ | Saturation | Linear |
C | V~th~ | V~th~ | Saturation | Saturation |
D | V~IH~ | Low ≈ V~OL~ | Linear | Saturation |
E | > (V~DD~ PLUS V~TO, p~) | V~OL~ | Linear | Cut – off |
CMOSのVTCは次の図に示されています-
組み合わせMOS論理回路
複数の入力変数に対してブール演算を実行し、出力を入力のブール関数として決定する組み合わせ論理回路またはゲートは、すべてのデジタルシステムの基本的な構成要素です。 2入力NANDゲートやNORゲートなどの単純な回路構成を調べてから、より一般的な複数入力回路構造のケースに分析を拡張します。
次に、CMOS論理回路を同様に示します。 nMOSデプレッションロードロジックとCMOSロジック回路の類似点と相違点を強調し、例を挙げてCMOSゲートの利点を指摘します。 最も一般的な形式では、ブール関数を実行する組み合わせ論理回路、またはゲートは、図に示すように、複数入力単一出力システムとして表すことができます。
接地電位を基準としたノード電圧は、すべての入力変数を表します。 正論理規則を使用すると、ブール(または論理)値「1」はVDDの高電圧で表され、ブール(または論理)値「0」は低電圧0で表されます。 出力ノードには、回路内の寄生デバイスの結合容量を表す容量C〜[.small]#L#〜がロードされます。
CMOS論理回路
CMOS 2入力NORゲート
この回路は、並列接続されたnネットと直列接続された相補的なpネットで構成されています。 入力電圧V〜[.small]#X#〜およびV〜[.small]#Y#〜は、1つのnMOSおよび1つのpMOSトランジスタのゲートに印加されます。
一方または両方の入力が高い場合、つまり、n-netが出力ノードとグランドの間に導電パスを作成する場合、p-netは切断されます。 両方の入力電圧が低い場合、つまりn-netがカットオフの場合、p-netは出力ノードと供給電圧の間に導電パスを作成します。
任意の入力の組み合わせに対して、相補的な回路構造は、出力がV〜[.small]#DD#〜またはV〜[.small間の低抵抗経路とDC電流経路を介してグランドに接続されるようなものです。 ]#DD#〜および入力の組み合わせに対してグラウンドは確立されません。 CMOSの出力電圧である2入力NORゲートは、V〜[.small]#OL#〜= 0の論理低電圧とV〜[.small]#OH#〜= Vの論理高電圧を取得します。 〜[.small]#DD#〜。 スイッチングしきい値電圧V〜[.small]#th#〜の式は、
V _ \ {th} \ left(NOR2 \ right)= \ frac \ {V _ \ {T、n} + \ frac \ {1} \ {2} \ sqrt \ {\ frac \ {k _ \ {p} } \ {k _ \ {n}} \ left(V _ \ {DD}-\ left | V _ \ {T、p} \ right | \ right)}} \ {1+ \ frac \ {1} \ {2} \ sqrt \ {\ frac \ {k _ \ {p}} \ {k _ \ {n}}}}
CMOS 2入力NORゲートのレイアウト
図は、単層金属と単層ポリシリコンを使用したCMOS 2入力NORゲートのサンプルレイアウトを示しています。 このレイアウトの機能は次のとおりです-
- 各入力の単一の垂直ポリライン
- それぞれNおよびPデバイスの単一のアクティブシェイプ
- 水平に走る金属バス
CMOS N0R2ゲートのスティック図を以下の図に示します。これはレイアウトに直接対応しますが、WおよびL情報は含まれません。 拡散領域は長方形で表され、金属接続と実線と円はそれぞれコンタクトを表し、クロスハッチングされたストリップはポリシリコン列を表します。 スティック図は、最適なレイアウトトポロジを計画するのに役立ちます。
CMOS 2入力NANDゲート
2入力CMOS NANDゲートの回路図を下図に示します。
回路の動作原理は、CMOS 2入力NOR動作の正確なデュアルです。 2つの直列接続されたnMOSトランジスタで構成されるn –ネットは、両方の入力電圧がロジックHighの場合、出力ノードとグランド間に導電パスを作成します。 p-netの並列接続されたpMOSトランジスタは両方ともオフになります。
他のすべての入力の組み合わせでは、pMOSトランジスタの一方または両方がオンになり、p – netが切断されるため、出力ノードと電源電圧の間に電流経路が作成されます。 このゲートのスイッチングしきい値は次のように取得されます-
V _ \ {th} \ left(NAND2 \ right)= \ frac \ {V _ \ {T、n} +2 \ sqrt \ {\ frac \ {k _ \ {p}} \ {k _ \ {n}} \ left(V _ \ {DD}-\ left | V _ \ {T、p} \ right | \ right)}} \ {1 + 2 \ sqrt \ {\ frac \ {k _ \ {p}} \ {k_ \ {n}}}}
このレイアウトの機能は次のとおりです-
- 入力用の単一のポリシリコンラインは、NとPの両方のアクティブ領域を垂直に走ります。
- 単一のアクティブシェイプは、nMOSデバイスとpMOSデバイスの両方を構築するために使用されます。
- パワーバスは、レイアウトの上下を水平に走っています。
- 出力ワイヤは水平に走り、隣接する回路に簡単に接続できます。
複雑な論理回路
NMOS空乏化負荷の複雑な論理ゲート
複数の入力変数の複雑な機能を実現するために、NORおよびNAND向けに開発された基本的な回路構造と設計原理を複雑な論理ゲートに拡張できます。 少数のトランジスタを使用して複雑な論理機能を実現する能力は、nMOSおよびCMOS論理回路の最も魅力的な機能の1つです。 例として次のブール関数を考えます。
\ overline \ {Z = P \ left(S + T \ right)+ QR}
この機能を実現するために使用されるnMOS空乏負荷複合論理ゲートを図に示します。 この図では、3つのドライバートランジスタの左側のnMOSドライバーブランチが論理関数P(SプラスT)を実行するために使用され、右側のブランチが関数QRを実行します。 2つの分岐を並列に接続し、出力ノードと電源電圧* V〜[.small]#DD#〜の間に負荷トランジスタを配置することにより、特定の複素関数を取得します。 各入力変数は、1つのドライバーにのみ割り当てられます。
回路トポロジの検査により、プルダウンネットワークの簡単な設計原理が得られます-
- OR操作は、並列接続されたドライバーによって実行されます。
- AND操作は、直列接続されたドライバーによって実行されます。
- 反転は、MOS回路動作の性質によって提供されます。
機能を実現する回路ですべての入力変数がロジックハイの場合、5つのnMOSトランジスタで構成されるプルダウンネットワークの等価ドライバー*(W/L)*比は
\ frac \ {W} \ {L} = \ frac \ {1} \ {\ frac \ {1} \ {\ left(W/L \ right)Q} + \ frac \ {1} \ {\左(W/L \ right)R}} + \ frac \ {1} \ {\ frac \ {1} \ {\ left(W/L \ right)P} + \ frac \ {1} \ {\ left (W/L \ right)S + \ left(W/L \ right)Q}}
複雑なCMOS論理ゲート
n-net(プルダウンネットワーク)の実現は、nMOSの空乏負荷の複雑な論理ゲートについて検討されたのと同じ基本設計原理に基づいています。 pMOSプルアップネットワークは、n-netのデュアルネットワークである必要があります。
これは、nMOSネットワークのすべての並列接続がpMOSネットワークの直列接続に対応し、nMOSネットワークのすべての直列接続がpMOSネットワークの並列接続に対応することを意味します。 この図は、n-net(プルダウン)グラフからのデュアルp-net(プルアップ)グラフの単純な構造を示しています。
プルダウンネットワークの各ドライバートランジスタはaiで示され、各ノードはプルダウングラフの頂点で示されます。 次に、プルグラフの各限定領域内に新しい頂点が作成され、プルダウングラフの各エッジと1回だけ交差するエッジによって隣接する頂点が接続されます。 この新しいグラフは、プルアップネットワークを示しています。
オイラーグラフ法を使用したレイアウト手法
この図は、複雑な機能のCMOS実装と、CMOSゲートの最適でないレイアウトを提供する任意のゲート順序で行われたスティック図を示しています。
この場合、ポリシリコンカラム間の分離は、その間の拡散-拡散分離を可能にしなければなりません。 これは確かにかなりの量の余分なシリコン領域を消費します。
complex function stick diagram
オイラーパスを使用すると、最適なレイアウトを取得できます。 オイラーパスは、グラフの各エッジ(ブランチ)を1回だけ通過する連続したパスとして定義されます。 入力の順序が同じプルダウンツリーグラフとプルアップツリーグラフの両方でオイラーパスを見つけます。
VLSI設計-シーケンシャルMOS論理回路
論理回路は、(a)組み合わせ回路と(b)順序回路の2つのカテゴリに分類されます。
組み合わせ回路では、出力は最新の入力の状態のみに依存します。
順序回路では、出力は最新の入力だけでなく、以前の入力の状態にも依存します。 順序回路にはメモリ要素が含まれています。
順序回路には3つのタイプがあります-
双安定-双安定回路には2つの安定した動作点があり、いずれかの状態になります。 例-メモリセル、ラッチ、フリップフロップ、およびレジスタ。
単安定-単安定回路には安定した動作点が1つしかなく、一時的に反対の状態に動揺しても、時間内に安定した動作点に戻ります。 例:タイマー、パルス発生器。
安定-回路には安定した動作点がなく、いくつかの状態の間で発振します。 例-リングオシレーター。
CMOS論理回路
NORゲートに基づくSRラッチ
セット入力(S)が論理 "1" に等しく、リセット入力が論理 "0。" に等しい場合、出力Qは論理 "1" に強制されます。 $ \ overline \ {Q} $は論理 "0" に強制されます。 これは、以前の状態に関係なく、SRラッチが設定されることを意味します。
同様に、Sが "0"に等しく、Rが "1" に等しい場合、出力Qは "0" に強制されますが、$ \ overline \ {Q} $は "1" に強制されます。 これは、以前に保持された状態に関係なく、ラッチがリセットされることを意味します。 最後に、入力SとRの両方が論理 "1" に等しい場合、両方の出力は論理 "0" に強制され、Qと$ \ overline \ {Q} $の相補性と競合します。
したがって、通常の操作ではこの入力の組み合わせは許可されません。 NORベースのSRラッチの真理値表を表に示します。
S | R | Q | $\overline{Q}$ | Operation |
---|---|---|---|---|
0 | 0 | Q | $\overline{Q}$ | Hold |
1 | 0 | 1 | 0 | Set |
0 | 1 | 0 | 1 | Reset |
1 | 1 | 0 | 0 | Not allowed |
NORゲートに基づくCMOS SRラッチを以下の図に示します。
SがV〜[.small]#OH#〜に等しく、RがV〜[.small]#OL#〜に等しい場合、並列接続されたトランジスタM1とM2の両方がオンになります。 ノード$ \ overline \ {Q} $の電圧は、V〜[.small]#OL#〜= 0のロジックLowレベルを想定しています。
同時に、M3とM4の両方がオフになり、ノードQにロジック高電圧V〜[.small]#OH#〜が生じます。 RがV〜[.small]#OH#〜に等しく、SがV〜[.small]#OL#〜に等しい場合、M1とM2はオフになり、M3とM4はオンになります。
NANDゲートに基づくSRラッチ
NANDベースのSRラッチのブロック図とゲートレベル回路図を図に示します。 SおよびR入力端子の小さな円は、回路がアクティブLow入力信号に応答することを表しています。 NANDベースのSRラッチの真理値表を表に示します
S | R | Q | Q′ | |
0 | 0 | NC | NC | No change. Latch remained in present state. |
1 | 0 | 1 | 0 | Latch SET. |
0 | 1 | 0 | 1 | Latch RESET. |
1 | 1 | 0 | 0 | Invalid condition. |
Sが0になると(R = 1の場合)、Qが高くなり、$ \ overline \ {Q} $が低くなり、ラッチがSet状態になります。
S = 0 その後Q = 1 (R = 1 の場合)
Rが0になると(S = 1の場合)、Qが高くなり、$ \ overline \ {Q} $が低くなり、ラッチがリセットされます。
R = 0 その後Q = 1 (S = 1 の場合)
ホールド状態では、SとRの両方が高いことが必要です。 S = R = 0の場合、結果は不定状態になるため、出力は許可されません。 NANDゲートに基づくCMOS SRラッチを図に示します。
NANDゲートに基づく空乏負荷nMOS SRラッチを図に示します。 動作は、CMOS NAND SRラッチの動作に似ています。 CMOS回路の実装には、低い静的消費電力と高いノイズマージンがあります。
CMOS論理回路
クロックSRラッチ
この図は、クロックが追加されたNORベースのSRラッチを示しています。 ラッチは、CLKがHighの場合にのみ入力SおよびRに応答します。
CLKがローの場合、ラッチは現在の状態を保持します。 Qが状態を変更することを観察します-
- Sが正のCLK中にHighになるとき。
- CLKロー時間中にS&Rが変化した後のCLKの立ち上がりエッジ。
- CLKがHighの間のSの正のグリッチ
- 正のCLKの間にRがHighになるとき。
クロックドNORベースのSRラッチのCMOS AOI実装を図に示します。 必要なトランジスタは12個のみであることに注意してください。
- CLKがLowの場合、NツリーNの2つの直列端子が開いており、ツリーPの2つの並列トランジスタがオンであるため、メモリセルの状態が保持されます。
- クロックが高い場合、回路は入力SとRに応答する単純なNORベースのCMOSラッチになります。
- NANDゲートに基づくクロックSRラッチ*
回路は4つのNANDゲートで実装されています。 この回路がCMOSで実装されている場合、16個のトランジスタが必要です。
- ラッチは、CLKがHighの場合にのみSまたはRに応答します。
- 入力信号とCLK信号の両方がアクティブHighの場合、つまり、CLK = "1" S = "1"およびR = "0"のときにラッチ出力Qが設定されます。
- 同様に、CLK = "1"、S = "0"、および
CLKがLowの場合、ラッチは現在の状態を保持します。
クロックJKラッチ
上の図は、NANDゲートに基づくクロック付きJKラッチを示しています。 SRラッチの欠点は、SとRの両方が高い場合、その出力状態が不定になることです。 JKラッチは、出力から入力へのフィードバックを使用することでこの問題を排除し、真理値表のすべての入力状態が許容されるようにします。 J = K = 0の場合、ラッチは現在の状態を保持します。
J = 1およびK = 0の場合、ラッチは次の正方向のクロックエッジで設定されます。 Q = 1、$ \ overline \ {Q} $ = 0
J = 0およびK = 1の場合、ラッチは次の正方向のクロックエッジでリセットされます。 Q = 1および$ \ overline \ {Q} $ = 0。
J = K = 1の場合、ラッチは次の正方向のクロックエッジでトグルします
クロック駆動JKラッチの動作は、表に示す真理値表にまとめられています。
J
K
Q
$ \ overline \ {Q} $
S
R
Q
$ \ overline \ {Q} $
操作
0
0
0
1
1
1
0
1
Hold
1
0
1
1
1
0
0
1
0
1
1
1
0
1
リセット
1
0
1
0
0
1
1
0
0
1
0
1
1
0
Set
1
0
1
1
1
0
1
1
0
1
0
1
1
0
トグル
1
0
1
0
0
1
CMOS Dラッチの実装
画像:/vlsi_design/images/cmos_gate_level.jpg [CMOSゲートレベル]画像:/vlsi_design/images/cmos_d_latch.jpg [CMOS Dラッチ]
Dラッチは通常、図に示すようにトランスミッションゲート(TG)スイッチで実装されます。 入力TGはCLKでアクティブになり、ラッチフィードバックループTGはCLKでアクティブになります。 CLKがHighのとき、入力Dが受け入れられます。 CLKがLowになると、入力はオープン回路になり、ラッチは前のデータDで設定されます。
VLSIデザイン-VHDLの概要
VHDLは、非常に高速な集積回路ハードウェア記述言語の略です。 これは、モデリングのデータフロー、動作スタイル、構造スタイルによってデジタルシステムをモデル化するために使用されるプログラミング言語です。 この言語は、1981年にVHSICプログラムの下で国防総省(DoD)のために初めて導入されました。
デザインの説明
VHDLでは、エンティティを使用してハードウェアモジュールを記述します。 エンティティは、次を使用して説明できます。
- エンティティ宣言
- 建築
- 設定
- パッケージ宣言
- パッケージ本体
これらは何ですか?
エンティティ宣言
ハードウェアモジュールの名前、入出力信号、およびモードを定義します。
構文-
entity entity_name is
Port declaration;
end entity_name;
エンティティ宣言は「entity」で始まり、「end」キーワードで終わる必要があります。 方向は、入力、出力、または入出力です。
In | Port can be read |
Out | Port can be written |
Inout | Port can be read and written |
Buffer | Port can be read and written, it can have only one source. |
アーキテクチャ-
アーキテクチャは、構造、データフロー、動作、または混合スタイルを使用して説明できます。
構文-
architecture architecture_name of entity_name
architecture_declarative_part;
begin
Statements;
end architecture_name;
ここでは、アーキテクチャ本体を記述しているエンティティ名を指定する必要があります。 アーキテクチャステートメントは、「begin」および「énd」キーワード内に含める必要があります。 アーキテクチャー宣言部には、変数、定数、またはコンポーネント宣言が含まれる場合があります。
データフローモデリング
このモデリングスタイルでは、エンティティを通るデータのフローは、同時(並列)信号を使用して表現されます。 VHDLの同時ステートメントは、WHENおよびGENERATEです。
それらに加えて、演算子(AND、NOT、&plus;、*、sllなど)のみを使用した割り当てもコードの構築に使用できます。
最後に、BLOCKと呼ばれる特別な種類の割り当ても、この種のコードで使用できます。
並行コードでは、以下を使用できます-
- オペレータ
- WHENステートメント(WHEN/ELSEまたはWITH/SELECT/WHEN);
- GENERATEステートメント。
- BLOCKステートメント
行動モデリング
このモデリングスタイルでは、一連のステートメントとしてのエンティティの動作が、指定された順序で順番に実行されます。 PROCESS、FUNCTION、またはPROCEDURE内に配置されたステートメントのみが順次です。
PROCESSES、FUNCTIONS、およびPROCEDURESは、順次実行されるコードの唯一のセクションです。
ただし、全体として、これらのブロックはいずれも、外部に配置された他のステートメントと同時に存在します。
ビヘイビアコードの1つの重要な側面は、シーケンシャルロジックに限定されないことです。 実際、これを使用して、順序回路と組み合わせ回路を構築できます。
動作ステートメントは、IF、WAIT、CASE、およびLOOPです。 変数も制限されており、シーケンシャルコードでのみ使用されることになっています。 VARIABLEがグローバルになることはないため、その値を直接渡すことはできません。
構造モデリング
このモデリングでは、エンティティは相互接続されたコンポーネントのセットとして記述されます。 コンポーネントのインスタンス化ステートメントは、並行ステートメントです。 したがって、これらのステートメントの順序は重要ではありません。 モデリングの構造スタイルは、コンポーネントの相互接続(ブラックボックスとして表示)のみを記述し、コンポーネント自体またはそれらが集合的に表すエンティティの動作を意味しません。
構造モデリングでは、アーキテクチャ本体は2つの部分で構成されます-宣言部(キーワード開始前)とステートメント部(キーワード開始後)
論理演算– AND GATE
X | Y | Z |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
VHDL Code:
Library ieee;
use ieee.std_logic_1164.all;
entity and1 is
port(x,y:in bit ; z:out bit);
end and1;
architecture virat of and1 is
begin
z<=x and y;
end virat;
波形
論理演算– ORゲート
X | Y | Z |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
VHDL Code:
Library ieee;
use ieee.std_logic_1164.all;
entity or1 is
port(x,y:in bit ; z:out bit);
end or1;
architecture virat of or1 is
begin
z<=x or y;
end virat;
波形
論理演算-NOTゲート
X | Y |
---|---|
0 | 1 |
1 | 0 |
VHDL Code:
Library ieee;
use ieee.std_logic_1164.all;
entity not1 is
port(x:in bit ; y:out bit);
end not1;
architecture virat of not1 is
begin
y<=not x;
end virat;
波形
論理演算– NANDゲート
X | Y | z |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
VHDL Code:
Library ieee;
use ieee.std_logic_1164.all;
entity nand1 is
port(a,b:in bit ; c:out bit);
end nand1;
architecture virat of nand1 is
begin
c<=a nand b;
end virat;
波形
論理演算– NORゲート
X | Y | z |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 0 |
VHDL Code:
Library ieee;
use ieee.std_logic_1164.all;
entity nor1 is
port(a,b:in bit ; c:out bit);
end nor1;
architecture virat of nor1 is
begin
c<=a nor b;
end virat;
波形
論理演算– XORゲート
X | Y | Z |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
VHDL Code:
Library ieee;
use ieee.std_logic_1164.all;
entity xor1 is
port(a,b:in bit ; c:out bit);
end xor1;
architecture virat of xor1 is
begin
c<=a xor b;
end virat;
波形
論理演算– X-NORゲート
X | Y | Z |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
VHDL Code:
Library ieee;
use ieee.std_logic_1164.all;
entity xnor1 is
port(a,b:in bit ; c:out bit);
end xnor1;
architecture virat of xnor1 is
begin
c<=not(a xor b);
end virat;
波形
VHDLプログラミングの組み合わせ回路
この章では、組み合わせ回路のVHDLプログラミングについて説明します。
半加算器のVHDLコード
VHDL Code:
Library ieee;
use ieee.std_logic_1164.all;
entity half_adder is
port(a,b:in bit; sum,carry:out bit);
end half_adder;
architecture data of half_adder is
begin
sum<= a xor b;
carry <= a and b;
end data;
波形
全加算器のVHDLコード
Library ieee;
use ieee.std_logic_1164.all;
entity full_adder is port(a,b,c:in bit; sum,carry:out bit);
end full_adder;
architecture data of full_adder is
begin
sum<= a xor b xor c;
carry <= ((a and b) or (b and c) or (a and c));
end data;
波形
半減算器のVHDLコード
Library ieee;
use ieee.std_logic_1164.all;
entity half_sub is
port(a,c:in bit; d,b:out bit);
end half_sub;
architecture data of half_sub is
begin
d<= a xor c;
b<= (a and (not c));
end data;
波形
完全な減算器のVHDLコード
Library ieee;
use ieee.std_logic_1164.all;
entity full_sub is
port(a,b,c:in bit; sub,borrow:out bit);
end full_sub;
architecture data of full_sub is
begin
sub<= a xor b xor c;
borrow <= ((b xor c) and (not a)) or (b and c);
end data;
波形
マルチプレクサーのVHDLコード
Library ieee;
use ieee.std_logic_1164.all;
entity mux is
port(S1,S0,D0,D1,D2,D3:in bit; Y:out bit);
end mux;
architecture data of mux is
begin
Y<= (not S0 and not S1 and D0) or
(S0 and not S1 and D1) or
(not S0 and S1 and D2) or
(S0 and S1 and D3);
end data;
波形
デマルチプレクサーのVHDLコード
Library ieee;
use ieee.std_logic_1164.all;
entity demux is
port(S1,S0,D:in bit; Y0,Y1,Y2,Y3:out bit);
end demux;
architecture data of demux is
begin
Y0<= ((Not S0) and (Not S1) and D);
Y1<= ((Not S0) and S1 and D);
Y2<= (S0 and (Not S1) and D);
Y3<= (S0 and S1 and D);
end data;
波形
8 x 3エンコーダーのVHDLコード
library ieee;
use ieee.std_logic_1164.all;
entity enc is
port(i0,i1,i2,i3,i4,i5,i6,i7:in bit; o0,o1,o2: out bit);
end enc;
architecture vcgandhi of enc is
begin
o0<=i4 or i5 or i6 or i7;
o1<=i2 or i3 or i6 or i7;
o2<=i1 or i3 or i5 or i7;
end vcgandhi;
波形
3 x 8デコーダーのVHDLコード
library ieee;
use ieee.std_logic_1164.all;
entity dec is
port(i0,i1,i2:in bit; o0,o1,o2,o3,o4,o5,o6,o7: out bit);
end dec;
architecture vcgandhi of dec is
begin
o0<=(not i0) and (not i1) and (not i2);
o1<=(not i0) and (not i1) and i2;
o2<=(not i0) and i1 and (not i2);
o3<=(not i0) and i1 and i2;
o4<=i0 and (not i1) and (not i2);
o5<=i0 and (not i1) and i2;
o6<=i0 and i1 and (not i2);
o7<=i0 and i1 and i2;
end vcgandhi;
波形
VHDLコード– 4ビット並列加算器
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity pa is
port(a : in STD_LOGIC_VECTOR(3 downto 0);
b : in STD_LOGIC_VECTOR(3 downto 0);
ca : out STD_LOGIC;
sum : out STD_LOGIC_VECTOR(3 downto 0)
);
end pa;
architecture vcgandhi of pa is
Component fa is
port (a : in STD_LOGIC;
b : in STD_LOGIC;
c : in STD_LOGIC;
sum : out STD_LOGIC;
ca : out STD_LOGIC
);
end component;
signal s : std_logic_vector (2 downto 0);
signal temp: std_logic;
begin
temp<='0';
u0 : fa port map (a(0),b(0),temp,sum(0),s(0));
u1 : fa port map (a(1),b(1),s(0),sum(1),s(1));
u2 : fa port map (a(2),b(2),s(1),sum(2),s(2));
ue : fa port map (a(3),b(3),s(2),sum(3),ca);
end vcgandhi;
波形
VHDLコード– 4ビットパリティチェッカー
library ieee;
use ieee.std_logic_1164.all;
entity parity_checker is
port (a0,a1,a2,a3 : in std_logic;
p : out std_logic);
end parity_checker;
architecture vcgandhi of parity_checker is
begin
p <= (((a0 xor a1) xor a2) xor a3);
end vcgandhi;
波形
VHDLコード– 4ビットパリティジェネレーター
library ieee;
use ieee.std_logic_1164.all;
entity paritygen is
port (a0, a1, a2, a3: in std_logic; p_odd, p_even: out std_logic);
end paritygen;
architecture vcgandhi of paritygen is
begin
process (a0, a1, a2, a3)
if (a0 ='0' and a1 ='0' and a2 ='0' and a3 =’0’)
then odd_out <= "0";
even_out <= "0";
else
p_odd <= (((a0 xor a1) xor a2) xor a3);
p_even <= not(((a0 xor a1) xor a2) xor a3);
end vcgandhi
波形
順序回路のVHDLプログラミング
この章では、順序回路のVHDLプログラミングの方法について説明します。
SRラッチのVHDLコード
library ieee;
use ieee.std_logic_1164.all;
entity srl is
port(r,s:in bit; q,qbar:buffer bit);
end srl;
architecture virat of srl is
signal s1,r1:bit;
begin
q<= s nand qbar;
qbar<= r nand q;
end virat;
波形
DラッチのVHDLコード
library ieee;
use ieee.std_logic_1164.all;
entity Dl is
port(d:in bit; q,qbar:buffer bit);
end Dl;
architecture virat of Dl is
signal s1,r1:bit;
begin
q<= d nand qbar;
qbar<= d nand q;
end virat;
波形
SRフリップフロップのVHDLコード
library ieee;
use ieee.std_logic_1164.all;
entity srflip is
port(r,s,clk:in bit; q,qbar:buffer bit);
end srflip;
architecture virat of srflip is
signal s1,r1:bit;
begin
s1<=s nand clk;
r1<=r nand clk;
q<= s1 nand qbar;
qbar<= r1 nand q;
end virat;
波形
JKフリップフロップのVHDLコード
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity jk is
port(
j : in STD_LOGIC;
k : in STD_LOGIC;
clk : in STD_LOGIC;
reset : in STD_LOGIC;
q : out STD_LOGIC;
qb : out STD_LOGIC
);
end jk;
architecture virat of jk is
begin
jkff : process (j,k,clk,reset) is
variable m : std_logic := '0';
begin
if (reset = '1') then
m : = '0';
elsif (rising_edge (clk)) then
if (j/= k) then
m : = j;
elsif (j = '1' and k = '1') then
m : = not m;
end if;
end if;
q <= m;
qb <= not m;
end process jkff;
end virat;
波形
DフリップフロップのVHDLコード
Library ieee;
use ieee.std_logic_1164.all;
entity dflip is
port(d,clk:in bit; q,qbar:buffer bit);
end dflip;
architecture virat of dflip is
signal d1,d2:bit;
begin
d1<=d nand clk;
d2<=(not d) nand clk;
q<= d1 nand qbar;
qbar<= d2 nand q;
end virat;
波形
TフリップフロップのVHDLコード
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity Toggle_flip_flop is
port(
t : in STD_LOGIC;
clk : in STD_LOGIC;
reset : in STD_LOGIC;
dout : out STD_LOGIC
);
end Toggle_flip_flop;
architecture virat of Toggle_flip_flop is
begin
tff : process (t,clk,reset) is
variable m : std_logic : = '0';
begin
if (reset = '1') then
m : = '0';
elsif (rising_edge (clk)) then
if (t = '1') then
m : = not m;
end if;
end if;
dout < = m;
end process tff;
end virat;
波形
4ビットアップカウンターのVHDLコード
library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter is
port(Clock, CLR : in std_logic;
Q : out std_logic_vector(3 downto 0)
);
end counter;
architecture virat of counter is
signal tmp: std_logic_vector(3 downto 0);
begin
process (Clock, CLR)
begin
if (CLR = '1') then
tmp < = "0000";
elsif (Clock'event and Clock = '1') then
mp <= tmp + 1;
end if;
end process;
Q <= tmp;
end virat;
波形
4ビットダウンカウンターのVHDLコード
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity dcounter is
port(Clock, CLR : in std_logic;
Q : out std_logic_vector(3 downto 0));
end dcounter;
architecture virat of dcounter is
signal tmp: std_logic_vector(3 downto 0);
begin
process (Clock, CLR)
begin
if (CLR = '1') then
tmp <= "1111";
elsif (Clock'event and Clock = '1') then
tmp <= tmp - 1;
end if;
end process;
Q <= tmp;
end virat;
波形
VLSIデザイン-Verilogの概要
Verilogは、ハードウェア記述言語(HDL)です。 ネットワークスイッチやマイクロプロセッサ、メモリ、フリップフロップなどのデジタルシステムを記述するために使用される言語です。 つまり、HDLを使用することで、あらゆるレベルのあらゆるデジタルハードウェアを記述することができます。 HDLで記述された設計は、テクノロジーに依存せず、設計とデバッグが非常に簡単で、通常、特に大規模な回路では回路図よりも有用です。
Verilogは、多くの抽象化レベルで設計をサポートしています。 主要な3つは-
- 行動レベル
- レジスタ転送レベル
- ゲートレベル
行動レベル
このレベルは、並行アルゴリズム(動作)によってシステムを記述します。 すべてのアルゴリズムはシーケンシャルです。つまり、1つずつ実行される一連の命令で構成されています。 機能、タスク、ブロックが主要な要素です。 設計の構造的な実現には関係ありません。
レジスタ転送レベル
レジスタ転送レベルを使用する設計では、操作を使用する回路の特性とレジスタ間のデータ転送を指定します。 RTLコードの最新の定義は、「合成可能なコードはすべてRTLコードと呼ばれます」です。
ゲートレベル
論理レベル内では、システムの特性は論理リンクとそのタイミングプロパティによって記述されます。 すべての信号は離散信号です。 明確な論理値( 0 '、
1'、 X '、
Z`)のみを持つことができます。 使用可能な操作は、定義済みのロジックプリミティブ(基本ゲート)です。 ゲートレベルのモデリングは、論理設計の正しい考えではない場合があります。 ゲートレベルコードは、合成ツールなどのツールを使用して生成され、彼のネットリストはゲートレベルシミュレーションとバックエンドに使用されます。
字句トークン
Verilog言語のソーステキストファイルは、字句トークンのストリームです。 トークンは1つ以上の文字で構成され、各単一文字は1つのトークンにのみ含まれます。
Verilog HDLで使用される基本的な字句トークンは、Cプログラミング言語のものと似ています。 Verilogでは大文字と小文字が区別されます。 すべてのキーワードは小文字です。
ホワイトスペース
空白には、スペース、タブ、改行、フォームフィードの文字を含めることができます。 これらの文字は、トークンの分離に使用される場合を除いて無視されます。
空白文字は、空白、タブ、キャリッジリターン、改行、フォームフィードです。
コメント
コメントを表す2つの形式があります
- 1)単一行コメントは、トークン//で始まり、キャリッジリターンで終わります。
例://これは単一行の構文です
*2)複数行コメントはトークン/* で始まり、トークン */で終わります
例:/* これは複数行の構文です*/
番号
2進数、8進数、10進数、または16進数の形式で数値を指定できます。 負の数は2の補数で表されます。 Verilogでは、整数、実数、符号付きおよび符号なしの数値を使用できます。
構文は次のように指定されます-<サイズ> <基数> <値>
サイズまたはサイズなしの数値は<Size>で定義でき、<radix>は2進数、8進数、16進数、10進数のいずれかを定義します。
識別子
識別子は、関数、モジュール、レジスタなど、オブジェクトの定義に使用される名前です。 識別子は、アルファベット文字またはアンダースコア文字で始まる必要があります。 Ex. A_Z、a_z、_
識別子は、アルファベット、数字、アンダースコア、および$文字の組み合わせです。 長さは最大1024文字です。
オペレータ
演算子は、条件を設定したり、変数を操作したりするために使用される特殊文字です。 変数に対して操作を実行するために使用される1つ、2つ、時には3つの文字があります。
Ex. >、&plus;、〜、&! =.
Verilogキーワード
Verilogで特別な意味を持つ単語は、Verilogキーワードと呼ばれます。 たとえば、assign、case、while、wire、reg、and、or、nand、およびmodule。 識別子として使用しないでください。 Verilogキーワードには、コンパイラディレクティブ、システムタスクおよび関数も含まれます。
ゲートレベルモデリング
Verilogには、論理ゲート、伝送ゲート、スイッチなどのプリミティブが組み込まれています。 これらは設計作業にはほとんど使用されませんが、合成後の世界ではASIC/FPGAセルのモデリングに使用されます。
ゲートレベルモデリングには2つの特性があります-
ドライブ強度-出力ゲートの強度は、ドライブ強度によって定義されます。 ソースに直接接続されている場合、出力は最も強くなります。 接続が導電性トランジスタを介している場合、および少なくともプルアップ/ダウン抵抗を介して接続されている場合、強度は低下します。 通常、ドライブ強度は指定されません。この場合、デフォルトの強度はstrong1とstrong0です。
遅延-遅延が指定されていない場合、ゲートには伝播遅延がありません。 2つの遅延が指定されている場合、最初の遅延は立ち上がり遅延を表し、2番目の遅延は立ち下がり遅延を表します。 1つの遅延のみが指定されている場合、立ち上がりと立ち下がりの両方が等しくなります。 合成では遅延を無視できます。
ゲートプリミティブ
Verilogでは、1つの出力と多くの入力を使用する基本的な論理ゲートが使用されます。 GATEは、N個の入力と1個の出力に対してVerilogで使用するために、and、nand、or、nor、xor、xnorのいずれかのキーワードを使用します。
Example:
Module gate()
Wire ot0;
Wire ot1;
Wire ot2;
Reg in0,in1,in2,in3;
Not U1(ot0,in0);
Xor U2(ot1,in1,in2,in3);
And U3(ot2, in2,in3,in0)
トランスミッションゲートプリミティブ
トランスミッションゲートプリミティブには、バッファとインバータの両方が含まれます。 単一の入力と1つ以上の出力があります。 以下に示すゲートのインスタンス化構文では、GATEはキーワードbufまたはNOT gateを表します。
例:Not、buf、bufif0、bufif1、notif0、notif1
ない-n outoutインバーター
Buf – n出力バッファ
Bufifo –トライステートバッファー、アクティブローイネーブル
Bufif1 –トライステートバッファー、アクティブHighイネーブル
Notifo –トライステートインバーター、アクティブローイネーブル
Notif1 –トライステートインバーター、アクティブHighイネーブル
Example:
Module gate()
Wire out0;
Wire out1;
Reg in0,in1;
Not U1(out0,in0);
Buf U2(out0,in0);
データ型
値セット
Verilogは、主に4つの基本的な値で構成されています。 Verilogで使用されるすべてのVerilogデータタイプは、これらの値を保存します-
0(論理ゼロ、または偽条件)
1(論理1、または真の条件)
x(不明な論理値)
z(高インピーダンス状態)
xおよびzの使用は、合成では非常に制限されています。
Wire
ワイヤは、回路内の物理的なワイヤを表すために使用され、ゲートまたはモジュールの接続に使用されます。 ワイヤの値は読み取りのみが可能で、関数またはブロックでは割り当てられません。 ワイヤは値を保存できませんが、常に連続的な割り当てステートメントによって、またはワイヤをゲート/モジュールの出力に接続することによって駆動されます。 ワイヤの他の特定のタイプは-
ワンド(ワイヤードAND)-ここでワンドの値は、それに接続されているすべてのデバイスドライバーの論理ANDに依存します。
- Wor(ワイヤードOR)*-ここで、Worの値は、それに接続されているすべてのデバイスドライバーの論理ORに依存しています。
- Tri(トライステート)*-ここでは、triに接続されるすべてのドライバーはzでなければなりません。ただし、1つのみ(triの値を決定します)を除きます。
Example:
Wire [msb:lsb] wire_variable_list;
Wirec//simple wire
Wand d;
Assign d = a;//value of d is the logical AND of
Assign d = b;//a and b
Wire [9:0] A;//a cable (vector) of 10 wires.
Wand [msb:lsb] wand_variable_list;
Wor [msb:lsb] wor_variable_list;
Tri [msb:lsb] tri_variable_list;
登録
reg(レジスタ)はデータオブジェクトであり、1つの手続き型割り当てから次の割り当てへの値を保持しており、異なる関数と手続き型ブロックでのみ使用されます。 regは単純なVerilogの可変タイプのレジスタであり、物理的なレジスタを意味することはできません。 マルチビットレジスタでは、データは符号なし数値の形式で格納され、符号拡張は使用されません。
例-
reg c;//単一の1ビットレジスタ変数
reg [5:0] gem;//6ビットのベクトル。
reg [6:0] d、e;//2つの7ビット変数
入力、出力、入力
これらのキーワードは、タスクまたはモジュールの入力、出力、および双方向ポートを宣言するために使用されます。 ここでは、入力ポートと入出力ポートはワイヤータイプで、出力ポートはワイヤー、reg、wand、wor、またはtriタイプに構成されています。 常に、デフォルトはワイヤタイプです。
例
Module sample(a, c, b, d);
Input c; //An input where wire is used.
Output a, b; //Two outputs where wire is used.
Output [2:0] d; /*A three-bit output. One must declare type in a separate statement.*/
reg [1:0] a; //The above ‘a’ port is for declaration in reg.
整数
整数は、汎用変数で使用されます。 これらは主にループで使用されます-インデックス、定数、およびパラメーター。 それらは「reg」タイプのデータタイプです。 明示的に宣言されたreg型は符号なしのデータとして格納するのに対し、それらは符号付きの数値としてデータを格納します。 コンパイル時に整数が定義されていない場合、デフォルトのサイズは32ビットになります。
整数が定数を保持している場合、シンセサイザーはコンパイル時に必要な最小幅に調整します。
例
Integer c; //single 32-bit integer
Assign a = 63; //63 defaults to a 7-bit variable.
Supply0、Supply1
Supply0はロジック0(グランド)に接続されたワイヤを定義し、supply1はロジック1(電源)に接続されたワイヤを定義します。
例
supply0 logic_0_wires;
supply0 gnd1; //equivalent to a wire assigned as 0
supply1 logic_1_wires;
supply1 c, s;
Time
時間は、シミュレーション時間を保持するために$ timeシステムタスクと組み合わせて使用できる64ビットの量です。 時間は合成ではサポートされていないため、シミュレーション目的でのみ使用されます。
例
time time_variable_list;
time c;
c = $time; //c = current simulation time
パラメータ
パラメーターは、モジュールを使用するときに設定できる定数を定義しています。これにより、インスタンス化プロセス中にモジュールをカスタマイズできます。
Example
Parameter add = 3’b010, sub = 2’b11;
Parameter n = 3;
Parameter [2:0] param2 = 3’b110;
reg [n-1:0] jam;/*A 3-bit register with length of n or above.*/
always @(z)
y = {{(add - sub){z}};
if (z)
begin
state = param2[1];
else
state = param2[2];
end
オペレータ
算術演算子
これらの演算子は算術演算を実行します。 &plus;および-は、単項(x)または二項(z-y)演算子として使用されます。
算術演算に含まれる演算子は-
&プラス; (加算)、-(減算)、*(乗算)、/(除算)、%(モジュラス)
例-
parameter v = 5;
reg[3:0] b, d, h, i, count;
h = b + d;
i = d - v;
cnt = (cnt +1)%16;//Can count 0 thru 15.
関係演算子
これらの演算子は、2つのオペランドを比較し、結果を1ビットまたは1ビットで返します。
wireおよびreg変数は正です。 したがって、(-3’d001)= = 3’d111および(−3b001)> 3b110。
関係演算に含まれる演算子は-
- ==(等しい)
- !=(等しくない)
- >(より大きい)
- > =(以上)
- <(より小さい)
- ⇐(以下)
例
if (z = = y) c = 1;
else c = 0;//Compare in 2’s compliment; d>b
reg [3:0] d,b;
if (d[3]= = b[3]) d[2:0] > b[2:0];
else b[3];
Equivalent Statement
e = (z == y);
ビット単位の演算子
2つのオペランド間でビットごとの比較を行うビット単位の演算子。
ビットごとの操作に含まれる演算子は-
- * | (ビットごとのOR) * 〜(ビットごとのNOT) * ^(ビットごとのXOR) * 〜または〜(ビットごとのXNOR)
例
module and2 (d, b, c);
input [1:0] d, b;
output [1:0] c;
assign c = d & b;
end module
論理演算子
論理演算子はビット単位の演算子であり、単一ビットのオペランドにのみ使用されます。 0または1の単一ビット値を返します。 整数またはビットのグループ、式で機能し、すべての非ゼロ値を1として処理できます。 一般に、論理演算子は式で機能するため、条件ステートメントで使用されます。
論理演算に含まれる演算子は-
- ! (論理否定)
- &&(論理AND)
- || (論理OR)
例
wire[7:0] a, b, c;//a, b and c are multibit variables.
reg x;
if ((a == b) && (c)) x = 1;//x = 1 if a equals b, and c is nonzero.
else x = !a;//x =0 if a is anything but zero.
削減演算子
縮約演算子は、ビットごとの演算子の単項形式であり、オペランドベクトルのすべてのビットに対して作用します。 これらも単一ビット値を返します。
削減操作に含まれる演算子は-
- &(削減AND)
- | (削減OR)
- 〜&(NANDの削減)
- 〜| (縮小NOR)
- ^(縮小XOR)
- 〜または〜(縮小XNOR)
例
Module chk_zero (x, z);
Input [2:0] x;
Output z;
Assign z = & x;//Reduction AND
End module
シフト演算子
シフト演算子。構文の第2オペランドで指定されたビット数だけ第1オペランドをシフトします。 空いている位置は、両方向、左シフトおよび右シフトのゼロで埋められます(使用記号の拡張はありません)。
シフト操作に含まれている演算子は-
- <<(左にシフト)
- >>(右シフト)
例
Assign z = c << 3;/* z = c shifted left 3 bits;
空席は0で埋められます*/
連結演算子
連結演算子は、2つ以上のオペランドを組み合わせて、より大きなベクトルを形成します。
連結操作に含まれる演算子は-\ {}(連結)です
例
wire [1:0] a, h; wire [2:0] x; wire [3;0] y, Z;
assign x = {1’b0, a};//x[2] = 0, x[1] = a[1], x[0] = a[0]
assign b = {a, h};/*b[3] = a[1], b[2] = a[0], b[1] = h[1],
b[0] = h[0]*/
assign {cout, b} = x + Z;//Concatenation of a result
レプリケーション演算子
複製演算子は、アイテムの複数のコピーを作成しています。
レプリケーション操作で使用される演算子は-\ {n \ {item}}(アイテムのn倍のレプリケーション)
例
Wire [1:0] a, f; wire [4:0] x;
Assign x = {2{1’f0}, a};//Equivalent to x = {0,0,a }
Assign y = {2{a}, 3{f}};//Equivalent to y = {a,a,f,f}
For synthesis, Synopsis did not like a zero replication.
For example:-
Parameter l = 5, k = 5;
Assign x = {(l-k){a}}
条件演算子
条件演算子はマルチプレクサに合成します。 C/C ++で使用されているのと同じ種類で、条件に基づいて2つの式のいずれかを評価します。
条件付き操作で使用される演算子は-
(調子) ? (条件が真の場合の結果)-
(条件が偽の場合の結果)
例
Assign x = (g) ? a : b;
Assign x = (inc = = 2) ? x+1 : x-1;
/*if (inc), x = x+1, else x = x-1*/
オペランド
リテラル
リテラルは、Verilog式で使用される定数値のオペランドです。 2つの一般的に使用されるVerilogリテラルは次のとおりです-
- String -文字列リテラルオペランドは、二重引用符( "")で囲まれた文字の1次元配列です。
- 数値-定数オペランドは、2進数、8進数、10進数、または16進数で指定されます。
例
n-ビット数を表す整数
F-4つの可能な基本形式の1つ-
bは2進数、oは8進数、dは10進数、hは16進数です。
“time is” //string literal
267 //32-bit decimal number
2’b01 //2-bit binary
20’hB36F //20-bit hexadecimal number
‘062 //32-bit octal number
ワイヤー、Regs、およびパラメーター
ワイヤ、reg、およびパラメータは、Verilog式のオペランドとして使用されるデータ型です。
ビット選択「x [2]」およびパーツ選択「x [4:2]」
ビット選択とパート選択は、角括弧「[]」を使用して、ワイヤ、reg、またはパラメータベクトルからそれぞれ1ビットと複数ビットを選択するために使用されます。 ビット選択と部分選択は、メインデータオブジェクトが使用されるのと同じ方法で、式のオペランドとしても使用されます。
例
reg [7:0] x, y;
reg [3:0] z;
reg a;
a = x[7] & y[7]; //bit-selects
z = x[7:4] + y[3:0]; //part-selects
関数呼び出し
関数呼び出しでは、関数の戻り値は、最初にレジスタまたはワイヤに割り当てる必要なく、式で直接使用されます。 オペランドのタイプの1つとして関数呼び出しを配置するだけです。関数呼び出しの戻り値のビット幅を知っていることを確認する必要があります。
Example
Assign x = y & z & chk_yz(z, y);//chk_yz is a function
. . ./*Definition of the function*/
Function chk_yz;//function definition
Input z,y;
chk_yz = y^z;
End function
モジュール
モジュール宣言
Verilogでは、モジュールは主要な設計エンティティです。 これは、名前とポートリスト(引数)を示します。 各ポートの入出力タイプ(入力、出力、または入出力)と幅を指定する次の数行。 デフォルトのポート幅は1ビットのみです。 ポート変数は、wire、wand、で宣言する必要があります。 。 。、reg。 デフォルトのポート変数はwireです。 通常、入力はモジュール外でラッチされるため、入力は有線です。 信号が内部に保存されている場合、出力はregタイプです。
例
module sub_add(add, in1, in2, out);
input add;//defaults to wire
input [7:0] in1, in2; wire in1, in2;
output [7:0] out; reg out;
... statements ...
End module
継続的な割り当て
モジュールの連続的な割り当ては、値をワイヤに割り当てるために使用されます。これは、常時または初期ブロックの外側で使用される通常の割り当てです。 この割り当ては、明示的なassignステートメントを使用して、または宣言中にワイヤに値を割り当てるために行われます。 連続割り当ては、シミュレーション時に継続的に実行されます。 assign文の順序は影響しません。 右側の入力信号のいずれかを変更すると、左側の出力信号が変更されます。
例
Wire [1:0] x = 2’y01; //assigned on declaration
Assign y = c | d; //using assign statement
Assign d = a & b;
/*the order of the assign statements does not matter.*/
モジュールのインスタンス化
モジュール宣言は、実際のオブジェクトを作成するためのテンプレートです。 モジュールは他のモジュール内でインスタンス化され、各インスタンス化はそのテンプレートから単一のオブジェクトを作成します。 例外は、独自のインスタンス化である最上位モジュールです。 モジュールのポートは、テンプレートで定義されているポートと一致する必要があります。 指定されている-
- *名前*で、ドット「.templateポート名(ポートに接続されているワイヤの名前)」を使用します。 Or
- *位置*により、テンプレートとインスタンスの両方のポートリストの同じ場所にポートを配置します。
例
MODULE DEFINITION
Module and4 (x, y, z);
Input [3:0] x, y;
Output [3:0] z;
Assign z = x | y;
End module
Verilogの動作モデリングとタイミング
Verilogのビヘイビアモデルには、シミュレーションを制御し、データ型の変数を操作する手続き型ステートメントが含まれています。 これらのすべてのステートメントは、プロシージャ内に含まれています。 各プロシージャには、アクティビティフローが関連付けられています。
動作モデルのシミュレーション中、「always」および「initial」ステートメントで定義されたすべてのフローは、シミュレーション時間「ゼロ」で一緒に開始されます。 初期ステートメントは1回実行され、alwaysステートメントは繰り返し実行されます。 このモデルでは、レジスタ変数aおよびbは、シミュレーション時間「ゼロ」でそれぞれバイナリ1および0に初期化されます。 その後、初期ステートメントは完了し、そのシミュレーション実行中に再度実行されることはありません。 この初期ステートメントには、ステートメントの開始終了ブロック(順次ブロックとも呼ばれます)が含まれています。 このbegin-end型ブロックでは、aが最初に初期化され、次にbが初期化されます。
行動モデリングの例
module behave;
reg [1:0]a,b;
initial
begin
a = ’b1;
b = ’b0;
end
always
begin
#50 a = ~a;
end
always
begin
#100 b = ~b;
end
End module
手続き割り当て
プロシージャの割り当ては、reg、integer、time、およびmemory変数を更新するためのものです。 以下に説明するように、手続き型の割り当てと連続的な割り当てには大きな違いがあります-
連続代入はネット変数を駆動し、入力オペランドが値を変更するたびに評価および更新されます。
手続き型の割り当ては、それらを囲む手続き型フロー構造の制御下でレジスタ変数の値を更新します。
手続き型割り当ての右側には、値を評価する任意の式を使用できます。 ただし、右側の部分選択には定数インデックスが必要です。 左側は、右側から割り当てを受け取る変数を示します。 手続き型の割り当ての左側は、次のいずれかの形式を取ることができます-
- レジスタ、整数、実数、または時間変数-これらのデータ型のいずれかの名前参照への割り当て。
- レジスタ、整数、実数、または時間変数のビット選択-他のビットに手を加えない単一ビットへの割り当て。
- レジスタ、整数、実数、または時間変数の部分選択-残りのビットをそのままにしておく、2つ以上の連続したビットの部分選択。 一部選択フォームの場合、定数式のみが有効です。
- メモリ要素-メモリの単一ワード。 メモリ要素参照では、ビット選択と部分選択は無効であることに注意してください。
- 上記のいずれかの連結-前の4つの形式のいずれかの連結を指定できます。これにより、右辺式の結果が事実上分割され、連結のさまざまな部分に順番にパーティション部分が割り当てられます。
割り当ての遅延(合成ではない)
遅延割り当てでは、ステートメントが実行されて左側の割り当てが行われる前に、Δt時間単位が経過します。 割り当て内遅延では、右側がすぐに評価されますが、結果が左側の割り当てに配置される前にΔtの遅延があります。 別の手順がΔt中に右側の信号を変更しても、出力には影響しません。 遅延は合成ツールではサポートされていません。
構文
- 手続き割り当て変数=式
- 遅延割り当て#Δtvariable = expression;
- 割り当て内遅延変数=#Δt式;
例
reg [6:0] sum; reg h, ziltch;
sum[7] = b[7] ^ c[7];//execute now.
ziltch = #15 ckz&h;/*ckz&a evaluated now; ziltch changed
after 15 time units.*/
#10 hat = b&c;/*10 units after ziltch changes, b&c is
evaluated and hat changes.*/
割り当てのブロック
ブロッキングプロシージャの割り当てステートメントは、シーケンシャルブロックで後続のステートメントを実行する前に実行する必要があります。 手続き型の割り当てステートメントをブロックしても、並列ブロックでそれに続くステートメントの実行は妨げられません。
構文
ブロック手順の割り当ての構文は次のとおりです-
<lvalue> = <timing_control> <expression>
ここで、lvalueは手続き型割り当てステートメントに有効なデータ型、=は割り当て演算子、タイミング制御はオプションの割り当て内遅延です。 タイミング制御遅延は、遅延制御(#6など)またはイベント制御(@(posedge clk)など)のいずれかです。 この式は、シミュレータが左側に割り当てる右側の値です。 手続き型割り当てのブロックで使用される=代入演算子は、手続き型連続割り当ておよび連続割り当てでも使用されます。
例
rega = 0;
rega[3] = 1; //a bit-select
rega[3:5] = 7; //a part-select
mema[address] = 8’hff; //assignment to a memory element
{carry, acc} = rega + regb; //a concatenation
ノンブロッキング(RTL)割り当て
ノンブロッキングプロシージャ割り当てにより、プロシージャフローをブロックせずに割り当てをスケジュールできます。 順序や依存関係に関係なく、同じタイムステップ内で複数のレジスタ割り当てを行いたい場合はいつでも、ノンブロッキングプロシージャステートメントを使用できます。
構文
ノンブロッキング手続き型割り当ての構文は次のとおりです-
<lvalue> <= <timing_control> <expression>
ここで、左辺値は手続き型割り当てステートメントに有効なデータ型であり、⇐は非ブロッキング割り当て演算子であり、タイミング制御はオプションの割り当て内タイミング制御です。 タイミング制御遅延は、遅延制御またはイベント制御(@(posedge clk)など)のいずれかです。 この式は、シミュレータが左側に割り当てる右側の値です。 ノンブロッキング割り当て演算子は、シミュレータが同等以下の関係演算子に使用する演算子と同じです。 シミュレーターは、式で使用する場合は⇐演算子を関係演算子として解釈し、非ブロッキングの手続き型割り当て構造で使用する場合は⇐演算子を割り当て演算子として解釈します。
シミュレータが非ブロックプロシージャ割り当てを評価する方法シミュレータが非ブロックプロシージャ割り当てを検出すると、シミュレータは次の2つのステップで非ブロックプロシージャ割り当てを評価および実行します-
- シミュレーターは右側を評価し、新しい値の割り当てが手続き型タイミング制御で指定された時間に行われるようにスケジュールします。 シミュレーターは右側を評価し、新しい値の割り当てが手続き型タイミング制御で指定された時間に行われるようにスケジュールします。
- 与えられた遅延が終了するか、適切なイベントが発生したタイムステップの終わりに、シミュレーターは左側に値を割り当てることにより割り当てを実行します。
例
module evaluates2(out);
output out;
reg a, b, c;
initial
begin
a = 0;
b = 1;
c = 0;
end
always c = #5 ~c;
always @(posedge c)
begin
a <= b;
b <= a;
end
endmodule
条件
条件付きステートメント(またはif-elseステートメント)は、ステートメントが実行されるかどうかを決定するために使用されます。
正式には、構文は次のとおりです-
<statement>
::= if ( <expression> ) <statement_or_null>
||= if ( <expression> ) <statement_or_null>
else <statement_or_null>
<statement_or_null>
::= <statement>
||= ;
<式>が評価されます。 trueの場合(つまり、ゼロ以外の既知の値を持つ場合)、最初のステートメントが実行されます。 false(値がゼロ、または値がxまたはz)の場合、最初のステートメントは実行されません。 elseステートメントがあり、<expression>がfalseの場合、elseステートメントが実行されます。 if式の数値はゼロであることがテストされているため、特定のショートカットが可能です。
たとえば、次の2つのステートメントは同じロジックを表します-
if (expression)
if (expression != 0)
if-elseのelse部分はオプションであるため、ネストされたifシーケンスからelseが省略されると混乱する可能性があります。 これは、elseが欠けている場合、elseを常に最も近い前のものに関連付けることで解決されます。
例
if (index > 0)
if (rega > regb)
result = rega;
else//else applies to preceding if
result = regb;
If that association is not what you want, use a begin-end block statement
to force the proper association
if (index > 0)
begin
if (rega > regb)
result = rega;
end
else
result = regb;
構成:if- else- if
次の構成は頻繁に発生するため、簡単に個別に説明する価値があります。
例
if (<expression>)
<statement>
else if (<expression>)
<statement>
else if (<expression>)
<statement>
else
<statement>
このifのシーケンス(if-else-ifコンストラクトとして知られています)は、多元的な決定を記述する最も一般的な方法です。 式は順番に評価されます。いずれかの式が真の場合、それに関連するステートメントが実行され、これによりチェーン全体が終了します。 各ステートメントは、単一のステートメントまたはステートメントのブロックのいずれかです。
if-else-if構造の最後のelse部分は、「上記のどれでもない」、または他の条件のいずれも満たされていないデフォルトのケースを処理します。 デフォルトの明示的なアクションがない場合があります。その場合、末尾のelseを省略するか、エラーチェックに使用して不可能な状態をキャッチできます。
ケースステートメント
caseステートメントは、式が他の多くの式の1つと一致するかどうかをテストし、それに応じて分岐する特別な多方向決定ステートメントです。 caseステートメントは、たとえば、マイクロプロセッサー命令のデコードを記述するのに役立ちます。 ケース文には次の構文があります-
例
<statement>
::= case ( <expression> ) <case_item>+ endcase
||= casez ( <expression> ) <case_item>+ endcase
||= casex ( <expression> ) <case_item>+ endcase
<case_item>
::= <expression> <,<expression>>* : <statement_or_null>
||= default : <statement_or_null>
||= default <statement_or_null>
ケース式は、指定された正確な順序で評価および比較されます。 線形検索中に、ケースアイテムの式のいずれかが括弧内の式と一致する場合、そのケースアイテムに関連付けられたステートメントが実行されます。 すべての比較が失敗し、デフォルトの項目が指定されている場合、デフォルトの項目ステートメントが実行されます。 デフォルトのステートメントが指定されておらず、すべての比較が失敗した場合、case itemステートメントは実行されません。
構文とは別に、caseステートメントは、2つの重要な点でmulti-way if-else-ifコンストラクトとは異なります-
- if-else-ifコンストラクトの条件式は、caseステートメントのように、1つの式を他の複数の式と比較するよりも一般的です。
- 式にx値とz値がある場合、caseステートメントは最終的な結果を提供します。
ループ文
ループステートメントには4つのタイプがあります。 それらは、ステートメントの実行を0回、1回、または複数回制御する手段を提供します。
- 文を永久に継続的に実行します。
- repeatは、ステートメントを一定回数実行します。
- whileは、式が偽になるまでステートメントを実行します。 式がfalseで始まる場合、ステートメントはまったく実行されません。
- 次のように、3ステップのプロセスによる関連するステートメントの実行を制御します-
- 実行されるループの数を制御する変数を初期化するために通常使用される割り当てを実行します
- 式を評価します。結果がゼロの場合、forループは終了し、ゼロでない場合、forループは関連するステートメントを実行してからステップ3を実行します
- loopcontrol変数の値を変更するために通常使用される割り当てを実行し、ステップ2を繰り返します
以下は、ループ文の構文規則です-
例
<statement>
::= forever <statement>
||=forever
begin
<statement>+
end
<Statement>
::= repeat ( <expression> ) <statement>
||=repeat ( <expression> )
begin
<statement>+
end
<statement>
::= while ( <expression> ) <statement>
||=while ( <expression> )
begin
<statement>+
end
<statement>
::= for ( <assignment> ; <expression> ; <assignment> )
<statement>
||=for ( <assignment> ; <expression> ; <assignment> )
begin
<statement>+
end
遅延制御
遅延制御
手続き文の実行は、次の構文を使用して遅延制御することができます-
<statement>
::= <delay_control> <statement_or_null>
<delay_control>
::= # <NUMBER>
||= # <identifier>
||= # ( <mintypmax_expression> )
次の例では、割り当ての実行を10時間単位遅らせます-
#10レガ= regb;
次の3つの例では、番号記号(#)に続く式を示します。 割り当ての実行は、式の値で指定されたシミュレーション時間の分だけ遅延します。
イベント制御
手続き文の実行は、次のイベント制御構文を使用して、ネットまたはレジスタの値の変更、または宣言されたイベントの発生と同期することができます-
例
<statement>
::= <event_control> <statement_or_null>
<event_control>
::= @ <identifier>
||= @ ( <event_expression> )
<event_expression>
::= <expression>
||= posedge <SCALAR_EVENT_EXPRESSION>
||= negedge <SCALAR_EVENT_EXPRESSION>
||= <event_expression> <or <event_expression>>
- <SCALAR_EVENT_EXPRESSION>は、1ビット値に解決される式です。
ネットおよびレジスタの値の変更は、ステートメントの実行をトリガーするイベントとして使用できます。 これは、暗黙的なイベントの検出として知られています。 Verilog構文では、変更の方向に基づいて変更を検出することもできます。つまり、値1(posedge)または値0(negedge)に向かって変更を検出できます。 未知の式の値に対するposedgeとnegedgeの動作は次のとおりです-
- 1から不明、および不明から0への遷移でネガエッジが検出されます
- 0から不明、および不明から1への遷移でポーズが検出されます
手順:常にブロックと初期ブロック
Verilogのすべての手順は、次の4つのブロックのいずれかで指定されます。 1)初期ブロック2)常にブロック3)タスク4)機能
初期ステートメントおよびalwaysステートメントは、シミュレーションの開始時に有効になります。 初期ブロックは1回だけ実行され、そのアクティビティはステートメントが終了すると終了します。 対照的に、常にブロックは繰り返し実行されます。 そのアクティビティは、シミュレーションが終了したときにのみ終了します。 モジュールで定義できる初期ブロックと常にブロックの数に制限はありません。 タスクと機能は、他の手順の1つ以上の場所から有効にされる手順です。
初期ブロック
最初のステートメントの構文は次のとおりです-
<initial_statement>
::= initial <statement>
次の例は、シミュレーションの開始時に変数を初期化するための初期ステートメントの使用を示しています。
Initial
Begin
Areg = 0;//initialize a register
For (index = 0; index < size; index = index + 1)
Memory [index] = 0;//initialize a memory
Word
End
初期ブロックのもう1つの一般的な使用法は、シミュレートされる回路の主要部分に刺激を与えるために1回実行される波形記述の指定です。
Initial
Begin
Inputs = ’b000000;
//initialize at time zero
#10 inputs = ’b011001;//first pattern
#10 inputs = ’b011011;//second pattern
#10 inputs = ’b011000;//third pattern
#10 inputs = ’b001000;//last pattern
End
常にブロック
「always」ステートメントは、シミュレーション実行全体を通して継続的に繰り返されます。 alwaysステートメントの構文は次のとおりです。
<always_statement>
::= always <statement>
「常に」ステートメントは、ループする性質があるため、何らかのタイミング制御と組み合わせて使用する場合にのみ役立ちます。 「always」ステートメントが進む時間を提供しない場合、「always」ステートメントはシミュレーションのデッドロック状態を作成します。 たとえば、次のコードは、無限のゼロ遅延ループを作成します-
Always areg = ~areg;
上記のコードにタイミング制御を提供すると、次の例のように潜在的に有用な説明が作成されます-
Always #half_period areg = ~areg;