如何使用串联通过std_logic_vector移动std_logic_vector

时间:2012-09-16 12:53:35

标签: concatenation vhdl shift

说我有2个std_logic_vectors:

inputA : std_logic_vector(31 downto 0)
inputB:  std_logic_vector(31 downto 0)

如何使用连接将inputA移动inputB

我知道如何向左或向右移动1个地方,但无法弄清楚如何将N个位置向右(或左)移动。 注意:这是一个无时钟电路,不能使用标准的vhdl移位运算符。

除了连接之外的其他技术或想法也将受到赞赏。

2 个答案:

答案 0 :(得分:7)

最简单的方法是做到这样:

library ieee;
use ieee.numeric_std.all;
...
output <= std_logic_vector(unsigned(inputA) srl to_integer(unsigned(inputB)));

(顺便说一下,作为一个无时钟电路与能否使用移位运算符无关。决定数据类型的是什么。这个移位操作将由合成器转换为相同的逻辑,就像你得到的那样写了一些更复杂的案例陈述,全部都是手工扩展的。)

答案 1 :(得分:3)

我更喜欢wjl的方法,但鉴于您专门询问使用串联的方法,请尝试以下方法:

function variable_shift(i : std_logic_vector, num_bits : integer) 
   return std_logic_vector is
   constant zeros : std_logic_vector(num_bits-1 downto 0) := (others => '0');
begin
   return i(i'high-num_bits downto i'low) & zeros;
end function;

(对于std_logic_vector参数可以写第二个num_bits,但由于它基本上是一个数字,我总是使用基于数字的类型)