2017-03-06 42 views
1

在VHDL中,有兩種類型的信號分配:併發和有條件的信號分配(VHDL)

concurrent ----> when...else 
      ----> select...when...else 

sequential ----> if...else 
      ----> case...when 

問題是,一些說when...else條件檢查逐行(順序王),而select...when...else條件句被檢查一次。例如,請參閱此reference

我說when..else也是一個順序分配,因爲您正在逐行檢查。換句話說,我認爲沒有必要說if..else在一個過程中相當於when..else。他們爲什麼假設when..else是一個併發任務?

+0

你的問題是什麼? – mkrieger1

+0

爲什麼選擇投票?...我編輯了這個職位 – mahmood

回答

3

你在暗示你的問題的地方與併發分配或順序語句無關。它與if和case之間的區別更多。在我們開始之前,讓我們瞭解一些等價物。併發有條件分配:

Y <= A when ASel = '1' else B when BSel = '1' else C ; 

完全等效於一個過程用下面的代碼:

process(A, ASel, B, BSel, C) 
begin 
    if ASel = '1' then 
    Y <= A ; 
    elsif BSel = '1' then 
    Y <= B ; 
    else 
    Y <= C ; 
    end if ; 
end process ; 

同樣併發選擇的分配:

With MuxSel select 
    Y <= A when "00", B when "01", C when others ; 

是等同於用一個過程以下:

process(MuxSel, A, B , C) 
begin 
    case MuxSel is 
    when "00" => Y <= A; 
    when "01" => Y <= B ; 
    when others => Y <= C ; 
    end case ; 
end process ; 

從編碼的角度來看,上面的順序形式比賦值形式有更多的編碼能力,因爲case和if允許代碼塊,其中賦值形式只賦值給一個信號。但除此之外,它們具有相同的語言限制並生成相同的硬件(與綜合工具相同)。此外,對於許多簡單的硬件問題,賦值表單運行良好,並且簡明地捕獲了問題。

所以,你的想法是否領先,真正歸結爲if和case之間的區別。如果在它們(或暗示)中具有多個「elsif」的語句(及其等價的條件賦值)傾向於創建優先級邏輯或至少級聯邏輯。在情況下(及其等效的選擇分配)傾向於非常適合多路複用器之類的事物,並且它們的邏輯結構往往更多地是平衡的樹結構。

有時候工具會重構一個if語句,使它與case語句等價。對於某些目標(特別是基於LUT的邏輯,如Xilinx和Altera),硬件效率方面的差異直到有足夠的「elsif」分支纔會顯示出來。

在VHDL-2008中,賦值形式也被允許在順序代碼中。除非沒有進程包裝,轉換是相同的。

2

Concurrent vs Sequential是關於執行的獨立性。

併發語句只是一個獨立於其周圍代碼進行評估和/或執行的語句。進程是併發的。組件/實體實例是併發的。在架構中完成的信號分配和過程調用是併發的。

當它周圍的代碼也運行時,順序語句(除了等待)運行。有趣的是,雖然進程是併發的(因爲它獨立於其他進程和併發賦值運行),但它包含順序語句。

通常當我們編寫RTL代碼時,我們編寫的過程很簡單,很難看到它們的順序特性。它確實需要一個狀態機或測試平臺才能看到流程的真實順序特性。

+0

所以請在前面的答案中包含這個答案。現在很清楚 – mahmood