aboutsummaryrefslogtreecommitdiff
path: root/store/works/life/computer-organization-experiment/shift_32.vhdl
blob: 5cb842556176bb8b9df26576eeea15b8ad0bee92 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.numeric_std.all;

entity shift_32 is
  port(
    D: in std_logic_vector(31 downto 0);
    SA: in std_logic_vector(4 downto 0);
    Right: in std_logic;
    Arith: in std_logic;
    SH: out std_logic_vector(31 downto 0)
  );
end entity;

architecture behavioral of shift_32 is
begin
  SH <= 
         std_logic_vector(signed(D) srl to_integer(unsigned(SA))) when Right = '1' and Arith = '0'
    else std_logic_vector(signed(D) sll to_integer(unsigned(SA))) when Right = '0' and Arith = '0'
    else std_logic_vector(signed(D) sra to_integer(unsigned(SA)))  when Right = '1' and Arith = '1'
    else std_logic_vector(signed(D) sla to_integer(unsigned(SA))) when Right = '0' and Arith = '1';
end behavioral;