私はVHDLを研究していますが、VHDLはHDLであるため、理解するのが特に難しいことが1つあります。私の謙虚な意見では、VHDLが記述するすべてのものを回路に変換できるはずです。しかし、これはどのように変数とプロセスに起こるのでしょうか?可変とプロセスを実現できる回路はありますか?この例を教えてください。ありがとう
2 に答える
変数を含むプロセスは確かに回路に変換できます。
ここにいくつかの簡単な例があります。
Process(clk)
Variable Q : std_logic_vector(7 downto 0);
begin
if rising_edge(clk) then
if En = '0' then
Q := D;
end if;
end if;
Output <= Q;
end process;
すべてのクロックサイクルで、En(有効)入力が低い場合、入力データDは変数Qに格納されます。それ以外の場合は何も起こりません(そして変数は古い値を保持します)。これは非常に特殊な回路です。イネーブル付きの8ビットレジスタ。古いデータブックで74LS377を調べて、TTLの同じ回路を確認してください。
クロックの「if」ステートメントはEnステートメントとは別に保持され、それを囲んでいることに注意してください。合成ツールは、翻訳方法を知っている特定のパターンを探します。これはその1つです。ソフトウェアの経験がある場合は、それらを組み合わせたくなるかもしれません: if rising_edge(Clk) and En = '0' then ...
-そしてシミュレーションでは、まったく同じ動作が得られます。
ただし、一部の合成ツールはこのパターンを認識せず、ハードウェアを生成する代わりにエラーを報告する場合があります。(合成ツールは継続的に改善されているので、最近は幸運かもしれません)。ツールのドキュメント(例:ザイリンクスの「合成およびシミュレーション設計ガイド」)には、可能なことと不可能なことを説明する必要があります。[編集:]残念ながら、1995年の慣行にとらわれており、VHDLの本当に恐ろしい例がいくつか含まれています。
Process(clk)
Variable Count : Integer range 0 .. 255 := 0; -- set to 0 when process first starts
begin
if rising_edge(clk) then
Count := Count + 1 mod 256;
end if;
Output := Count;
end process;
信号のような変数は、論理型である必要はないことに注意してください。整数、配列、およびレコード(いくつかの制限付き)は合成可能です。フロートは通常そうではありません(ただし、ツールが改善されるにつれてこれは変化しています)。8ビットカウンターを取得するために、整数の範囲を制限したことに注意してください。
整数の場合は、オーバーフローしたときに何が起こるかを明示的に指定する必要もあります(ここで行ったように)。そうしないと、シミュレーションでエラーが発生します。ただし、(ここでのように)明らかな動作を指定しても、追加のハードウェアの費用はかかりません。そして、numeric_std.unsignedのような他の数値タイプを使用すると、ツールはそれほど面倒ではありません。
少し簡略化しました。通常、起動動作を制御できるようにするために、通常のプロセスにReset句がありますが、これらの例は実際のものであり、機能するはずです。
変数は非常に便利です。変数はすぐに変更されますが、次のティックまで値を保持することもできます。これにより、通常はプロセスの「出力」である以前に計算された値にアクセスする場合に、コードの複製を回避できます。
回路の作成に関しては、変数と信号は設計内のある場所から別の場所に値を転送するだけです。変数はプロセス内に限定され、信号は設計全体に流れることができます。いずれにせよ、シンセサイザーの仕事は、記述した動作を把握し、一致するロジックを実装することです。変数またはシグナルをインクリメントすると、同じ「ゲート」(またはルックアップ テーブルなど) のセットが得られます。