工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> VHDL

VHDLジェネレート文をマスターする: 再利用可能なデバウンサーを簡単に構築

VHDLのgenerate文を使用すると、設計者はコード・ブロックを複数のインスタンスに自動的に複製でき、それぞれが異なる信号に接続されます。これは、プロセスやインスタンスを連鎖させて作成できるコンパイル時のforループと考えると分かりやすく、定型コードを大幅に削減し、保守性を向上させます。

従来のループがプロセスやサブプログラム内に限定されるのに対し、generateはアーキテクチャ領域に直接記述されます。ジェネリックと組み合わせると、高度に設定可能で再利用可能なVHDLコンポーネントを作る強力なメカニズムになります。

ジェネレート文の構文

[label :] for <constant_name> in <range> generate [declarations_local_to_each_loop_iteration] [begin] <processes_and_instantiations> end generate [label];

角括弧で囲まれた部分は省略可能です。ローカル宣言がない場合は宣言領域とbeginキーワードを省略できます。<range>はtoまたはdowntoを使用する標準的な整数構文に従います。

1ビット・スイッチ・デバウンサー

generateに入る前に、単一スイッチ入力をクリーンアップするシンプルなデバウンサーを見てみましょう。ジェネリックtimeout_cyclesにより、任意のクロック周波数に対応できます。このデバウンサーは、メカニカル・スイッチの遷移時に発生する過渡的なグリッチを抑制します。

entity debouncer is generic ( timeout_cycles : positive ); port ( clk : in std_logic; rst : in std_logic; switch : in std_logic; switch_debounced : out std_logic ); end debouncer;

実装はジェネリックで幅が決まる整数カウンターに依存します。内部的にシャドウ信号debouncedを使用して出力ロジックをクリーンに保ちます。

architecture rtl of debouncer is signal debounced : std_logic; signal counter : integer range 0 to timeout_cycles - 1; begin -- 内部信号を出力にコピー switch_debounced <= debounced; DEBOUNCE_PROC : process(clk) begin if rising_edge(clk) then if rst = '1' then counter <= 0; debounced <= switch; else if counter < timeout_cycles - 1 then counter <= counter + 1; elsif switch /= debounced then counter <= 0; debounced <= switch; end if; end if; end if; end process; end architecture;

ModelSimでのシミュレーションにより、switch_debouncedが指定タイムアウト後にのみ入力に追従し、バウンシング・アーティファクトを効果的に除去することが確認できます。

VHDLジェネレート文をマスターする: 再利用可能なデバウンサーを簡単に構築

テストベンチを含む完全なModelSimプロジェクトは、以下のフォームにメールアドレスを入力してダウンロードできます。すべての更新はVHDLwhizから送信され、いつでも購読解除可能です。

インスタンス化を含むジェネレートforループ

デバウンサーをスイッチ配列に拡張するには、generate文を使用して複数のインスタンスを自動生成します。

entity debouncer_gen_inst is generic ( switch_count : positive; timeout_cycles : positive ); port ( clk : in std_logic; rst : in std_logic; switches : in std_logic_vector(switch_count - 1 downto 0); switches_debounced : out std_logic_vector(switch_count - 1 downto 0) ); end debouncer_gen_inst;

アーキテクチャでは、ジェネレート・ループを使用して各スイッチ・ビットごとにdebouncerをインスタンス化します。各インスタンスは同じクロックとリセットを共有し、異なるベクトル要素に接続されます。

architecture rtl of debouncer_gen_inst is begin MY_GEN : for i in 0 to switch_count - 1 generate DEBOUNCER : entity work.debouncer(rtl) generic map ( timeout_cycles => timeout_cycles ) port map ( clk => clk, rst => rst, switch => switches(i), switch_debounced => switches_debounced(i) ); end generate; end architecture;

ジェネレート・ブロックにラベルを付ける(例: MY_GEN)と、シミュレーターの階層表示や合成レポートでの可読性が向上し、デバッグが容易になります。

VHDLジェネレート文をマスターする: 再利用可能なデバウンサーを簡単に構築

テストベンチではスイッチ3のみをトグルするため、波形はMY_GEN(3)に焦点を当てています。ModelSimでこの例を実行して、デバウンス・ロジックの動作を確認してください。

プロセスを含むジェネレートforループ

あるいは、デバウンサー・ロジックをジェネレート・ブロック内に持ち上げ、個別のコンポーネント・インスタンス化を排除することもできます。このアプローチでは、generateループがローカル信号を持つ同一プロセスも生成できることを示します。

architecture rtl of debouncer_gen_proc is begin MY_GEN : for i in 0 to switch_count - 1 generate signal debounced : std_logic; signal counter : integer range 0 to timeout_cycles - 1; begin switches_debounced(i) <= debounced; DEBOUNCE_PROC : process(clk) begin if rising_edge(clk) then if rst = '1' then counter <= 0; debounced <= switches(i); else if counter < timeout_cycles - 1 then counter <= counter + 1; elsif switches(i) /= debounced then counter <= 0; debounced <= switches(i); end if; end if; end if; end process; end generate; end architecture;

結果の振る舞いはモジュール・インスタンス化アプローチと一致しますが、コードがアーキテクチャ内で自己完結しています。両方の方法が有効です。設計スタイルに合った方を選んでください。

すべてのコード・サンプル(完全なModelSimプロジェクト含む)は、以下のフォームからダウンロード可能です。VHDLwhizを購読して最新情報を入手し、いつでも購読解除できます。

generateの創造的な用途があれば、コメントで共有してください!

VHDL

  1. スイッチ付き回路:基本電気回路の実践ガイド
  2. 整流ダイオード実験:ネオンランプで誘導キックバックを抑制
  3. AC解析設定:カーブ、ポイント、周波数スイープ設定
  4. 電気スイッチの理解:タイプ、機能、応用
  5. C# switch 文をマスターする:構文、例、ベストプラクティス
  6. C# break 文:使い方とタイミングを徹底解説
  7. C# continue 文をマスターする:ループ反復を効果的にスキップする方法
  8. C++ switch文をマスター:構文、使い方、実践例
  9. VHDLプロシージャ例:std_logic_vectorのインクリメント
  10. VHDLレコードでクリーンかつ再利用可能なFIFOインターフェースを実現
  11. VHDL変数の解説:実践例と信頼性設計のためのルール