无符号乘法创建一个 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" 算术,所以我不能保证这些班次确实按照您的要求进行。
我正在尝试创建一个移位寄存器,方法是使用乘法 (*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" 算术,所以我不能保证这些班次确实按照您的要求进行。