2013-05-16 94 views
3

我是VHDL的初學者,我有一個基本問題。VHDL /如何初始化我的信號?

讓我們考慮這個下面輸入:

A : in std_logic_vector(22 downto 0); 

而這個信號:

signal dummyA : std_logic_vector(47 downto 0); 

我想用一個如此我做了什麼來初始化dummyA是:

dummyA <= A; 

這是正確嗎?我的意思是相當於:

dummyA <= "0000000000000000000000000" & A;?或者我應該像這樣明確地添加0。

回答

6

您不能使用dummyA <= A;,因爲存在類型不匹配,並且任何良好的VHDL編譯器都會拒絕它。

您可以使用這樣的

dummyA <= (A'RANGE => A, OTHERS => '0'); 

或(在順序方面只)

dummyA <= (OTHERS => '0'); 
dummyA(A'RANGE) <= A; 

FOR i IN dummyA'RANGE LOOP 
    IF i >= A'LOW AND i <= A'HIGH THEN 
     dummyA(i) <= A(i); 
    ELSE 
     dummyA(i) <= '0'; 
    END IF; 
END LOOP; 

在併發環境下,你可以使用

FOR i IN dummyA'RANGE GENERATE 
    IF i >= A'LOW AND i <= A'HIGH GENERATE 
     dummyA(i) <= A(i); 
    END GENERATE; 
    -- ELSE 
    IF i < A'LOW OR i > A'HIGH GENERATE 
     dummyA(i) <= '0'; 
    END GENERATE; 
END GENERATE; 

以上所有保證dummyA(i)裝有A(i)。但"00000" & A可能會導致配對錯誤,如果他們的範圍不同意低端。

+0

是'dummyA <=(A'RANGE => A,OTHERS =>'0');'相當於'dummyA <=「0000000000000000000000000」& A;'? – user2336315

+0

@ user2336315:它應該是,但是你不必跟蹤多少個額外的零。 –

+0

如果A的範圍優於dummyA的範圍,它是否會截斷A的數據? – user2336315

0

ieee.numeric_std使用標準的功能,你可以做以下的零墊的MSB:

dummyA <= std_logic_vector(resize(unsigned(A), dummyA'length)); 

雖然你沒有問這個,一方面也可以登錄擴展這樣的:

dummyA <= std_logic_vector(resize(signed(A), dummyA'length)); 

雖然我認爲在這種情況下用戶應該使用A和dummyA的簽名數據類型,如果他們給他們算術解釋

+1

@downvoter ......謹慎地闡述爲什麼? –