2012-10-10 279 views
0

我想问一下VHDL中的信号和变量,我知道它们之间的区别,但我希望看到模拟中的差异。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,但它不会改变..为什么?

预先感谢您。

+1

你应该张贴您的测试平台的代码为好,这样我们就可以看出来你真的模拟什么。 – damage

+0

@损害:我想在仿真中看到信号和变量之间的差异。 –

+0

是什么让“a”发生了变化? –

回答

1

您没有看到波形的差异,如波形查看器只显示在δ周期(当一些实时传递IE)结束的变量的值。如果单步执行的代码,或添加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; 
0

您在敏感列表中放置信号“a”,然后导致“锁存”。

对于更新y,您应该将“x”放在敏感列表中或将“a”更改为触发信号。

在你的情况,信号和变量是相似的,因为你将它固定为常量。

另外,您应该将信号“a”的行为上传到测试平台。


编辑:我错了,把“x”放在敏感列表中。感谢@damage

+2

记住过程中有一个信号x的分配(第一个例子)。将x放在灵敏度列表中而不做进一步的修改将需要一个x事件(某些赋值给x,不考虑模拟启动时的初始运行)以触发该过程。这可能会导致x有多个驱动程序,一个在进程内,另一个在进程外(用于触发目的)。 – damage

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; 
+0

:非常感谢您的帮助,但我不使用TestBenchm,我在quartus中使用了波形来查看差异,但不清楚;我可以看到使用波形模拟的区别吗? –