2014-12-05 85 views
3

我知道如何使用VHDL中的變量以及我可以用它做什麼,但是我不知道它在硬件中究竟是什麼?VHDL中的變量究竟是什麼?

硬件中的信號和變量以及變量存儲的值在哪裏有什麼區別? 它是一根線還是取決於我的代碼?

據「QuantumRipple」註釋I延伸這樣的問題:

我合成了ISE(Xilinx的綜合工具)和變量(VAR)下面簡單的代碼合成爲d觸發器??

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 

ENTITY test IS 
    port(
     clk : in std_logic; 
     input : in std_logic; 
     output : out std_logic 
    ); 
END test; 

ARCHITECTURE Behavioral OF test IS 
BEGIN 
    PROCESS(clk) 
     VARIABLE var : std_logic; 
    BEGIN 
     IF clk'event AND clk = '1' THEN 
      var := input; 
     END IF; 
     output <= var; 
    END PROCESS; 
END Behavioral; 

感謝意見和答案...

+1

當描述同步邏輯時,大多數信號往往來自FF的輸出。變量可以被認爲是來自組合邏輯的抽頭,這些組合邏輯輸入到這些FF的輸入中。分配給一個變量增加了組合邏輯的另一個階段以及變量名指向的網表中的節點被移動。 – 2014-12-05 14:43:24

+0

好的,但有時變量實現,如D觸發器,我們沒有任何組合元素。你能給我一個一般的答案嗎? – Amir 2014-12-05 15:12:57

回答

1

變量可以在幾個功能不同的方式使用。結果,合成器可以以幾種方式實現它們。

以下適用於計時進程:

如果獨立地設置變量在一個過程中,你讀它之前,它會純粹合成爲[一組]的LUT。 (複雜的邏輯函數或矢量變量即使對於單個賦值也需要多個LUT)

如果多次更新變量並在更新之間讀取它,它將合成多個[LUT組]。這種情況與爲每個更新創建一個不同的命名變量沒有區別。

如果在過程中設置該變量之前讀取該變量的值,並在所有讀取之後將其賦值,則它將合成一個觸發器。這種配置中的變量的行爲等同於信號。

如果在獨立設置變量之前根據自身和另一個值的組合設置變量,它將合成一個(未命名的)觸發器和一組掛起的LUT。

這些也可以在一定程度上組合。例如,如果您在進程開始時讀取一個變量並在最後分配變量,但在中間更新並讀取該變量,則會生成一個觸發器,其輸出用於第一次讀取,還有一些LUT的輸出用於第二次讀取。

沒有中間讀取的多個分配也被摺疊成一組LUT(沒有中間值的抽頭)。


瞭解VHDL是如何合成的另一個重要的事情是信號和變量並不真正轉化爲特定的東西。信號指的是設計中的特定導線(而不是諸如LUT和觸發器之間的東西)。在時鐘控制的進程中分配的信號通常指的是來自某個觸發器的Dout線,並且在組合進程或併發語句中分配的信號通常指的是從LUT出來的線,儘管它可能指的是相同的如果分配中沒有邏輯(簡單的a <= b),則將其作爲另一個信號(包括時鐘信號!)。

賦值語句描述了導線之間的關係。

變量不是指固定線,而只是描述行爲。 在再次賦值之前用於分配別的東西的每個變量賦值會創建對不同導線的引用(儘管這些導線通常不會像信號線那樣明確命名 - 這就是變量的要點)。

合成器採取了這種行爲,並試圖確定需要哪些LUT和觸發器才能使硬件達到此目的。請注意,儘管信號指的是一些固定線,但它們並不涉及全部線。合成器創建許多未命名(合成器生成任意名稱)連線,以在每個明確命名的連線之間連接生成的組件(LUT和觸發器)。這是因爲變量在描述(非固定線)時非常靈活,以至於它們可能會導致生成如此多種不同的基本組件,具體取決於它們的使用方式。


針對您的特殊代碼,是的,可變var將導致合成一個觸發器。

如果'var'是一個信號並且output <= var;分配超出了過程,它也會做同樣的事情。

在您的代碼中,var基於唯一賦值來設置,指的是Din爲input的時鐘元件(觸發器)的Dout導線,則輸出被指定爲指向與var相同的導線。

事實上,它完全一樣的東西只是做

IF clk'event and clk = '1' THEN 
     output <= input; 
    END IF; 

在這種情況下,輸出只是直接分配給指具有的input嘈雜的時鐘元素的DOUT的電線代替使用var作爲代理。

+0

非常感謝Quantum。在一個鐘控過程中,首先我使用輸入參數設置變量,並在過程結束時將相同的變量放入輸出參數中,然後將其合成爲D觸發器。你同意嗎? – Amir 2014-12-05 16:18:01

+0

我將不得不看代碼說肯定。如果始終從相同的輸入設置並始終分配給相同的輸出,則實際上將完全優化。如果它從幾個輸入中選擇一個,它將變成一個MUX(通常由LUT構成)。如果您在過程的前面總是設置變量(只要該變量不取決於變量的前一個值),那麼它就不會成爲觸發器。 – QuantumRipple 2014-12-05 16:23:13

+0

感謝「QuantumRipple」,你幫了我很多... – Amir 2014-12-05 19:28:27