2012-10-10 326 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中使用了波形來查看差異,但不清楚;我可以看到使用波形模擬的區別嗎? –