初めてでも使えるVerilog HDL文法ガイド ―― 記述スタイル編
tag: 半導体 ディジタル・デザイン
技術解説 2009年7月10日
2.4 alwaysによる順序回路
順序回路とは,値を保持するフリップフロップやラッチを含む回路です.alwaysを使って記述します.組み合わせ回路とは記述スタイルが若干異なります.
● ラッチ(レベル・センシティブ)
ラッチはリスト4のように記述します.@*が使われているので,入力GとDのいずれかが変化したとき,begin~end内を実行します.一見組み合わせ回路の記述と同じですが,値を保持するラッチになります.動作を説明します.
内部のif文により,
- G=1 ... DからQへデータが筒抜け
- G=0 ... Dが変化してもQは変化しない
となり,値を保持します.
組み合わせ回路になるかラッチになるかは,じつは紙一重です.組み合わせ回路を記述したつもりでも,値を保持するような記述の場合,論理合成ツールは忠実にラッチを生成してしまいます.
● フリップフロップ(エッジ・センシティブ)
Dフリップフロップの記述例をリスト5に示します.クロックCKの立ち上がりでデータを取り込み,リセットRBが'0'のときリセットします.リスト5(a)は同期リセット付き,リスト5(b)は非同期リセット付きです.
同期リセット付きでは,出力が変化する条件はCKの立ち上がり(positive edge)だけなので,always文のイベント式は(posedge CK)だけです.そしてRBが'0'ならリセットし,'0'でなければD入力の値をQ出力に伝えます.
一方,非同期リセット付きでは,RBの立ち下がり(negative edge)もイベント式に含まれ,CKとは非同期にリセットします.結局,同期か非同期の違いは,イベント式に含むか含まないかの違いだけです.
● 代入記号は2種類ある
値を保持する変数には,=と<=の2種類の代入記号を使うことができます.=は順次処理向き,<=は同時処理に向いた代入記号です.一般に,順序回路の記述では<=,組み合わせ回路の記述やテストベンチでは=を使います.
● カウンタ,シフト・レジスタ
フリップフロップの応用として,カウンタとシフト・レジスタの例を示します.リスト6(a)はロード優先のイネーブル付きカウンタです.ロード信号LDが'1'ならパラレル・ロードし,イネーブル信号ENが'1'ならカウント・アップします.リスト6(b)はイネーブル付きのシリアル-パラレル変換シフト・レジスタです.連接演算を使ってシフト動作を実現しています.