1 | function shift_f
|
2 | (a : in std_logic_vector(31 downto 0);
|
3 | b : in std_logic_vector(31 downto 0);
|
4 | shift_func : in shift_function_type;
|
5 | rt_data : in std_logic_vector(31 downto 0))
|
6 | return std_logic_vector
|
7 |
|
8 | is
|
9 |
|
10 | --barrel shifter unit
|
11 | variable shift1L, shift2L, shift4L, shift8L, shift16 :
|
12 | std_logic_vector(31 downto 0);
|
13 | variable shift1R, shift2R, shift4R, shift8R :
|
14 | std_logic_vector(31 downto 0);
|
15 | variable fills : std_logic_vector(31 downto 16);
|
16 | variable shiftnumber : std_logic_vector(4 downto 0);
|
17 | begin
|
18 |
|
19 | if (shift_func(1) = '1' and rt_data(31) = '1') then
|
20 | fills := "1111111111111111";
|
21 | else
|
22 | fills := "0000000000000000";
|
23 | end if;
|
24 |
|
25 | if shift_func(2) = '0' then
|
26 | shiftnumber := b(10 downto 6);
|
27 | else
|
28 | shiftnumber := a(4 downto 0);
|
29 | end if;
|
30 | --SLL rd<_rt << sa
|
31 | if shift_func (0) = '0' then -- shift left
|
32 | if shiftnumber(0) = '1' then
|
33 | shift1L := rt_data(30 downto 0) & '0';
|
34 | else
|
35 | shift1L := rt_data;
|
36 | end if;
|
37 | if shiftnumber(1) = '1' then
|
38 | shift2L := shift1L(29 downto 0) & "00";
|
39 | else
|
40 | shift2L := shift1L;
|
41 | end if;
|
42 | if shiftnumber(2) = '1' then
|
43 | shift4L := shift2L(27 downto 0) & "0000";
|
44 | else
|
45 | shift4L := shift2L;
|
46 | end if;
|
47 | if shiftnumber(3) = '1' then
|
48 | shift8L := shift4L(23 downto 0) & "00000000";
|
49 | else
|
50 | shift8L := shift4L;
|
51 | end if;
|
52 | if shiftnumber(4) = '1' then
|
53 | shift16 := shift8L(15 downto 0) & X"0000";
|
54 | else
|
55 | shift16 := shift8L;
|
56 | end if;
|
57 |
|
58 | else --shift right
|
59 | if shiftnumber(0) = '1' then
|
60 | shift1R := fills(31) & rt_data(31 downto 1);
|
61 | else
|
62 | shift1R := rt_data;
|
63 | end if;
|
64 | if shiftnumber(1) = '1' then
|
65 | shift2R := fills(31 downto 30) & shift1R(31 downto 2);
|
66 | else
|
67 | shift2R := shift1R;
|
68 | end if;
|
69 | if shiftnumber(2) = '1' then
|
70 | shift4R := fills(31 downto 28) & shift2R(31 downto 4);
|
71 | else
|
72 | shift4R := shift2R;
|
73 | end if;
|
74 | if shiftnumber(3) = '1' then
|
75 | shift8R := fills(31 downto 24) & shift4R(31 downto 8);
|
76 | else
|
77 | shift8R := shift4R;
|
78 | end if;
|
79 | if shiftnumber(4) = '1' then
|
80 | shift16 := fills(31 downto 16) & shift8R(31 downto 16);
|
81 | else
|
82 | shift16 := shift8R;
|
83 | end if;
|
84 | end if;
|
85 | return(shift16);
|
86 |
|
87 | end shift_f;
|