OpenCores
URL https://opencores.org/ocsvn/diogenes/diogenes/trunk

Subversion Repositories diogenes

[/] [diogenes/] [tags/] [initial/] [vhdl/] [cpu/] [barrel.vhd] - Blame information for rev 236

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 154 fellnhofer
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer:             david
4
-- 
5
-- Create Date:    09:22:22 11/22/2007 
6
-- Design Name: 
7
-- Module Name:    barrel - Behavioral 
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool versions: 
11
-- Description:    shift a left by signed value b, result is s
12
--
13
-- Dependencies: 
14
--
15
-- Revision: 
16
-- Revision 0.01 - File Created
17
-- Additional Comments: 
18
--
19
----------------------------------------------------------------------------------
20
library IEEE;
21
use IEEE.STD_LOGIC_1164.ALL;
22
use IEEE.STD_LOGIC_ARITH.ALL;
23
use IEEE.STD_LOGIC_UNSIGNED.ALL;
24
 
25
---- Uncomment the following library declaration if instantiating
26
---- any Xilinx primitives in this code.
27
--library UNISIM;
28
--use UNISIM.VComponents.all;
29
 
30
entity barrel is
31
    Port (      --clk: IN std_logic;
32
                                --reset: in std_logic;
33
                                a : in  STD_LOGIC_VECTOR (31 downto 0);
34
                                b : in  STD_LOGIC_VECTOR (5 downto 0);
35
                                s : out  STD_LOGIC_VECTOR (31 downto 0));
36
end barrel;
37
 
38
architecture Behavioral of barrel is
39
 
40
signal l1   : std_logic_vector(31 downto 0);
41
signal l2   : std_logic_vector(31 downto 0);
42
signal lf   : std_logic_vector(31 downto 0);
43
 
44
 
45
signal r1   : std_logic_vector(31 downto 0);
46
signal r2   : std_logic_vector(31 downto 0);
47
signal rf   : std_logic_vector(31 downto 0);
48
 
49
begin
50
        -- shift left
51
        l1 <=   a                                                                                                when b(1 downto 0) = "00" else
52
                                a(30 downto 0)  & "0"                              when b(1 downto 0) = "01" else
53
                                a(29 downto 0)  & "00"                                    when b(1 downto 0) = "10" else
54
                                a(28 downto 0)  & "000";
55
 
56
        l2 <=   l1                                                                                               when b(3 downto 2) = "00" else
57
                                l1(27 downto 0) & "0000"                          when b(3 downto 2) = "01" else
58
                                l1(23 downto 0) & "00000000"                      when b(3 downto 2) = "10" else
59
                                l1(19 downto 0) & "000000000000";
60
 
61
        lf       <=     l2                                                                                               when b(4)                        = '0'  else
62
                                l2(15 downto 0) & "0000000000000000";
63
 
64
 
65
        -- shift right (logical shift) (shift at least 1 bit, 0bits only with shift left);
66
        r1 <=   "0"                                      & a(31 downto 1)         when b(1 downto 0) = "11" else
67
                                "00"                                    & a(31 downto 2)         when b(1 downto 0) = "10" else
68
                                "000"                                   & a(31 downto 3)         when b(1 downto 0) = "01" else
69
                                "0000"                          & a(31 downto 4);
70
 
71
        r2 <=   r1                                                                                               when b(3 downto 2) = "11" else
72
                                "0000"                          & r1(31 downto 4)  when b(3 downto 2) = "10" else
73
                                "00000000"                      & r1(31 downto 8)        when b(3 downto 2) = "01" else
74
                                "000000000000"          & r1(31 downto 12);
75
 
76
        rf       <=     r2                                                                                               when b(4)                        = '1'  else
77
                                "0000000000000000"& r2(31 downto 16);
78
 
79
        --select left or right ?
80
        s <= rf when b(5) = '1' else lf;
81
        --s <= "00000000000000000000000000000000";
82
 
83
 
84
 
85
end Behavioral;
86
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.