3 まえがき H D L によるロジック回路設計は 1988 年頃から始まり , 現在ではもう当たりまえとい う段階になっています . しかし , これから H D L によるロジック回路設計を始めようとい う方に必要な情報が十分に与えられていないため , ずいぶんまわり道をさせられていると 感じる人も少なくないようです . 現在 , 出版されている H D L に関する書籍は難しい H D L の文法説明に終始しているか , いきなり複雑なシステム・シミュレーションを紹介しているため , H D L によるロジック 設計の入門書としては適切でないものが多いようです . ロジック回路設計者にとっては H D L を覚えることが仕事ではなく , より重要なことは 何を設計するかにあります . H D L はロジック設計の一つの手段にすぎません . 本書では , この H D L という設計手段をできるだけ容易に学べるよう , 具体的なロジッ ク回路の記述を例にとりながら必要な文法を学んでいける構成にしています . H D L として広く普及しているのは , V H D L と Verilog- H D L です . 著者にも , ど ちらで記述したらよいかとよく尋ねられますが , 著者は細かい点で議論の余地はあるもの の基本的にはどちらで記述してもたいして変わらないと考えています . もちろん , 文法的 にはかなりの違いがあります . しかし , H D L にとって一番重要なのは , 記述のスタイル です . 記述スタイルとは , 言でいえば , ロジック回路に直結した問題をどのような形式に記 述するかということです . 記述スタイルは , V H D L でも VeriIog- H D L でも何ら変わ りません . どちらの言語で H D L よるロジック回路設計を習得しても簡単に他の言語に移 行できます . どちらで始めるかは些細な問題と考えます . 本書は , V H D L によるロジック回路設計の入門書です . もちろん , ロジック回路設計 に必要な V H D L の文法については詳しく解説してありますし , V H D L 特有の機能を生 かした記述も数多く紹介してあります . しかし , 一番重要なのはこの記述スタイルです . 本書を読み終えるころには , 自然とこの記述スタイルが身につくように構成したつもりで す . 雑誌などで , よく HDL が次世代の画期的設計手法という内容の記事を見かけます . そ の記事の真意はともかく , HDL だと何でも設計できるという神話を一般の設計者に与え てしまっています . H D L は , 回路図入力による設計から , 回路入力の方法が変わっただ
2.4 case 文の記述 4 / 場合は値の順番がなく , すべてが並列に処理されます . したがって , 1 度 ' whe 心項に記 述した値を , そのあとで再び使用すると文法工ラーになってしまいます . 値が重複しない ように注意してください . また , すべての場合を記述しないと文法工ラーになります . リスト 2.5 の③の "others" は , 残りすべての場合という意味になります . 場合 , "when" 項で "INDATA" のとりうる値のすべてを記述していますが , 略できません . この記述の この行は省 なせかというと , "INDATA" は "std_logic" のべクタ・タイプ "std_logic_vector" な ので , ℃ ' , ' 1 ' の値のほかに 'X', 'Z', 'U' などの値をもっています . これらの値はロジッ ク回路生成のための意味はありませんが , case 文ではこれらすべての場合を記述しなけ ればなりません . ただ , すべての場合を記述することはたいへんなので , この記述のよう に "others" で対応します . ' 1 ' , ℃ ' 以外の値が入力されるということなので出力は不定 'X' ( ' 1 ' , ℃ ' か解からない ) を記述します . 出力値が同しになる条件があるときは , 表 2.3 に示すとおり 1 ' を使用して記述を省略 することができます . また , 同じ出力値が入力値の値で連続して続く場合には咒 0 ' ' が利 用できます . ・ don't care 出力 リスト 2.6 は , ヾイナリ・デシマル・エンコーダの記述例です . ェンコーダは , デコー ダとは逆に NPUT " の 2 進数から 10 進数に変換します . ①の thers " での不定 ' X ' の代入は , リスト 2.5 の代入とは意味合いが異なります . リスト 2.5 では "others" の 前に想定されるすべての入力が記載されているので , ロジック回路生成にはなにも影響を く図 2.2 〉 don't care を使用しない場合に合成される回路 ひ第リ T ー引
5 ◆目次◆ まえがき 本書での記号記述ルール ・・・ 12 第 1 章 V H D L 基本構文 1 . 1 V H D L とは ・ H D L ( ハードウェア記述言語 ) 設計のメリット ・ V H D L の歴史 ・高機能言語 VHD L ・・・ 13 っ 0 っ 0 一 4 、 ~ 0 、 1 1 1 1 1 . 2 工ンティティとアーキテクチャ・ ・複数のアーキテクチャ ・ std ー logic ・アーキテクチャ 1 . 3 論理演算子 1 . 4 構造化記述 ・コンポーネント宣言 ・コンポーネント・インスタンス文 1 1 亠 1 ワワ乙 -4 -4 【 0 つ」ワ」ワ 3
6.1 FIFO の記述 737 二重に定義していることになります . すなわち , ビット長 'K' の "std—logic—vector" を要 素とするワード長 ' W ' のレジスタを定義していることになります . RAM はここで定義し たデータ・タイプ RAMDATA ' ' によって宣言されています . 図 6.3 での六つのプロックのうち , "SELE CT" を除く五つのプロックをプロセス文で 表現することにします . "SE LE CT" はレジスタではなく単なるセレクタなので , "RAM" 配列から , DATAOUT く = RAM(RP) と値を取り出す処理をリスト 6.1 の⑤のように同時処理文一行で記述します . ④では , "WP","RP" が "integer" によって宣言されています . " WP " と " RP ' ' は⑤と⑥ で配列 RAM " のピット位置の指定に使用されています . "std_logic_vector" で宣言され ていると , 直接このピット位置の指定に使用することができないため , データ・タイプ変 換が必要になります . そのため , "integer" でカウンタを作成しています . " WP " カウンタは⑦の部分で記述されています . "WP" は , 書き込み信号 " WR " が入力さ れ , かっ満杯状態でなけれはカウント・アップします . そして WP = W— 1 のとき , すな わちカウンタの値が RAM の上限値になると 0 に戻ります . "RP" カウンタは⑧で記述されています . "RP" は , 読み出し信号 " RD " が入力され , か っ空状態でなけれは・カウント・アップします . "RESET" 信号は , 単にシミュレーションのための初期リセットというわけではなく , 重要な意味をもちます . 前述のように , FIFO では "WP" レジスタと "RP" レジスタのカウ ント値は , 空の状態で RP = WP ー 1 の関係をもたなけれはなりません . この関係を " RE SET " 信号で設定するわけです . ⑦で , まず " WP " レジスタを 0 にセットします . 続いて ⑧で "RP" レジスタを 0 よりも一つ前の値 , W— 1 の値にセットしています . ⑩は FULL フラグの検出です . N ー FULL ' は前述の機能を記述しています . RP= WP で書き込みが行われると満杯状態になり , この状態で読み出しが行われると解消しま す . ⑨は EMPTY フラグの検出になります . "IN_EMPTY" は RP=WP—2 の状態で読み 出しが行われると空状態になり , データの書き込みが行われると解消します . ただし , RP = WP ー 2 の状態は , カウント値 0 をはさむ場合 , うまく表現できません . このため , ⑨では WP = I,WP = 0 のときに対応する記述を追加しています .
7.1 シミュレーションでの ' X ' の伝播 753 リスト 7.3 は , リスト 7.2 を else 項を利用して記述し直したものです . else 項に至る までに "SEL" がとりうるすべての値 , つまりは℃ ' と ' 1 ' が記載されています . そのため , ロジック回路生成の時点で else 項は無視されます . また , もし else 項の前にすべての入 カ条件が記述されていなけれは don ' t care 出力になります . どちらの場合も , RTL シミ ュレーション , ロジック回路生成後のシミュレーションでは ' X ' が伝播します . コラム 6 ' x ' の伝播 双方向バスを使用している場合 , その信号の値は , かならす 1 度は , ハイ ンピーダンス 'Z' になります . このことを考慮して 'Z' のとき , その値をマスクす るように記述したとします . この場合 , 当然 RTL でのシミュレーションでは , 問題ありません . 設計者が図 7. A のように双方向バスからの信号を AND 論理でマスクしたと します . この場合 , 図 7. A の回路が出力されると考えます . しかし , 論理合成 ツールは , 動作スピードや面積を考慮して回路構造を変更していきます . その結 果 , 双方向バスからの入力が分割され , ロジック・ゲートで ' Z ' が ' X ' に変化して伝 播してしまうことがあります . これは , ゲート回路でのシミュレーションで起き る問題で , 実際に生成される回路は正しく動作します . しかしながら , 現状の ASIC 設計ではゲート回路でのシミュレーションで最終検証を行うため , 正しい 動作が保証されない回路とみなされてしまいます . 論理合成ツールは , シミュレ ーションでの ' x ' の伝播を考慮して回路を合成することはできません . 現状では , このような回路は , 手設計に頼る必要があります . くリスト 7. A > 双方向バスの切リ替え 双方向バス 双方向バス
・本書掲載記事の利用についてのご注意ー一本書掲載記事には著作権があり , また工業所有権が確立されている場合があります . したがって , 個人で利用 される場合以外は所有者の承諾が必要です . また , 掲載された回路 , 技術 , プログラムを利用して生したトラブル等に ついては , 小社ならびに著作権者は責任を負いかねますのでご了承ください . ・本書に関するご質問について一一文章 , 数式等の記述上で不明な点について のご質間は , 必ず往復はがきか返信用封筒を同封した封書にてお願いいたし ます . ご質問は著者に回送し直接回答していただきますので , 多少時間がか かります . また , 本書の範囲を超えるご質問には応しられませんので , ご了 承ください .
3.1 第 3 章 同期式カウンタ 59 カウンタの記述とシミュレーション 第 1 章 , 第 2 章で RTL 記述で基本となる文法を紹介してきました . 用してクロックの立ち上がりエッジごとに "COUNTIN" に ' 1 ' を加算するように記述し ウンタは , ⑤のようにフリップフロップを生成させる記述の中に , 加算演算子 " 十を使 リスト 3.1 は , 4 ビットの同期式カウンタ ( バイナリ・カウンタ ) の記述です . 同期式カ が基本になります . レイ・コード・カウンタ ( 5.5 節 ) などの種類がありますが , RTL 記述では同期式カウンタ カウンタには , リプル・カウンタ , 同期式カウンタ , ジョンソン・カウンタ ( 3.3 節 ) , グ ・同期式カウンタの記述方法 3.1 同期式カウンタ はカウンタの回路を実際にシミュレーションする具体例も紹介していきます . RTL 記述したものは , シミュレータによって動作を検証することができます . 本章で の異なるカウンタを , 用途に合わせてその都度記述していくことになります . カウンタの記述もいろいろな場合に備えて万能力ウンタを用意しておくのではなく , 記述 第 3 章ではプロセス文の記述の応用編として , カウンタの記述をいくつか紹介します . 論理に見合う回路をその都度考えて記述していきます . 作って回路上にならべるといったことはしません . 設計者は出力信号の意味を考え , その などの部品の記述例を紹介してきましたが , RTL 記述設計ではこのような小さな部品を までロジック設計でよく登場するマルチプレクサ , デコーダ , 工ンコーダ , コンパレータ は , いままでの記述を組み合わせることで , 実際の回路を設計することができます . これ ロジック回路設計をするための VHDL 言語の知識としてはこれでほは、充分です . あと ます . このように , RTL 記述では算術演算子 " 十 : カウンタを生成させることができます . 通常 , " 十 " を記述した場合は加算器 ( フル・アダー ) , " を使用することにより , 簡単に ' を記述した場合は減算器が生
752 第 7 章 RTL 記述の注意点と高度な文法 います . リスト 7.2 は , ' X ' と ' U ' が入力されたときの条件を記述したものです . 論理合成ツール は条件式に ' x ' や ' U ' が入力されている場合 , その行を無視します . このため , RTL での シミュレーションでもロジック回路生成後のシミュレーションでも ' U ' や ' X ' が伝播するよ うになります . しかし , VHDL シミュレーションでは 'X' や 'U' の他に 'Z' や 'W' なども入力 されるので , これら入力されうるすべての値を考慮して条件式を記述しなければならない のですが , それではとても繁雑な記述になってしまいます . くリスト 7.2 > 入力に ' X ' と ' U ' をつけ加えた記述 RTL 記述とは ? end process ; end i f ; e ー se eIsif(SEL=' U' ) then eIsif(SEL=' X' ) then if(SEL=' 1 ' ) then process(SEL) begin くリスト 7.3 > ” else ”を利用した記述 process(SEL) begin if(SEL=' 1 ' ) then 引 sif ( L ゞ 0 ・ ) then e ー se end i f , end process ; コラム 5 RTL 記述は , レジスタを明確に規定する記述方法です . これに対しビヘーピ ァ記述は , 回路のふるまいをもっと単純に記述する方法です . ビヘービア記述は , RTL 記述と異なり , その指し示す範囲が明確ではありません . RTL 記述を含め てそう呼ばれる場合もありますし , どこまで単純な記述をピヘービアと呼ぶかと いった定義はありません . しかし一般的には , RTL より一つ上の階層の記述方 法といった位置付けで使われています . 最近では , このピヘービア記述からロジック回路を生成しようといった試みが 活発に行われるようになってきており , 実際にビヘーピア記述から RTL 記述を 生成させるツールも販売されるようになりました . まだ , その用途は演算子のス ケジューリングに限られていますが , 大規模なロジック回路設計にしだいに使わ れていくものと思われます .
2.5 for ー 100P 文の記述 2.6 3 ステート・バッフアの記述 2.7 順序回路の記述・ ・フリップフロップを生成させる記述 ・強制リセットの記述 ・・・ 50 ・・・ 52 一 .0 戸 0 戸 0 第 3 章カウンタの記述とシミ ション・ ュレ 3.1 同期式カウンタ・ ・同期式カウンタの記述方法 ・ O U T ポートへの再代入 ・イネープル信号付き 12 進力ウンタ・ 3.2 アップ / ダウン・カウンタ・ 3.3 その他のカウンタ・ ・リプル・カウンタ ( 非同期式カウンタ ) ・・ ・ジョンソン・カウンタ 3.4 シミュレーションの記述 ・プロセス文による記述 ・ wait 文・・ コンフィグレーション文 ・シミュレーション記述の注意点 ・・・ 59 9 ワ 3 ワ 3 ・・・ 64 c..D 8 C.D 、 6 0- 0- ワ 3 4 ・ 4 3.5 60 進力ウンタ・ ・ B C D カウンタ ・ after によるシミュレーション記述・・・・・
754 第 7 章 RTL 記述の注意点と高度な文法 この記述はそれほど繁雑でもないので , リスト 7.2 の記述よりもよいと言えるでしょ う . より確実な記述スタイルにするなら , すべての場合の if 文をこの形式で記述すべき です . しかし , シミュレーションのために ' X ' の伝播を考えて記述するなどということは , RTL で論理を記述するという観点からはすれてしまっています . また , だけ読みづらくなってしまいます . シミュレーションでの ' X ' の伝播の間題はこの他にもあり ( コラム 6 ) , ゲート・レベルでのシミュレーションを行わざるをえません . 現状では , においてゲート・レベルでのシミュレーションを行うようにして下さい . ス 2 フリップフロップ生成の制限 記述自体もそれ どちらにしても このことを念頭 RTL 記述から生成された回路では , レジスタの位置と個数は記述されたままの状態が 保持されます . もちろん , レジスタの生成といってもレジスタのセルを直接記述しなけれ はならないなどということはなく , レジスタを推定させる記述をします . 2.7 節でその方 法を紹介しました . こでは , さらにそのときの禁止事項について紹介しておきます . リスト 7.4 は一つのプロセス文内にレジスタ生成の記述が二つ存在する例です . この ような記述は禁止されています . ーっのプロセス文は一つのレジスタ生成の記述だけにす くリスト 7.4 > ーっのプロセス文に二つのレジスタ生成を記述した例 process(CLK1, CLK2) begin if(CLK1' event and CLKI=' 1 ' )then end i f : i f(CLK2' event and CLK2=' 1 ' ) then end i f , end process ; くリスト 7.5 > if 文のレジスタ記述に end process ; end i f , i f(CLK' event and CLK=' 1 ' ) then process (QK) begin eles 項を記述した例 process beg i n wait until CLK1'event and QKI=' 1 ' wai t unt ⅱ K2 ' event and K2 = ' 1 ' end process ; end i f ・ end i f , i f(CLK' event and CLk=' 1 ' ) then beg i n variable . std 」 ogic; process(CLK) くリスト 7.6 > 変数を信号に代入した例