2015-12-06 113 views
-3

問題是我想使用這個sll命令,但得到這個錯誤(在圖中)。我知道我在使用sll時出現錯誤

bp := bp(0 to 6) & '0'; 

聲明,但我仍然想使用這個sll。誰能幫忙?

錯誤行: 從上次

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 
use ieee.numeric_std; 

entity mul is 
    port(
    a, b : in std_logic_vector(0 to 3); 
    c : out std_logic_vector(0 to 7)); 
end mul; 

architecture mul of mul is 
begin 
    process(a, b) 
    variable bp, p : std_logic_vector(0 to 7); 
    begin 
    bp := "0000"&b; 
    p := "00000000"; 

    for k in 0 to 3 loop 
     if a(k) = '1' then 
     p := p + bp; 
     end if; 
     bp := bp sll 1; 
    end loop; 
    c <= p; 
    end process; 
end mul; 
+1

什麼'圖片'祈禱告訴? – user1155120

+0

您收到的錯誤在這裏沒有證據。如果您有權訪問-2008兼容的VHDL工具,則使用包含IEEE軟件包numeric_std_unsigned的use子句替代包含Synopsys軟件包std_logic_arith和IEEE軟件包numeric_std的使用子句將允許您的代碼進行分析,詳細說明和模擬(不對其準確性進行評論)。包numeric_std_unsigned允許您將std_logic_vector對象視爲未簽名。 – user1155120

+0

[將n位的std \ _logic \ _vector左移或右移]的可能重複(http://stackoverflow.com/questions/9018087/shift-a-std-logic-vector-of-n-bit-to rightright或left) –

回答

1

混合非標準VHDL(新思科技)std_logic_unsigned包和標準的VHDL numeric_std包可能導致不想要的結果5日,所以我的建議是使用只只使用標準的VHDL numeric_std包:

use ieee.numeric_std.all; 

有了這個,那麼你可以這樣做:

if a(k) = '1' then 
    p := std_logic_vector(unsigned(p) + unsigned(bp)); 
end if; 
bp := std_logic_vector(unsigned(bp) sll 1); 

numeric_std包中的"sll"函數然後被用作綴運算符,這是相同的文字:

bp := std_logic_vector("sll"(unsigned(bp), 1)); 

注意,對於1的偏移量,它是相同的寫作:

bp := std_logic_vector(shift_left(unsigned(bp), 1)); 

使用shift_left函數的最後聲明中建議,因爲sll運營商VHDL可能並不總是像「預期」 VHDL-2008前工作(閱讀更多 here),因此使用numeric_std軟件包中的shift_left函數可確保在不同VHDL版本之間的可讀性和預期操作性。

+0

或者使用IEEE package numeric_std_unsigned代替-2008兼容的工具鏈。 – user1155120

+0

@ user1155120:'(std_logic_vector,integer)''''sll'或'shl'未在'numeric_std_unsigned'中定義?只定義了'shl(std_logic_vector,std_logic_vector)'。 –

+1

在-2008中,std_logic_vector是std_ulogic_vector的子類型,std_logic_1164爲[std_ulogic_vector,integer return std_ulogic_vector]聲明瞭sll和srl。 – user1155120

相關問題