2016-09-16 109 views
-1

我已經在下面的VHDL代碼注意到一個奇怪閂行爲:奇怪行爲閂

process (rd,addr) is     
    begin 
    if (rd) 
    case (addr) is 
    when '00' => dout(15 downto 0) <= in0(15 downto 0); 
    when '01' => dout(7 downto 0) <= in1(7 downto 0); 
    when others => dout <= (others => '0'); 
    end case 
    else 
    dout <= (others => '0'); 
    end if  
end process; 

模擬如下:

RD = '1' 和ADDR = '00 ' - > DOUT [15:0] = IN0 [15:0]

RD = '0' - > DOUT [15:0] = '0000'

RD = '1' 和ADDR =' 01'→dout [7:0] = in1 [7:0]和dout [15:8] = in0 [15:8]

因此,通過保持之前的值爲0 [15:8],似乎dout [15:8]產生一個鎖存器,儘管當rd = 0時我認爲dout [15:8]爲0。

任何想法爲什麼模擬行爲的方式? 謝謝,

吉爾

+0

你的代碼段是無效的VHDL。你還沒有顯示聲明,注意'rd'必須是布爾類型。表達式「00」和「01」作爲選項不是有效的字符串或字符文字。您的if語句缺少一個then語句和case語句都缺少關閉(分隔)分號。 – user1155120

+0

那麼在這種情況下,你不會將任何東西分配給d0的那些位。因此他們必須保持以前的價值。 (馬修泰勒是正確的敏感列表,但這與你問的問題沒有關係) –

+0

我無法複製[奇怪的閂鎖](http://i.stack.imgur.com/2fcw8.png )在你創建一個[最小完整和可驗證的例子](http://stackoverflow.com/help/mcve)後,你的行爲不正確的代碼和敘述。請提供一個MCVE。提供有關VHDL工具及其版本的信息可能也很有用。 – user1155120

回答

1

in0in1從你的敏感列表中丟失。

組合過程中的敏感列表應包含所有輸入。輸入是經過測試的任何信號(在您的示例中爲rdaddr)以及任務右側的任何信號(示例中爲in0in1)。