2016-03-08 55 views
3

我在想,如何按照VHDL處理進程內同一信號的順序分配。如何對進程中的信號進行順序分配如何運行

我見過類似下面的代碼:

ENTITY some_entity IS 
    ... 
    ... 
END some_entity; 

ARCHITECTURE Behavioral OF some_entity IS 
    SIGNAL some_signal : STD_LOGIC_VECTOR(1 DOWNTO 0); 
BEGIN PROCESS (clk) 
    ... 
    ... 
    IF condition1 THEN 
     some_signal <= "01"; 
    ELSE 
     some_signal <= (others => '0'); 
    END IF; 

    IF condition2 THEN 
     some_signal <= "10"; 
    ELSE 
     some_signal <= (others => '0'); 
    END IF; 

    IF condition3 THEN 
     some_signal <= "11"; 
    ELSE 
     some_signal <= (others => '0'); 
    END IF; 
    ... 
    ... 
END PROCESS; 
... 
... 
END Behavioral; 

起初我以爲,這並沒有什麼意義,因爲some_signal是在同一時間分配多個值。 Vivado是無投訴,雖然它的合成和有關進程的一個小小的研究之後,我想這可能實際行爲等同於以下:

ENTITY some_entity IS 
    ... 
    ... 
END some_entity; 

ARCHITECTURE Behavioral OF some_entity IS 
    SIGNAL some_signal : STD_LOGIC_VECTOR(1 DOWNTO 0); 
BEGIN PROCESS (clk) 
    ... 
    ... 
    IF condition3 THEN 
     some_signal <= "11"; 
    ELSIF condition 2 THEN 
     some_signal <= "10"; 
    ELSIF condition1 THEN 
     some_signal <= "01"; 
    ELSE 
     some_signal <= (others => '0'); 
    END IF; 
    ... 
    ... 
END PROCESS; 
... 
... 
END Behavioral; 

是這個概念是否正確?如果不是,第一個代碼示例實際上做了什麼?

+1

「最後分配勝」 ......扭轉像你一樣的條件是正確的......然而作爲最後'if'語句具有雙臂的分配,它會覆蓋前面的語句:你永遠不會看到它們的執行。輸出只能是「11」或「00」。關鍵術語理解:增量循環,推遲分配。 –

+1

@BrianDrummond:謝謝,那正是我想知道的。如果壓倒前面的ifs,我沒有想過最後一次,但考慮一下,這很明顯。你爲什麼不發表這個評論作爲答案? – FSMaxB

回答

2

「最後分配勝」 ......扭轉了條件,你做是正確的......不過好像語句雙臂的分配,它會覆蓋先前的發言最後:你永遠不會看到它們的執行(除非它不會作爲一些其他條件的結果執行)

輸出將只是"11""00"

要了解的關鍵術語:增量循環,推遲賦值。

你可能會發現我的standard answer到類似的問題有用的背景。理解信號是什麼是非常關鍵的 - 它們是VHDL如何解決進程間通信的問題。

+0

在問這個問題之前,我實際上讀過「標準答案」,但沒有說明在一個過程的一次運行過程中信號的分配可以被覆蓋。再次感謝這個答案。 – FSMaxB

+0

對於被稱爲*投射輸出波形*的過程中分配的每個信號,都有一個預定值隊列。它在任何特定的模擬時間內只保留一個條目。計劃值的分配會取代特定時間或更早時間的投影值(如果存在)。參見IEEE Std 1076-2008 10.5.2.2爲深入描述執行一個簡單的賦值語句。 – user1155120

相關問題