2015-12-06 92 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

相关问题