------------------------------------------------------------------------------- -- Title : Barrel Shifter (Pure combinational) -- Project : Barrel Shifter ------------------------------------------------------------------------------- -- File : BarrelShifter.VHD -- Author : Jamil Khatib (khatib@ieee.org) -- Organization: OpenIPCore Project -- Created : 2000/08/2 -- Last update : 2000/08/2 -- Platform : -- Simulators : Modelsim 5.3XE/Windows98 -- Synthesizers: Leonardo/WindowsNT -- Target : -- Dependency : ieee.std_logic_1164 -- utility.tools "private package" ------------------------------------------------------------------------------- -- Description: Barrel Shifter Core (Combinational Shifter) ------------------------------------------------------------------------------- -- Copyright (c) 2000 Jamil Khatib -- -- This VHDL design file is an open design; you can redistribute it and/or -- modify it and/or implement it after contacting the author -- You can check the draft license at -- http://www.opencores.org/OIPC/license.shtml ------------------------------------------------------------------------------- -- Revisions : -- Revision Number : 1 -- Version : 0.1 -- Date : 1st Aug 2000 -- Modifier : Jamil Khatib (khatib@ieee.org) -- Desccription : Created -- ------------------------------------------------------------------------------- -- Revisions : -- Revision Number : 2 -- Version : 0.2 -- Date : 3rd Nov 2000 -- Modifier : Jamil Khatib (khatib@ieee.org) -- Desccription : ShiftSize constant made generic -- ------------------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; library utility; use utility.tools_pkg.all; entity BarrelShifter is generic ( REGSIZE : integer := 16; -- Register Size DIRECTION : integer := 0); -- Shift Direction -- 0 Right 1 Left port ( inReg : in std_logic_vector(REGSIZE -1 downto 0); -- Input register ShSize : in std_logic_vector(log2(REGSIZE) -1 downto 0); -- Shift Size outReg : out std_logic_vector(REGSIZE -1 downto 0)); -- Shifted result end BarrelShifter; ------------------------------------------------------------------------------- architecture behave of BarrelShifter is constant SHIFTSIZE : integer := log2(REGSIZE); -- Shift size begin -- behave ------------------------------------------------------------------------------- SHIFT_RIGHT : if DIRECTION = 0 generate -- purpose: Perform the shifting -- type : combinational -- inputs : inReg, ShSize -- outputs: outReg Shift : process (inReg, Shsize) variable VarReg : std_logic_vector(REGSIZE -1 downto 0); -- Local storage for shifter begin -- process Shift VarReg := inReg; for i in 0 to SHIFTSIZE -2 loop if ShSize(i) = '1' then VarReg(REGSIZE -1 downto 0) := (REGSIZE-1 downto REGSIZE-(2**i) => '0') & VarReg(REGSIZE -1 downto (2**i)); end if; end loop; -- i if ShSize(SHIFTSIZE-1) = '1' then VarReg := (others => '0'); end if; outReg <= VarReg; end process Shift; end generate SHIFT_RIGHT; ------------------------------------------------------------------------------- SHIFT_LEFT : if DIRECTION = 1 generate -- purpose: Perform the shifting -- type : combinational -- inputs : inReg, ShSize -- outputs: outReg Shift : process (inReg, Shsize) variable VarReg : std_logic_vector(REGSIZE -1 downto 0); -- Local storage for shifter begin -- process Shift VarReg := inReg; for i in 0 to SHIFTSIZE -2 loop if ShSize(i) = '1' then VarReg(REGSIZE -1 downto 0) := VarReg( (REGSIZE-(2**i)-1) downto 0) & ((2**i)-1 downto 0 => '0'); end if; end loop; -- i if ShSize(SHIFTSIZE-1) = '1' then VarReg := (others => '0'); end if; outReg <= VarReg; end process Shift; end generate SHIFT_LEFT; ------------------------------------------------------------------------------- end behave;