【问题标题】:VHDL - Shift operation of N times with concatenationVHDL - N 次移位操作并连接
【发布时间】:2015-04-01 02:31:27
【问题描述】:

如果我有 2 个输入,一个输入,DATA1 是一个数字(std_logic_vector),我想知道如何在 VHDL 中进行移位操作,第二个输入 DATA2 表示我想要移位第一个的次数输入。 例如,如果我必须总是左移一次,代码是

OUTALU <= '0' & DATA1(N-1 downto 1);

如果我想将 DATA2 次移动,这样写对吗:

for i in 0 to DATA2 loop
  OUTALU <= '0' & DATA1(N-1 downto 1);
  DATA1 <= OUTALU
end loop;

对吗? 我必须定义信号并分配给这些信号 DATA1 和 DATA2? 谢谢你的帮助

【问题讨论】:

标签: algorithm bit-manipulation concatenation vhdl bit-shift


【解决方案1】:

您所寻求的是桶形移位器。你可以这样做:

OUTALU <= std_logic_vector(shift_left(unsigned(DATA1),  to_integer(unsigned(DATA2)))); -- Shift left
OUTALU <= std_logic_vector(shift_left(unsigned(DATA1),  to_integer(unsigned(DATA2)))); -- Shift right
OUTALU <= std_logic_vector(shift_left(  signed(DATA1),  to_integer(unsigned(DATA2)))); -- Arithmetic shift left
OUTALU <= std_logic_vector(shift_left(  signed(DATA1),  to_integer(unsigned(DATA2)))); -- Arithmetic shift right

这意味着您使用 ieee.numeric_std.all' and thatDATA1andDATA2` 是 std_logic_vector,因此是演员表。

【讨论】:

  • shift_left 已经实现功能了吗?是逻辑移位还是算术移位?
  • 在 numeric_std 中实现。如果输入为unsigned,则为逻辑移位。另一方面,当输入输出为signed时,它执行算术移位。
【解决方案2】:
datao <= std_logic_vector(unsigned(data1) sll to_integer(unsigned(data2)));

sll 是逻辑左移,用‘0’填充

您也可以使用 sla(左移算术,用右位填充)代替 sll。

ps: datao

【讨论】:

  • 不鼓励使用 sll、sla 和 cie,而应使用 shift_left/shift_right。运算符未正确定义,可能导致意外行为,例如 sla 会将符号位复制到 lsb!
猜你喜欢
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
相关资源
最近更新 更多