VHDL - 连接N次移位操作

时间:2015-04-01 02:31:27

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

我想知道如果我有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? 谢谢你的帮助

2 个答案:

答案 0 :(得分: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 that DATA1 and DATA2`是 std_logic_vector ,因此是强制转换。

答案 1 :(得分:0)

datao <= std_logic_vector(unsigned(data1) sll to_integer(unsigned(data2)));

sll左移逻辑,填充'0'

你也可以使用sla(向左移位算术,用右位填充)而不是sll。

ps:datao&lt; =&#39; 0&#39; &安培; data1(7 downto 1)是一个右移位器,而不是留下:)。 使用srl或sra。