| VHDL | |
|---|---|
| パラダイム | 並行、リアクティブ、データフロー |
| 初登場 | 1980年代 |
| 安定版リリース | IEEE 1076-2019 / 2019年12月23日 ( 2019-12-23 ) |
| タイピングの規律 | 強い |
| ファイル名拡張子 | .vhd |
| Webサイト | IEEE VASG |
| 方言 | |
| VHDL-AMS | |
| 影響を受けた | |
| アダ、[ 1 ]パスカル | |
| |

VHDL(VHSICハードウェア記述言語)は、設計入力、文書化、検証のために、システムレベルから論理ゲートレベルに至るまで、複数の抽象レベルでデジタルシステムの動作と構造をモデル化できるハードウェア記述言語です。この言語は、1980年代に米軍のVHSICプログラム用に開発され、電気電子学会(IEEE)によってIEEE Std 1076として標準化されました。最新バージョンはIEEE Std 1076-2019です。アナログおよびミックスドシグナルシステムをモデル化するために、VHDLをベースにしたIEEE標準化HDLであるVHDL-AMS(正式にはIEEE 1076.1)が開発されました。
VHDLは1983年、米国国防総省の要請により、サプライヤー企業が機器に組み込んでいたASICの動作を文書化するために開発されました。MIL-STD-454N規格[ 2 ]の要件64、セクション4.5.1「VHDLによるASICの文書化」では、「マイクロエレクトロニクスデバイス」の文書化をVHDLで行うことを明確に要求しています。
このドキュメントの情報からASICをシミュレーションできるというアイデアは非常に魅力的だったため、 VHDLファイルを読み込める論理シミュレータが開発されました。次のステップは、VHDLを読み込んで回路の物理的な実装定義を出力する 論理合成ツールの開発でした。
国防総省は、Ada の開発ですでに徹底的にテストされた概念を再度発明することを避けるために、構文をできる限り Ada ベースにすることを要求しているため、VHDL は概念と構文の両方でAda プログラミング言語から大幅に借用しています。
VHDLの初期バージョンは、IEEE標準IEEE 1076-1987 [ 3 ]に基づいて設計され、数値(整数と実数)、論理(ビットとブール値)、文字と時間、および呼び出された配列と呼び出された文字列の配列など、幅広いデータ型が含まれていました。 bitbit_vectorcharacter
しかし、この版では解決されなかった問題が「多値ロジック」でした。これは、信号の駆動力(なし、弱、強)と未知の値も考慮されるものです。この問題を解決するために、 IEEE標準1164が必要となり、9値のロジック型(スカラーstd_logicとそのベクター版)が定義されました。 型信号は親型std_logic_vectorの解決済みサブタイプであるため、バス構造をモデル化するための複数の駆動が可能であり、接続された解決関数によって競合する割り当てを適切に処理できます。 std_Ulogicstd_logic
1993 年に更新されたIEEE 1076では、構文の一貫性が向上し、命名の柔軟性が向上し、タイプが拡張されてISO-8859-1印刷可能文字characterが許可され、演算子が追加されるなどしまし た。xnor
標準の小さな変更 (2000 および 2002) により、保護された型の概念 ( C++のクラスの概念に類似) が追加され、ポート マッピング ルールからいくつかの制限が削除されました。
IEEE規格1164に加えて、言語の機能を拡張するためにいくつかの子規格が導入されました。IEEE規格1076.2では、実数型と複素数型の処理が改善されました。IEEE規格1076.3では、ベクトル演算を容易にするために符号付き型と符号なし型が導入されました。IEEE規格1076.1( VHDL-AMSとして知られる)は、アナログおよびミックスドシグナル回路設計の拡張機能を提供しました。
他の標準規格では、特にVITAL(VHDL Initiative Towards ASIC Libraries)[ 4 ]やマイクロ波回路設計拡張など、VHDLのより広範な使用をサポートしています。
2006年6月、 AccelleraのVHDL技術委員会(標準の次回の更新に取り組むためにIEEEから委任されている)は、VHDL-2006のいわゆるドラフト3.0を承認しました。旧バージョンとの完全な互換性を維持しながら、この提案された標準は、VHDLコードの作成と管理を容易にする多数の拡張機能を提供します。主な変更には、子標準(1164、1076.2、1076.3)のメイン1076標準への組み込み、演算子セットの拡張、caseおよびgenerateステートメントのより柔軟な構文、VHPI(VHDL Procedural Interface)(C / C ++言語へのインターフェイス)とPSL(Property Specification Language)のサブセットの組み込みが含まれます。これらの変更により、合成可能なVHDLコードの品質が向上し、テストベンチがより柔軟になり、システムレベルの記述にVHDLをより幅広く使用できるようになります。
2008年2月、AccelleraはVHDL 4.0(非公式にはVHDL 2008とも呼ばれる)を承認しました。このバージョンは、バージョン3.0の試用期間中に発見された90件以上の問題に対処し、拡張されたジェネリック型を含んでいます。2008年、AccelleraはVHDL 4.0をIEEEにリリースし、IEEE 1076-2008への組み込みのための投票を行いました。VHDL規格IEEE 1076-2008 [ 5 ]は2009年1月に発行されました。
IEEE規格1076は、VHSICハードウェア記述言語(VHDL)を定義しています。この言語は、 1983年に米国空軍から発注された契約F33615-83-C-1003に基づき、言語専門家兼主契約者であるIntermetrics社、チップ設計専門家であるTexas Instruments社、そしてコンピュータシステム設計専門家であるIBMからなるチームによって開発されました。この言語は幾度となく改訂され、重要な点でVHDLを補強または拡張する様々なサブ標準が関連付けられてきました。
IEEE規格1076は電子システムの設計におけるマイルストーンであり続けています。[ 6 ]
VHDLは通常、論理回路を記述するテキストモデルを記述するために使用されます。このようなモデルは、論理設計の一部である場合にのみ、合成プログラムによって処理されます。シミュレーションプログラムは、設計とインターフェースする論理回路を表すシミュレーションモデルを用いて、論理設計をテストするために使用されます。このシミュレーションモデルの集合は、一般的にテストベンチと呼ばれます。
VHDLシミュレータは、典型的にはイベント駆動型シミュレータです。[ 14 ]これは、各トランザクションが特定のスケジュールされた時間だけイベントキューに追加されることを意味します。例えば、信号割り当てが1ナノ秒後に発生する場合、イベントはキューに+1ナノ秒の時間だけ追加されます。ゼロ遅延も許容されますが、その場合もスケジュールが必要です。このような場合には、無限に小さな時間ステップを表すデルタ遅延が使用されます。シミュレーションは、トリガーされたステートメントが評価されるステートメント実行モードと、キュー内のイベントが処理されるイベント処理モードの2つのモードを交互に実行します。
VHDLには、ハードウェア設計に固有の並列性を扱うための構文(プロセス)がありますが、これらの構文(タスク)はAdaの並列構文(タスク)とは構文が異なります。Adaと同様に、VHDLは強い型付けがされており、大文字と小文字は区別されません。ハードウェアで一般的な演算を直接表現するために、 nandやnorを含むブール演算子の拡張セットなど、AdaにはないVHDLの多くの機能が存在します。
VHDLはファイル入出力機能を備えており、テキスト処理用の汎用言語として使用できますが、シミュレーションテストベンチでは、スティミュラスや検証データ用のファイルを使用するのが一般的です。実行可能バイナリをビルドするVHDLコンパイラもいくつかあります。この場合、VHDLを使用してテストベンチを作成し、ホストコンピュータ上のファイルを使用してスティミュラスを定義し、ユーザーとやり取りし、結果を期待値と比較することで、設計の機能を検証できる可能性があります。しかし、ほとんどの設計者はこの作業をシミュレータに任せています。
経験の浅い開発者にとって、シミュレーションには成功するものの、実際のデバイスに合成できない、あるいは大きすぎて実用に耐えないコードを作成することは比較的容易です。特に陥りやすい落とし穴の一つは、記憶素子としてD型フリップフロップではなく、透過型ラッチを誤って生成してしまうことです。[ 15 ]
VHDL IDE(FPGA実装用にはXilinx ISE、Altera Quartus、Synopsys Synplify、Mentor Graphics HDL Designerなど)でハードウェアを設計し、目的の回路のRTL回路図を作成することができます。その後、生成された回路図はシミュレーションソフトウェアで検証できます。シミュレーションソフトウェアは、適切なテストベンチを生成した後、回路の入力と出力の波形を表示します。特定の回路またはVHDLコードに適切なテストベンチを生成するには、入力を正しく定義する必要があります。例えば、クロック入力にはループ処理または反復文が必要です。[ 16 ]
VHDL モデルがCPLDやFPGAなどのプログラマブル ロジック デバイスにマップされる「ゲートとワイヤ」に変換されるとき、何らかのプロセッサ チップ上で「実行」される VHDL コードではなく、実際のハードウェアが構成されることに注意することが重要です。
システム設計に使用する場合の VHDL の主な利点は、合成ツールが設計を実際のハードウェア (ゲートおよびワイヤ) に変換する前に、必要なシステムの動作を記述 (モデル化) および検証 (シミュレーション) できることです。
VHDLのもう一つの利点は、並行システムの記述が可能であることです。VHDLは、一連のステートメントが1命令ずつ順番に実行されるBASIC、C、アセンブリ言語などの手続き型コンピューティング言語とは異なり、すべてのステートメントが同時に実行されるデータフロー言語です。
VHDLプロジェクトは多目的です。一度作成した計算ブロックは、他の多くのプロジェクトで使用できます。また、ブロックの構成パラメータや機能パラメータ(容量パラメータ、メモリサイズ、要素ベース、ブロック構成、相互接続構造など)も調整可能です。
VHDLプロジェクトは移植可能です。ある要素ベース向けに作成されたコンピューティングデバイスプロジェクトは、別の要素ベース(例えば、様々なテクノロジを備えた VLSI)に移植できます。
オリジナルのVerilogと比較したVHDLの大きな利点は、VHDLが完全な型システムを備えていることです。設計者はこの型システムを利用することで、より構造化されたコード(特にレコード型を宣言することで)を記述できます。[ 17 ]
VHDLでは、設計は少なくともインターフェースを記述するエンティティと、実際の実装を含むアーキテクチャで構成されます。さらに、ほとんどの設計はライブラリモジュールをインポートします。設計によっては、複数のアーキテクチャと構成を含むものもあります。
VHDL の 単純なAND ゲートは次のようになります。
-- (これは VHDL コメントです) /* これはブロック コメントです (VHDL-2008) */ -- IEEE ライブラリlibrary IEEEから std_logic をインポートします。; IEEE.std_logic_1164. allを使用します。-- これはエンティティANDGATEのポート( I1 : in std_logic ; I2 : in std_logic ; O : out std_logic ) ;エンティティANDGATE の終了です。-- これはANDGATEのアーキテクチャアーキテクチャRTLです。O < = I1およびI2の開始;アーキテクチャRTLの終了;( はレジスタ転送レベル設計 (Register transfer levelRTL design)を表していることに注意してください。) 上記の例は HDL 初心者には冗長に見えるかもしれませんが、多くの部分はオプションであるか、一度だけ記述すれば済みます。通常、このような単純な関数は、このような単純なもののために別のモジュールを用意するのではなく、より大きな動作モジュールの一部となります。また、 型などの要素の使用は、最初はやり過ぎのように思えるかもしれません。最初は組み込み型を使用してライブラリのインポートを回避することも簡単にできます。ただし、単純なビット (0,1) の代わりに、ある種の多値ロジック、具体的には9 値ロジック( 、、、、、、、 )を使用すると、現在他の HDL には存在しない非常に強力なシミュレーションおよびデバッグ ツールが設計者に提供されます。 std_logicbitUX01ZWHL-
以下の例では、VHDLコードが非常にコンパクトな形式で記述できることがわかります。しかし、経験豊富な設計者は通常、このようなコンパクトな形式を避け、可読性と保守性を考慮して、より冗長なコーディングスタイルを使用します。
VHDLは、電子設計のシミュレーションと、その設計の合成という2つの異なる目的で頻繁に使用されます。合成とは、VHDLをコンパイルし、FPGAやASICなどの実装技術にマッピングするプロセスです。
VHDLのすべての構文が合成に適しているわけではありません。例えば、タイミングを明示的に扱う構文(例:<sup>2</sup> <sup>2</sup>)のほとんどは、シミュレーションには有効ですが、合成できません。合成ツールによって機能は異なりますが、VHDLには共通の合成可能なサブセットwait for 10 ns;が存在し、多くの合成ツールにおいて、どの言語構文とイディオムが共通のハードウェアにマッピングされるかを定義しています。IEEE 1076.6は、公式の合成サブセットとみなされる言語のサブセットを定義しています。非標準の構文では結果が不正確になったり、最適でなくなったりする可能性があるため、合成では非常に慣用的なコードを記述することが一般的に「ベストプラクティス」と考えられています。
マルチプレクサ、または通常「MUX」と呼ばれるものは、ハードウェア設計で非常によく使われるシンプルな構造です。以下の例は、入力 と 、セレクタ 、出力 を持つシンプルな2対1 MUXを示しています。VHDLAではB、S同じXMUXを他の方法で表現できることに注意してください。[ 18 ]
S = '1'の場合、X <= A、それ以外の場合はB ;4×3入力と2ビットセレクタを備えたMUXのより複雑な例:
library IEEE ; use IEEE.std_logic_1164. all ; entity mux4 is port ( a1 : in std_logic_vector ( 2 downto 0 ); a2 : in std_logic_vector ( 2 downto 0 ); a3 : in std_logic_vector ( 2 downto 0 ); a4 : in std_logic_vector ( 2 downto 0 ); sel : in std_logic_vector ( 1 downto 0 ); b : out std_logic_vector ( 2 downto 0 ) ); end mux4 ; architecture rtl of mux4 is -- declarative part: empty begin p_mux : process ( a1 , a2 , a3 , a4 , sel ) begin case sel is when "00" => b <= a1 ; "01" => b <= a2の場合; "10" => b <= a3の場合;その他の場合=> b <= a4の場合;ケース終了;プロセスp_mux終了; RTL終了;透過ラッチとは、基本的にイネーブル信号が立ち上がると更新されるメモリの1ビットです。繰り返しますが、VHDLでは他にも多くの表現方法があります。
-- ラッチ テンプレート 1: Enable = '1'の場合、Q <= D、それ以外の場合はQ ;-- ラッチ テンプレート 2:プロセス(すべて)開始Q <= Dとき(有効);終了プロセス;D型フリップフロップは、クロックの立ち上がり(または立ち下がり)エッジで入力信号をサンプリングします。この例では、非同期のアクティブハイリセットと、クロックの立ち上がりエッジでのサンプリングが採用されています。
DFF :プロセス(すべて)が開始されます。RSTの場合はQ <= '0'です。それ以外の場合はrising_edge ( CLK )の場合はQ <= Dです。次の場合は終了です。DFFプロセスを終了します。VHDLでエッジトリガー動作を記述するもう一つの一般的な方法は、「event」信号属性を使用することです。信号名と属性名の間には、アポストロフィを1つ記述する必要があります。
DFF :プロセス( RST 、CLK )が開始されます。RSTの場合、 Q <= '0'です。それ以外の場合、 CLK 'イベントかつCLK = '1'の場合、Q <= Dです。次の場合、終了です。DFFプロセスを終了します。VHDL は次のような「ワンライナー」にも適しています。
DFF : RST = '1'の場合Q <= '0' 、そうでない場合rising_edge ( clk )の場合D ;または:
DFF :プロセス(すべて)が開始されます。立ち上がりエッジ( CLK )の場合はQ <= Dです。終了する場合は、RSTの場合はQ <= '0'です。終了する場合は、DFF のプロセスが終了します。または:
ライブラリIEEE ; USE IEEE.Std_logic_1164. all ;エンティティRisingEdge_DFlipFlop_SyncResetはport ( Q : out std_logic ; Clk : in std_logic ; sync_reset : in std_logic ; D : in std_logic ); end RisingEdge_DFlipFlop_SyncReset ;RisingEdge_DFlipFlop_SyncResetのアーキテクチャ動作は、begin process ( Clk ) begin if ( rising_edge ( Clk )) then if ( sync_reset = '1' ) then Q <= '0' ; else Q <= D ; end if ; end if ; end process ; end Behavioral ;です。これは、このプロセスによって駆動されるすべての信号 (レジスタ) をリセットする必要がない場合に役立ちます。
以下の例は、非同期リセット、並列ロード、および設定可能な幅を持つアップカウンタです。「unsigned」型の使用、「unsigned」と「std_logic_vector」間の型変換、そしてVHDLジェネリックの使用方法を示しています。ジェネリックは、C++などの従来のプログラミング言語の引数やテンプレートに非常に似ています。この例はVHDL 2008言語で記述されています。
ライブラリIEEE ; IEEE.std_logic_1164. allを使用; IEEE.numeric_std. allを使用; -- 符号なし型の場合エンティティCOUNTERはgeneric ( WIDTH : in natural := 32 ); port ( RST : in std_logic ; CLK : in std_logic ; LOAD : in std_logic ; DATA : in std_logic_vector ( WIDTH - 1 downto 0 ); Q : out std_logic_vector ( WIDTH - 1 downto 0 )); end entity COUNTER ;COUNTERのアーキテクチャRTLは始めるプロセス(すべて)はbegin if RST then Q <= ( others => '0' ); elsif rising_edge ( CLK ) then if LOAD = '1' then Q <= DATA ; else Q <= std_logic_vector ( unsigned ( Q ) + 1 ); end if ; end if ; end process ;エンドアーキテクチャRTL ;より複雑なカウンタでは、カウンタ内にif/then/else文を追加することでrising_edge(CLK) elsif、カウントの有効化、特定のカウント値での停止またはロールオーバー、ターミナルカウント信号のような出力信号の生成といった他の機能を追加できます。これらの制御を併用する場合は、必要な優先順位を実現し、必要な論理レベル数を最小限に抑えるために、制御の順序とネストに注意する必要があります。
VHDLの大部分のサブセットはハードウェアに変換できません。このサブセットは、VHDLの非合成サブセットまたはシミュレーション専用サブセットと呼ばれ、プロトタイピング、シミュレーション、デバッグにのみ使用できます。例えば、次のコードは50MHzの周波数のクロックを生成します。これは、例えばシミュレーション中に設計内のクロック入力を駆動するために使用できます。ただし、これはシミュレーション専用の構造であり、ハードウェアに実装することはできません。実際のハードウェアでは、クロックは外部で生成され、ユーザーロジックまたは専用ハードウェアによって内部的にスケールダウンされます。
プロセス開始CLK <= ' 1' ; 10 NS待機; CLK <= ' 0' ; 10 NS待機;プロセス終了;シミュレーション専用の構造を用いることで、非常に短時間で複雑な波形を構築できます。このような波形は、例えば複雑な設計のテストベクトルとして、あるいは将来実装予定のシンセサイザーロジックのプロトタイプとして使用することができます。
プロセス開始wait until START = '1' ; -- START がハイになるまで待機します。1 ~10のループでi を実行します-- その後、数クロック期間待機します... wait until rising_edge ( CLK );ループを終了します。for i in 1 to 10ループ-- 1 から 10 までの数字を DATA に書き込みます (1 サイクルごとにDATA <= to_unsigned ( i , 8 ); rising_edge ( CLK )まで待機します);ループを終了します;-- 出力が変化するまで待機しますwait on RESULT ; -- クロック周期で ACK を発生させますACK <= '1' ; rising_edge ( CLK )まで待機しますACK <= '0' ;-- など...プロセスを終了します。ライブラリieee ; ieee.std_logic_1164. allを使用します。エンティティbfmは、エンティティの終了です。アーキテクチャbeh of bfmは、シグナルen : std_logic ; begin -- ここに実装を挿入します。アーキテクチャの終了です。// ------------------------------------------ライブラリieee ; ieee.std_logic_1164. allを使用します。エンティティtest1は終了エンティティです。test1のアーキテクチャの動作は開始です。ibfm :エンティティwork.bfm ; --テストベンチ プロセスプロセスエイリアスprobe_enは<< signal.test1.ibfm.en : std_logic >>です。begin probe_en < = ' 1 ' ; wait for 100 ns ; probe_en < = ' 0' ; wait for 100 ns ; probe_en < = ' 1 ' ; wait for 100 ns ; std.env.stop ( 0 ) ; end process ; end architecture ;標準パッケージとも呼ばれます。
IEEE標準パッケージには以下のものが含まれています。[ 19 ]
コマーシャル:
他の: