无符号乘法创建一个 x2 大小的数组

Unsigned multiplication creates a x2 sized array

我正在尝试创建一个移位寄存器,方法是使用乘法 (*2) 将位移位一个位置。

但是,当我这样做时,ISE (Xilinx IDE) 告诉我这个表达式的元素数量是原始信号的 x2。

具体来说,我已经:

if rising_edge(clk) then

  registro <= unsigned(sequence);

  registro <= registro * 2;

  -- Just adds into the last position the new bit, Sin (signal input)
  registro <= registro or (Sin, others => '0');

  sequence <= std_logic_vector(registro);

end if;

之前,我声明过:

signal Sin : std_logic;

signal sequence : std_logic_vector(0 to 14) := "100101010000000";
signal registro : unsigned (0 to 14);

所以我得到了错误(在乘法线):

Expression has 30 elements ; expected 15

那么,如果我只乘以 *2,为什么它会创建一个 x2 大小的向量?

我错过了什么?我怎样才能完成它?

提前致谢

字宽变大了,因为你用了乘法。

通常,将 2 个 16 位无符号数相乘得到 32 位无符号数。

现在可以优化乘以常数 2 的特定情况,并让合成做正确的事情。在这种情况下,错误消息将更改为

Expression has 16 elements ; expected 15

但是综合工具为什么要麻烦?

改用左移,使用左(右?)移运算符,或显式切片和连接,例如:

registro <= registro(1 to registro'length-1) & '0';

顺便提一句:

  • 使用升序位顺序范围对于算术来说是非常不寻常的:我只能说祝你好运......
  • 您在同一个进程中对同一个信号进行了三个分配;只有最后一个会生效。 (有关信号分配语义的一些信息,请参阅 Is process in VHDL reentrant?
  • 如果您一开始就将 "sequence" 声明为无符号的,那么您将节省大量不必要的转换,并且流程中的代码将减少为单个语句,例如

sequence <= ('0' & sequence(0 to sequence'length-2)) or (0 => Sin, others => '0') when rising_edge(clk);

我完全不熟悉 "wrong way round" 算术,所以我不能保证这些班次确实按照您的要求进行。