diff options
Diffstat (limited to 'testsuite/synth/issue1023/barrel_shifter.vhdl')
-rw-r--r-- | testsuite/synth/issue1023/barrel_shifter.vhdl | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/testsuite/synth/issue1023/barrel_shifter.vhdl b/testsuite/synth/issue1023/barrel_shifter.vhdl new file mode 100644 index 000000000..585c8afd7 --- /dev/null +++ b/testsuite/synth/issue1023/barrel_shifter.vhdl @@ -0,0 +1,42 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use ieee.math_real.all; + +------------------------------------------------------------------------------- + +entity barrel_shifter is + + generic ( + NBITS : positive := 8); + + port ( + din, d : in std_logic_vector(NBITS-1 downto 0); -- data in, shift distance + dout : out std_logic_vector(NBITS-1 downto 0)); -- data out + +end entity barrel_shifter; + +------------------------------------------------------------------------------- + +architecture dfl of barrel_shifter is + -- TODO: Calculate the number of required shift stages as a constant. + constant nshift : natural := natural(log2(real(NBITS))); + + -- custom vector for the shift stages + type my_vec is array(0 to nshift) of std_logic_vector(NBITS-1 downto 0); + signal vector : my_vec; + -- vector of zeros + constant ZEROS : std_logic_vector(NBITS-1 downto 0) := (others => '0'); + +begin -- architecture dfl + vector(0) <= din; + + gen: for i in 0 to nshift-1 generate + vector(i+1) <= (vector(i)(NBITS-1-2**i downto 0) + & ZEROS(2**i-1 downto 0)) + when d(i) = '1' + else vector(i); + end generate gen; + dout <= vector(nshift); + +end architecture dfl; |