2

假设我有 2 个 std_logic_vectors:

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

如何使用串联进行inputA移位?inputB

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

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

4

2 回答 2

7

最简单的方法是这样的:

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

(顺便说一句,作为无时钟电路与是否能够使用移位运算符无关。决定它的是数据类型。这种移位操作将由合成器转换为与您编写更多内容时相同的逻辑复杂的 case 语句全部手动展开。)

于 2012-09-16T18:31:20.110 回答
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_vectornum_bits但由于它基本上是一个数字,我总是使用基于数字的类型)

于 2012-09-17T10:15:17.507 回答