2015-08-20 34 views
0

我試圖在VHDL中實現某些功能。代碼1給出了錯誤的輸出,我不明白爲什麼。如果VHDL程序中的塊無法正常工作,值賦值

process(Data_in, reset) 
begin 
    if(reset = '1') then 
    sig_sel <= "00"; 
    elsif(reset = '0') then 
    if(Data_in(0) = '1') then 
     sig_sel <= "11"; 
     report "sig_sel a is: " & STD_LOGIC'image(sig_sel(0)); 
     report "sig_sel b is: " & STD_LOGIC'image(sig_sel(1)); 
     if(sig_sel = "11") then 
     report "i am one and one"; 
     end if; 
    end if; 
    end if; 
end process; 

注:sig_sel一個是: '0'
注:sig_sel b爲: '0'

但如果我刪除或復位後發表評論if語句(如下 - 代碼2)它的工作原理!

process(Data_in, reset) 
begin 
    if(reset = '1') then 
    sig_sel <= "00"; 
    elsif(reset = '0') then 
    --if(Data_in(0) = '1') then 
     sig_sel <= "11"; 
     report "sig_sel a is: " & STD_LOGIC'image(sig_sel(0)); 
     report "sig_sel b is: " & STD_LOGIC'image(sig_sel(1)); 
     if(sig_sel = "11") then 
     report "i am one and one"; 
     end if; 
    --end if; 
    end if; 
end process; 

注:sig_sel一個是: '1'
注:sig_sel b爲: '1'

這奇怪的是我,因爲我需要做一對夫婦檢查的前賦值sig_sel值。什麼可能是錯的?

+0

這是一個模擬或合成問題? – Paebbels

+0

如果(復位='1'),那麼... elsif(復位='0')then'行對於合成代碼是重複的;第二部分只需要說'else'。 –

+0

謝謝,但不是主要問題:) –

回答

0

在VHDL中,當進程結束(或遇到等待語句)時,對信號的賦值生效。

因此,

sig_sel <= "11"; 
if sig_sel = "11" then 

將觸發如果只有當sig_sel所以進入處理時是"11",不是每次你可以從計算機編程的角度來看期待。

它爲code2工作的原因(我只能猜測,因爲你不給所有相關的數據)是代碼被執行兩次。第一次當reset被取消斷言(設置sig_sel"11"),並且第二次當Data_in(0)被分配給'1'(觸發if)。我希望你雖然得到以下輸出:

注:sig_sel一個是: '0'
注:sig_sel b爲: '0'
注:sig_sel一個是: '1'
注意:sig_sel b是:'1'
注意:我是一個和一個

+0

謝謝@Jonathan你的觀察是相當真實的。任何有關如何實現預期邏輯的建議(代碼1)? –

+0

我不確定你想要的邏輯的目的是什麼,如果你在比較它的值之前設置了一個信號,比較是無用的。無論如何,你可以使用變量而不是信號,但我建議VHDL的新手只使用信號。信號行爲就像現實生活中的線一樣。使用它們可能需要時間,但這是樂趣的一部分! –