我尝试创建移位寄存器,使用乘法(* 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?
我错过了什么?我该如何完成它?
提前谢谢
答案 0 :(得分:3)
由于您使用了乘法,因此字宽会增加。
通常,乘以2个16位无符号数字可以得到32位无符号数。
现在可以通过常数2来优化乘法的特定情况,并使合成做正确的事情。在这种情况下,错误消息将更改为
表达有16个元素;预计15
但为什么综合工具会烦恼?
使用左移,使用左(右?)移位运算符,或显式切片和连接,例如:
registro <= registro(1 to registro'length-1) & '0';
顺便说一句:
sequence <= ('0' & sequence(0 to sequence'length-2)) or
(0 => Sin, others => '0') when rising_edge(clk);
我完全不熟悉“错误的回合”算法,所以我不能保证改变实际上是你想要的。