Basic VHDL Tutorialシリーズのチュートリアル6〜11を完了後、この専門家作成クイズで自分を試してみましょう。理解の限界を押し広げる設計なので、不安なときは推論スキルを使って最も妥当な答えを選んでください。 各回答後の簡潔な説明でマイクロラーニングを実現。 問題1 このコードは何を出力するか? MySignal=-2147483648 MySignal=0 MySignal=10 Correct!Wrong!- Continue >> 問題2 このコードは何を出力するか? MySignal=0 MySignal=1 MySignal=10 Cor
VHDLにおいて、signedとunsignedはデータバス上で算術演算を行える特殊なビットベクトルです。std_logic_vectorが信号配線に適しているのに対し、これらの型はコンパイラによって数値として解釈されます。 std_logic_vectorを加算しようとすると、コンパイルエラーNo feasible entries for infix operator +が発生します。ツールが生のビットパターンを数値としてどう扱うか判断できないためです。 Basic VHDL Tutorialsシリーズの一部。 算術を可能にするには、ベクトルをsignedまたはunsignedで宣言: s
VHDLにおける並行文(concurrent statement)とは、processブロックの外部、アーキテクチャ内に直接配置される信号代入のことです。並行代入または並行プロセスとも呼ばれます。 並行文を書くと、右辺に現れるすべての信号に自動的に敏感なプロセスを効果的に作成します。つまり、並行代入は完全な感度リストを持つプロセスのシンタックスシュガーです。 この短縮形は、単一の信号を駆動するシンプルな組み合わせロジックを実装する際に特に便利です。感度リスト付きの完全なprocess構造を書く代わりに、アーキテクチャ本体で直接ターゲット信号に代入できます。 このチュートリアルはBasic VH
Case-When文は、信号、変数、式に基づいてVHDLプログラムを複数のパスのいずれかに誘導します。特に複数の離散値を扱う場合、長いif-then-elsif-elseチェーンよりもクリーンで読みやすい代替手段を提供します。 多くのプログラミング言語がswitchやcase構造を使用しますが、VHDLではcase構文がマルチプレクサや他の選択ロジック構築の定番です。 この記事はBasic VHDL Tutorialsシリーズの一部です。 基本構文 case文の標準構造: -- この分岐のコード ... end case; <expression>は通常シグナルまたは変数
VHDLにおいて、モジュールはエンティティを通じて外部世界と通信する自己完結型ユニットです。インスタンス化のポートマップ節は、エンティティの形式ポートを周囲の設計内のシグナルに接続します。 モジュール、エンティティ、テストベンチ FPGAやASIC向け開発では、設計ロジックは明確に定義された入出力ポートを持つモジュールに存在します。ポートを持たないモジュールはテストベンチです。テストベンチはデバイス・アンダー・テスト(DUT)に刺激を与えるシミュレーションラッパーであり、物理チップには決して現れません。 以前の投稿ではすべてのVHDLを単一ファイルに書いていましたが、これは迅速な実験には便利
再利用可能なモジュールを作成することは効率的なVHDL設計の基盤ですが、微細なバリエーションが重複コードを強いることがあります。ジェネリックとジェネリックマップは、モジュールのパラメータをコンパイル時に構成可能にし、コードをDRY(Dont Repeat Yourself)かつ保守しやすく保ちます。 定数は同じ値を繰り返しハードコーディングすることを防ぎます。信号ベクトル幅や他のコンパイル時パラメータの定義に最適で、ジェネリック定数にマッピングすることもできます。シグナルや変数とは異なり、定数の値はエラボレーション後に不変であり、設計全体で一貫性を保証します。 この記事はBasic VHDL
大多数のVHDL設計はクロックドロジック、いわゆる同期またはシーケンシャルロジックを採用します。クロックドプロセスは、マスタークロックのエッジのみで活性化し、他の入力信号の変化に関係なく動作します。 クロックドロジックの基本要素はフリップフロップです。本チュートリアルでは、負リセット付き正エッジトリガーフリップフロップに焦点を当てます。以下の回路図を参照: サンプル・アンド・ホールドデバイスとして、フリップフロップは立ち上がりクロックエッジで入力値を取り込み、次の立ち上がりエッジまたはリセット信号アサートまでその値を保持します。 注意: この投稿はBasic VHDL Tutorialsシリ
Basic VHDL Tutorialシリーズのチュートリアル12〜17を完了し、このターゲットクイズで知識をテストしましょう。 問題1:signed型について正しい記述は? unsigned型より大きな値を表現できる 最左ビットが1なら値は負でなければならない オーバーフローはランタイムエラーになる - Continue >> 問題2:この並行プロセスと等価なのはどれ? - Continue >> 問題3:このコード実行後、Outputの値は? 0000 0
以前のチュートリアルではシミュレーションで時間を遅延させるためにwait for文を使用しました。しかし、wait forは本番設計では使用できません。実際の回路に一時停止を指示できないためです。VHDLモジュールで時間を測る実用的な方法は、クロックサイクルを数えることです。 すべてのデジタル設計には既知の周波数で発振する安定したクロック信号があります。クロックが100MHzなら、1秒は1億クロックティックに相当。これらのティックを数えることで、秒、分、時間、それ以上を確実に生成できます。 この記事はBasic VHDL Tutorialsシリーズの一部です。 クロックの立ち上がりエッジごとに
VHDLにおいて、プロシージャは設計者が繰り返しコードブロックを避けるためのサブプログラムです。同じ操作が複数箇所で必要な場合、完全なモジュールを作成するのは過剰です。プロシージャは軽量で再利用可能な解決策を提供します。 プロシージャはアーキテクチャ、パッケージ、プロセスなどあらゆる宣言領域で宣言でき、スコープはその領域に限定されます。呼び出されると、プロシージャ本体がその場に書かれたかのように実行され、別コンポーネントのオーバーヘッドなしでモジュール性の利点を得られます。 関数とは異なり、プロシージャは直接値を返しません。しかし、パラメータリストでoutやinoutシグナルを宣言することで値
有限ステートマシン(FSM)は、現在の入力だけでなく、過去の入力と出力のシーケンスにも出力が依存する決定論的ロジックモデルです。FPGA設計や時間依存VHDLアルゴリズムでは、FSMが状態を持つ振る舞いを捉えるための標準的な抽象化です。 VHDLのFSMは通常、state信号を用いて前回の構成を記憶するクロックドプロセスとして実装されます。state信号は内部レジスタとして機能し、設計が複数クロックサイクルにわたるイベントに反応できるようにします。 Basic VHDL Tutorials – Part 3 信号機としてのFSM 4方向交差点を信号機で制御する場合を考えます。信号機は有限の可
関数はVHDLのサブプログラムで、頻繁に使用されるアルゴリズムの実装に用います。関数はゼロ以上の入力値を取り、常に値を返します。プロシージャと異なる点は、Wait文を含められないため、関数は常にゼロシミュレーション時間で完了することです。 他言語の関数やメソッドに慣れていれば、VHDL関数は容易に理解できるでしょう。VHDLでは戻り値を省略したりvoidを返したりできません。関数は常に何かを返し、その戻り値は何かに代入しなければなりません。 このブログ記事はBasic VHDL Tutorialsシリーズの一部です。 VHDLには純粋(pure)と不純(impure)の2種類の関数があります。
VHDLにおいて、不純関数(impure function)は、パラメータリストに含まれない信号を含む、そのレキシカルスコープ内のあらゆる信号にアクセスまたは変更できます。この能力により、関数に副作用が生じます:同じ引数を与えても戻り値が異なる可能性があり、直接返されない外部信号を変更することもできます。 純粋関数は決定論的振る舞いに限定されますが、不純関数は複雑なステートマシンロジックを整理し、繰り返しや副作用を伴うタスクを単一の適切に命名されたサブプログラムに移動するのに不可欠です。 注意: 不純関数はプロセス内で宣言するのが最適です。アーキテクチャやパッケージレベルで宣言すると、コンパイ
VHDLでは、プロシージャがスコープ内にある限り外部信号を駆動できます。アーキテクチャで宣言されたプロシージャは外部信号にアクセスできません(コンパイル時にそれらの信号が見えないため)が、プロセス内で定義されたプロシージャは、そのプロセスが見えるすべての信号を自由に読み書きできます。 プロセス内プロシージャを使用することは、ステートマシンや複雑なプロトコルにおける繰り返しロジックを整理する効果的な方法です。共通アクション(タイムド状態遷移など)をプロシージャにカプセル化することで、ボイラープレートコードを削減し、可読性を向上させ、各ステップの意図を明確にできます。 例えば、信号機コントローラで
Basic VHDL Tutorialシリーズのパート4完了後に、このVHDLクイズで進捗をテストしましょう! 問題1:VHDLで実時間をどう測るか? wait for 1 ns文を使用する クロック周期を数える 伝播遅延を利用する - 続行 >> 問題2:正しい記述はどれか? プロシージャはWait文を含められない プロシージャパラメータは常に入力である プロシージャ内でreturnキーワードを使うとき、値なしでなければならない - 続行 >> 問題3:この火器管制システムの根本的な欠陥を説明する記述はどれか?
リンクリストは、要素の追加・削除に応じて拡張・縮小する動的データ構造です。VHDLのオブジェクト指向機能(アクセス型、レコード、保護型)を用いると、この構造をクリーンかつ効率的に実装できます。 DataStructuresパッケージの作成 リンクロジックを専用VHDLパッケージDataStructuresにカプセル化します。この将来を見据えた名前により、後でツリーやハッシュマップなど他の構造へ容易に拡張可能です。 package DataStructures is -- 公開宣言 end package DataStructures; package body DataStruct
自己検証テストベンチとは、手動検査なしでデバイス・アンダー・テスト(DUT)の正確性を検証するVHDLプログラムです。実行すると自動的にOKまたはFailedステータスを報告するため、信頼性の高いVHDL開発に不可欠なツールです。 すべてのVHDLモジュールには自己検証テストベンチを付けるべきです。DUT本体、サブモジュール、インターフェースのいずれを変更しても、回帰バグをサイレントに導入しないことを保証します。よく作られたテストベンチは、巧妙なバグに対する第一の防衛線となります。 テスト対象デバイス(DUT) シンプルながら説明しやすいDUTとして、バイナリ・ツー・グレイコード変換器を使用
インタラクティブテストベンチとは、シミュレーション実行中にオペレータがデバイス・アンダー・テスト(DUT)へ入力を与えるシミュレータセットアップです。通常、シミュレータコンソールでコマンドを入力し、DUTに刺激を与えます。 自己検証型テストベンチを常に作成すべきですが、インタラクティブテストベンチは有用な補完となります。アドホックなテストをインタラクティブテストベンチで行う方が、自己検証テストベンチのコードを修正するより容易です。 ラボで発見した問題をテストベンチで再現したい場合、観察された入力シーケンスをシミュレータにタイプするだけで、望ましくない動作を再現できます。 TclとVHDLの連
循環バッファ(リングバッファ)は、シーケンシャルプログラミング言語でキューを実装する際によく用いられる構造ですが、ハードウェアでも実装可能です。本記事では、ブロックRAM上でFIFOを実現するためのリングバッファをVHDLで作成します。 FIFO実装時の設計判断 FIFOを実装する際には多くの設計判断が必要です。どのインターフェースが必要か? リソース制約はあるか? オーバーライトやオーバーリードに対する耐性は必要か? レイテンシは許容されるか? これらはFIFO作成を依頼されたときに浮かぶ代表的な疑問です。 オンラインには多くの無料FIFO実装や、Xilinx LogiCOREのようなFI
制約付きランダム検証は、テスト対象デバイス(DUT)に対して疑似ランダム・トランザクションを生成するテストベンチ戦略です。目標は、DUTとのランダムな相互作用を通じて、事前に定義された多数のイベントの機能カバレッジを達成することです。 Open Source VHDL Verification Methodology(OSVVM)は、制約付きランダム・テストベンチの作成に便利な多数のパッケージを含む無料のVHDLライブラリです。特にRandomPkgとCoveragePckに注目しており、この記事でこれらを使用します。OSVVMのGitHubページにアクセスして、このライブラリの機能について
VHDL