我有一个使用行为架构的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
任何帮助将不胜感激
答案 0 :(得分:4)
您的代码不是桶形移位器实现,因为桶移位是多路复用树。
如果您有32位BarrelShifter模块,则需要一个5位Shift
输入,其中每个位i
启用2 ^ i移位操作。
因此例如shift = 5d - &gt; 00101b使得阶段1中的多路复用器能够移位1比特并且使阶段3中的多路复用器移位4比特。所有其他多路复用器阶段都设置为通过(shift(i) = 0
)。
我也不建议将基本换档与换档模式(算术,逻辑,旋转)和方向(左,右)混合。
这里可以找到一个开源实现:
https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_shifter_barrel.vhdl