Vhdl I';我在使用sll时出错

Vhdl I';我在使用sll时出错,vhdl,Vhdl,问题是我想使用这个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_ve

问题是我想使用这个
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;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.std_logic_unsigned.all;
使用ieee.numeric_标准;
实体mul是
港口(
a、 b:标准逻辑向量(0到3);
c:输出标准逻辑向量(0到7);
末端mul;
mul的架构mul是
开始
过程(a、b)
变量bp,p:std_逻辑_向量(0到7);
开始
bp:=“0000”和b;
p:=“00000000”;
对于0到3循环中的k
如果a(k)=‘1’,则
p:=p+bp;
如果结束;
bp:=bp sll 1;
端环;

c混合使用非标准VHDL(Synopsys)
std_logic_unsigned
包和标准VHDL
numeric_std
包可能会导致不期望的结果,因此我的建议是仅使用标准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\u std
软件包的
“sll”
函数被用作中缀运算符,这与写入相同:

bp := std_logic_vector("sll"(unsigned(bp), 1));
bp := std_logic_vector(shift_left(unsigned(bp), 1));
请注意,对于移位量1,其与写入相同:

bp := std_logic_vector("sll"(unsigned(bp), 1));
bp := std_logic_vector(shift_left(unsigned(bp), 1));
建议使用
shift_left
函数的最后一条语句,因为VHDL中的
sll
运算符在VHDL-2008之前可能并不总是按“预期”工作(请参阅更多信息
)因此,使用
numeric\u std
软件包中的
shift\u left
功能可确保不同VHDL版本之间的可读性和预期操作。

请告诉我什么“pic”?您收到的错误在这里并不明显。如果您可以访问符合-2008标准的VHDL工具,将包含IEEE package numeric_std_unsigned的use子句替换为包含Synopsys package std_logic_arith和IEEE package numeric_std的use子句将允许您的代码进行分析、详细说明和模拟(而不评论其准确性)。Package numeric_std_unsigned允许您将std_logic_矢量对象视为未签名对象。对于符合-2008标准的工具链,可能重复或使用IEEE Package numeric_std_unsigned。@user1155120:为什么
sll
shl
numeric_std_unsigned
中未定义
(std_逻辑_向量,整数)
?仅定义了shl(std_逻辑_向量,std_逻辑_向量)
。在-2008年,std_逻辑_向量是std_逻辑_向量的子类型,std_逻辑_1164为[std_逻辑_向量,整数返回std_逻辑_向量]声明sll和srl。