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

时间:2016-01-25 17:25:17

标签: vhdl

我尝试创建移位寄存器,使用乘法(* 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);

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

  

表达有30个元素;预计15

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

我错过了什么?我该如何完成它?

提前谢谢

1 个答案:

答案 0 :(得分:3)

由于您使用了乘法,因此字宽会增加。

通常,乘以2个16位无符号数字可以得到32位无符号数。

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

  

表达有16个元素;预计15

但为什么综合工具会烦恼?

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

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

顺便说一句:

  • 使用递增的比特顺序范围对于算术来说是非常规的:我只能说这是好运...
  • 你在同一个过程中对同一个信号有三个任务;只有最后一个才会生效。 (有关信号分配语义的一些信息,请参见Is process in VHDL reentrant?
  • 如果您首先将“sequence”声明为unsigned,则会节省大量不必要的转换,并且流程中的代码会缩减为单个语句,例如

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

我完全不熟悉“错误的回合”算法,所以我不能保证改变实际上是你想要的。