0

我想问一下VHDL中的信号和变量,我知道它们之间的区别,但是我想在仿真时看到区别。

我在 Quartus Tool 中使用了这个简单的程序来查看它们之间的区别:

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应该设置为1at 5ns,但它没有改变..为什么?

先感谢您。

4

3 回答 3

2

您看不到波形的差异,因为波形查看器仅显示增量周期结束时的变量值(即当某个实时时间过去时)。如果您单步执行代码,或在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

这段代码应该说明黑白信号和变量的差异。我将流程直接插入到测试平台中,因此可以使用您选择的 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 回答