VHDL n 位桶形移位器

fai*_*ali 3 vhdl modelsim

我有一个使用行为架构的 32 位桶形移位器。现在我需要将其转换为 n 位移位器。我面临的问题是 for 循环存在某种限制,我必须将常量作为标记值。

以下是我的代码

library IEEE;
use IEEE.std_logic_1164.all;

Entity bshift is   -- barrel shifter
      port (left    : in  std_logic; -- '1' for left, '0' for right
            logical : in  std_logic; -- '1' for logical, '0' for arithmetic
            shift   : in  std_logic_vector(4 downto 0);  -- shift count
            input   : in  std_logic_vector (31 downto 0);
            output  : out std_logic_vector (31 downto 0) );
end entity bshift;


architecture behavior of bshift is
  function to_integer(sig : std_logic_vector) return integer is
    variable num : integer := 0;  -- descending sig as integer
  begin
    for i in sig'range loop
      if sig(i)='1' then
        num := num*2+1;
      else
        num := num*2;
      end if;
    end loop;  -- i
    return num;
  end function to_integer;

begin  -- behavior
  shft32: process(left, logical, input, shift)
            variable shft : integer;
            variable out_right_arithmetic : std_logic_vector(31 downto 0);
            variable out_right_logical    : std_logic_vector(31 downto 0);
            variable out_left_logical     : std_logic_vector(31 downto 0);
          begin
            shft := to_integer(shift);
            if logical = '0' then
              out_right_arithmetic := (31 downto 32-shft => input(31)) &
                                      input(31 downto shft);
              output <= out_right_arithmetic after 250 ps;
            else
              if left = '1' then
                out_left_logical := input(31-shft downto 0) &
                                    (shft-1 downto 0 => '0');
                output <= out_left_logical after 250 ps;
              else
                out_right_logical := (31 downto 32-shft => '0') &
                                     input(31 downto shft);
                output <= out_right_logical after 250 ps;
              end if;
            end if;
          end process shft32;
end architecture behavior;  -- of bshift
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激

Pae*_*els 5

您的代码不是桶形移位器实现,因为桶形移位是多路复用树。 在此处输入图片说明

如果您有一个 32 位 BarrelShifter 模块,您将需要一个 5 位Shift输入,其中每个位位置i启用 2^i 移位操作。

因此,例如 shift = 5d -> 00101b 使第 1 阶段中的多路复用器能够移位 1 位,使第 3 阶段中的多路复用器能够移位 4 位。所有其他多路复用阶段都设置为通过 ( shift(i) = 0)。

我也不建议将基本换档与换档模式(算术、逻辑、旋转)和方向(左、右)混为一谈。

  • 算术和逻辑仅在移入值上不同
  • 右移可以通过转换来完成 => shiftright = reverse(shiftleft(reverse(input), n)

开源实现可以在这里找到:https :
//github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_shifter_barrel.vhdl