1

以下の VHDL コードは単純なスワップ プログラムです。aしかし、入力と を交換していませんb。コメントでトランスクリプトの値を指定しました。

library ieee;
use ieee.std_logic_1164.all;

entity vhdl_swap is
  port(a,b: inout integer);
end vhdl_swap;

architecture ar of vhdl_swap is
  signal s : std_logic;
begin

  process(s)
    variable var : integer:=0;
  begin
    report "var is" & integer'image(var); -- 0
    report "a is " & integer'image(a);    -- 10 - (given value when simulated)
    report "b is " & integer'image(b);  -- 20 - (given value when simulated)

    report "---------------------------";

    var := a;
    report "var is " & integer'image(var);--var = 10 (assigned properly)
    a<=b;
    report "a is " & integer'image(a);-- a=10(same value but not assigned)
    b<=var;
    report "b is " & integer'image(b);-- b=20(same value but not assigned)

    report "-----------------------------------";

    report "a is " & integer'image(a);--a=10
    report "b is " & integer'image(b);--b=20

    --print()  

  end process;
end;

statement で動作するものがありますが、a<=b何がそれを割り当てるのを妨げているのかわかりません。

4

2 に答える 2

3

VHDL で割り当てられた新しい値は、デルタ遅延が経過<=するまで読み取ることができません。

これは VHDL の基本的なプロパティです。これは、レジスタの更新が機能する方法を反映し、更新をトリガーする信号がクロックであるためです。

これは、変数なしで実際にスワップを実行できることも意味しますが、次のようにするだけです。

a <= b;
b <= a;

コードには他にも問題があります。たとえば、何にs使用されるか、入力と出力の両方に a と b を使用すると、解決関数が追加されない限り、ドライブの競合が発生します。

于 2016-02-26T18:13:37.527 に答える
1

<=明示的な遅延を指定せずに ( を使用して) VHDL で信号に新しい値を割り当てるとafter <time>、新しい信号値は次のデルタ サイクルで使用可能になります。シミュレーターが現在のデルタ サイクルにスケジュールされているすべてのプロセスを一時停止すると、新しいデルタ サイクルが開始されます。そして、waitステートメントで処理が中断されます。wait on S;を含む機密リストを使用してプロセスを記述したため、プロセスの最後に暗黙のステートメントがありますS。信号と同じように動作するinoutポートaとここを割り当てました。b

信号の更新は次のデルタ サイクルまで表示されないため、すべてのレポート ステートメントでaおよびbそれぞれに対して同じ値が出力されます。つまり、プロセスが開始/再開されたときにaとの値を出力します。b

シグナルの割り当ては、たとえばコード内の変数の割り当てとは異なります。変数はvarすぐに更新されます。

シグナルSは変更されないため、プロセスは一度だけ実行されます。すべてのプロセスは、シミュレーションの開始後に 1 回実行され、waitステートメント (上記のコード内の暗黙的なもの) で中断されます。

aとの初期値はそれぞれ10と20とおっしゃっbていましたが、ModelSimでもGHDLでも再現できませんでした。次のテストベンチで試してみましたが、これが唯一の可能な方法だと思います。

library ieee;
use ieee.std_logic_1164.all;

entity vhdl_swap_tb is
end entity vhdl_swap_tb;

architecture sim of vhdl_swap_tb is
  -- component ports
  signal a : integer := 10;
  signal b : integer := 20;
begin  -- architecture sim

  -- component instantiation
  DUT: entity work.vhdl_swap
    port map (
      a => a,
      b => b);

end architecture sim;

モードのポートと未解決のタイプの両方のポートがあるためa、ここでは初期値を使用する必要がありました。したがって、別のテストベンチ プロセスで割り当てて2 つ目のドライバーを追加することはできません。binoutab


信号の更新は (少なくとも) 次のデルタ サイクルまで遅延されるため、追加の変数は必要ありません。以下は、2 つのシグナルの交換を示す非常に短いサンプル コードです。

library ieee;
use ieee.std_logic_1164.all;

entity swap is
end entity swap;

architecture sim of swap is
  signal a     : integer   := 10;
  signal b     : integer   := 20;
  signal clock : std_logic := '1';
begin

  -- clock generation
  clock <= not clock after 10 ns;

  -- swapping
  process(clock)
  begin
    if rising_edge(clock) then
      a <= b;
      b <= a;
    end if;
  end process;
end sim;

次の波形に示すように、スワッピングはクロックの立ち上がりエッジごとに行われます。

シミュレーション出力

于 2016-02-26T20:34:53.667 に答える