6

これは、VHDLをよく理解している人への質問です。私は初心者ですが、これまでのところ、動作記述を使用してVHDLを生成しています。私にとっては、ソフトウェアの作成に似ているため、考えるのがはるかに簡単です。考えられる欠点は、構造が設計コンポーネント/プロセス内で同時に実行されている間に、動作が「実行」されることです。

したがって、たとえば8ビットシフトレジスタ(SISO)のプロセスを使用するアーキテクチャがあり、これらの4つのインスタンス(4x8ビットシフトレジスタ)を作成したい場合は、コンポーネントと4を作成します。プロセスのインスタンス?

または、4つのプロセスを生成し(互いに並行して実行)、各プロセスを異なる名前で呼び出すだけですか?

また、人々がそこで使用しているグッドプラクティスのコンセンサスを得るための一般的な質問です。構造的か行動的か、どちらが好きですか?どちらかを選択するのに適した時期はいつですか?プロセスでの内部同時実行と順次実行を可能にするコンポーネントを使用した「より高速な」実行には、いくつかの利点があると思います。動作設計で設計時間を短縮できることは確かですが、私には思えます。

ありがとう!〜ドディ

4

1 に答える 1

11

私の考えでは、今日の構造 HDL の役割は、テスト済みの動作ブロックを相互接続する (またはテストされていないブロックをテストベンチに接続する!) ことに限定されています。

また、行動プロセスを書くことは、ある意味でソフトウェアを書くことに似ていることにも同意します (そうではないという一部の叫びに対して)。

でも

動作をシーケンシャルまたはスローと同一視するという罠に陥らないでください。

あなたのシフトレジスタを考えると、

type reg_type is array(7 downto 0) of bit;
signal s_in, s_out : bit;

process(clk) is
variable reg : reg_type;
begin
   if rising_edge(clk) then
      s_out <= reg(7);
      reg   := reg(6 downto 0) & s_in;
   end if;
end;

次のように簡単に並列化できます。

signal p_in, p_out : array(1 to 4) of bit;

process(clk) is
variable reg : array(1 to 4) of reg_type;
begin
   if rising_edge(clk) then
      for i in reg'range loop
         p_out(i) <= reg(i)(7);
         reg(i)   := reg(i)(6 downto 0) & p_in(i);
      end loop;
   end if;
end;

(そして、これを書くもっと簡単な方法があります!) ループの実行にそれ以上時間がかからないことに注意することが重要です: より多くのハードウェアを生成するだけです (ソフトウェア用語では、完全に展開されます)。各反復は、他の反復から完全に独立しています。そうでない場合、事態はより複雑になります。

構造と行動の学術的な違いについて心配する必要はありません。

プロセス内のシグナル割り当てスケジューリングと変数割り当てスケジューリングの違いについて心配します (デルタ サイクルと延期された割り当てとは何かを学びます。これはソフトウェアとの主な違いの 1 つであり、ソフトウェアには VHDL のシグナルではなく変数しかないために発生します)。ここでパイプラインを逆さまに実装した理由を説明します (最初に出力) - 変数を使用したためです。

1 プロセスの SM の方がシンプルで安全なのに、馬鹿げた 2 プロセスのステート マシンを教える人がなぜそんなに多いのか心配です。

単一プロセス モデルに関する Mike Treseler のページを見つけて理解してください (まだオンラインになっていることを願っています)。

于 2012-11-16T20:26:41.383 に答える