我有一个使用行为架构的 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)
任何帮助将不胜感激
您的代码不是桶形移位器实现,因为桶形移位是多路复用树。

如果您有一个 32 位 BarrelShifter 模块,您将需要一个 5 位Shift输入,其中每个位位置i启用 2^i 移位操作。
因此,例如 shift = 5d -> 00101b 使第 1 阶段中的多路复用器能够移位 1 位,使第 3 阶段中的多路复用器能够移位 4 位。所有其他多路复用阶段都设置为通过 ( shift(i) = 0)。
我也不建议将基本换档与换档模式(算术、逻辑、旋转)和方向(左、右)混为一谈。
开源实现可以在这里找到:https :
//github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_shifter_barrel.vhdl