VHDL n位桶形移位器

时间:2014-10-24 15:21:02

标签: 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

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:4)

您的代码不是桶形移位器实现,因为桶移位是多路复用树。 enter image description here

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

因此例如shift = 5d - &gt; 00101b使得阶段1中的多路复用器能够移位1比特并且使阶段3中的多路复用器移位4比特。所有其他多路复用器阶段都设置为通过(shift(i) = 0)。

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

  • 算术和逻辑仅在移入值
  • 中有所不同
  • 右移可以通过转换=&gt;完成。 shiftright = reverse(shiftleft(reverse(input),n)

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