0

VHDLの信号と変数についてお聞きしたいのですが、それらの違いは知っていますが、シミュレーションで違いを確認したいです。

Quartus ツールでこの単純なプログラムを使用して、それらの違いを確認しました。

ENTITY test IS PORT (
  a : IN bit;
  y : OUT bit);
END test;

ARCHITECTURE beh OF test IS
SIGNAL x : BIT;
BEGIN
  PROCESS (a)
  BEGIN
    x <= '1';
    IF x = '1' THEN y <= '0' AFTER 8 ns;
    ELSE y <= '1' AFTER 5 ns;
    END IF;
  END PROCESS;
END BEH;

信号の場合と変数の場合:

entity test1 is port (
  a : IN bit;
  y : OUT bit);
end test1;

architecture beh of test1 is
begin
  process (a)
  variable x : bit;
  begin
    x := '1';
    if x = '1' then y <= '0' after 8 ns;
    else y <= '1' after 5 ns;
    end if;
  end process;
end beh;

最初のプログラムで違いを確認するために作成した波形を(y)valueに設定する必要がありますが、変更さ15nsません..なぜですか?

前もって感謝します。

4

3 に答える 3

2

波形ビューアはデルタ サイクルの最後 (つまり、リアルタイムが経過したとき) の変数の値のみを表示するため、波形の違いはわかりません。コードを 1 ステップ実行するか、プロセスの途中でステートメントを追加するreportと、変数の中間値を確認できます。

signal s:integer := 0;
process
   variable v:integer := 0;
begin
   report "Signal="&integer'image(s)&" variable="&integer'image(v);
   s <= 1; v := 1;
   report "Signal="&integer'image(s)&" variable="&integer'image(v);
   wait for 0 ps; -- end the delta cycle, even 0ps counts as "time passing"
   report "Signal="&integer'image(s)&" variable="&integer'image(v);
   wait;
end process;
于 2013-01-30T16:52:41.860 に答える
0

信号「a」を機密リストに入れると、「ラッチ」につながります。

更新 y の場合、"x" を機密リストに入れるか、トリガー シグナルのように "a" を変更する必要があります。

あなたの場合、シグナルと変数は定数として修正したため、類似しています。

さらに、信号「a」の動作を使用してテストベンチをアップロードする必要があります。


編集:機密リストに「x」を入れるのは間違っています。@damage に感謝

于 2012-10-11T07:19:12.050 に答える
0

このコードは、b/w 信号と変数の違いを示しているはずです。プロセスをテストベンチに直接挿入したので、選択した HDL シミュレーターでコードを直接シミュレートできます。
10 ns 後にstartイベントが発生し、両方のプロセスが評価されます。
その後、予想される結果が表示されるはずです。つまりsig_out、さらに 20 ns 後にハイになるのに対しvar_out、わずか 10 ns 後にハイになるはずです。

library ieee;
use ieee.std_logic_1164.all;

entity sigvartest is
end entity sigvartest;

architecture behav of sigvartest is

signal start : std_logic := '0'; -- event to start simulation

signal x_sig : std_logic := '0'; -- signal tested in SIGPROCESS

signal sig_out : std_logic := '0'; -- output of SIGPROCESS

signal var_out : std_logic := '0'; -- output of VARPROCESS

begin

start <= '0', '1' after 10 ns; -- pretty self-explanatory, start goes high after 10 ns

SIGPROCESS:
        process(start) is
        begin
            if(rising_edge(start)) then
                x_sig <= '1'; -- signal is scheduled to be assigned its new value, no immediate change!

                if(x_sig = '1') then
                    sig_out <= '1' after 10 ns;
                else
                    sig_out <= '1' after 20 ns; -- this part will execute
                end if;
            end if;
        end process;

VARPROCESS:
        process(start) is
                variable x_var : std_logic := '0';
        begin
                if(rising_edge(start)) then
                    x_var := '1'; -- variable is assigned immediately

                    if(x_var = '1') then
                        var_out <= '1' after 10 ns;  -- this part will execute
                    else
                        var_out <= '1' after 20 ns;
                    end if;
                end if;
        end process;

end architecture;
于 2012-10-11T23:35:02.267 に答える