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

Subversion Repositories mips789

[/] [mips789/] [branches/] [mcupro/] [verilog/] [mips_core/] [shifter.v] - Blame information for rev 51

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 mcupro
//This file is based YACC ->shifter.v 
2
/////////////////////////////////////////////////////////////////////
3
////  Author: Liwei                                              ////
4
////                                                             ////
5
////                                                             ////
6
////  If you encountered any problem, please contact :           ////
7
////  Email: mcupro@yahoo.com.hk or mcupro@opencores.org         ////
8
////                                                             ////
9
////  Downloaded from:                                           ////
10
////     http://www.opencores.org/pdownloads.cgi/list/mips789    ////
11
/////////////////////////////////////////////////////////////////////
12
////                                                             ////
13
//// Copyright (C) 2006-2007 Liwei                               ////
14
////                         mcupro@yahoo.com.hk                 ////
15
////                                                             ////
16
////                                                             ////
17
//// This source file may be used and distributed freely without ////
18
//// restriction provided that this copyright statement is not   ////
19
//// removed from the file and any derivative work contains the  ////
20
//// original copyright notice and the associated disclaimer.    ////
21
////                                                             ////
22
//// Please let the author know if it is used                    ////
23
//// for commercial purpose.                                     ////
24
////                                                             ////
25
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
26
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
27
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
28
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
29
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
30
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
31
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
32
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
33
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
34
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
35
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
36
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
37
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
38
////                                                             ////
39
/////////////////////////////////////////////////////////////////////
40
////                                                             ////
41
////                                                             ////
42
//// Date of Creation: 2007.8.1                                  ////
43
////                                                             ////
44
//// Version: 0.0.1                                              ////
45
////                                                             ////
46
//// Description:                                                ////
47
////                                                             ////
48
////                                                             ////
49
/////////////////////////////////////////////////////////////////////
50
////                                                             ////
51
//// Change log:                                                 ////
52
////                                                             ////
53
/////////////////////////////////////////////////////////////////////
54
 
55
`define ALU_SRL                  1
56
`define ALU_SLL                  2
57
`define ALU_SRA                  4
58
 
59
module
60
    shifter(
61
            input [31:0] a,
62
            output reg [31:0] shift_out,
63
            input [4:0] shift_func,//connect to alu_func_ctl
64
            input [31:0] shift_amount//connect to b
65
        );
66
 
67
    always @ (*)
68
    begin
69
        if( shift_func == `ALU_SLL  )
70
        begin
71
            case ( shift_amount[4:0] )
72
                5'b00000: shift_out=a;
73
                5'b00001: shift_out={a[30:0],1'b0};
74
                5'b00010: shift_out={a[29:0],2'b0};
75
                5'b00011: shift_out={a[28:0],3'b0};
76
                5'b00100: shift_out={a[27:0],4'b0};
77
                5'b00101: shift_out={a[26:0],5'b0};
78
                5'b00110: shift_out={a[25:0],6'b0};
79
                5'b00111: shift_out={a[24:0],7'b0};
80
                5'b01000: shift_out={a[23:0],8'b0};
81
                5'b01001: shift_out={a[22:0],9'b0};
82
                5'b01010: shift_out={a[21:0],10'b0};
83
                5'b01011: shift_out={a[20:0],11'b0};
84
                5'b01100: shift_out={a[19:0],12'b0};
85
                5'b01101: shift_out={a[18:0],13'b0};
86
                5'b01110: shift_out={a[17:0],14'b0};
87
                5'b01111: shift_out={a[16:0],15'b0};
88
                5'b10000: shift_out={a[15:0],16'b0};
89
                5'b10001: shift_out={a[14:0],17'b0};
90
                5'b10010: shift_out={a[13:0],18'b0};
91
                5'b10011: shift_out={a[12:0],19'b0};
92
                5'b10100: shift_out={a[11:0],20'b0};
93
                5'b10101: shift_out={a[10:0],21'b0};
94
                5'b10110: shift_out={a[9:0],22'b0};
95
                5'b10111: shift_out={a[8:0],23'b0};
96
                5'b11000: shift_out={a[7:0],24'b0};
97
                5'b11001: shift_out={a[6:0],25'b0};
98
                5'b11010: shift_out={a[5:0],26'b0};
99
                5'b11011: shift_out={a[4:0],27'b0};
100
                5'b11100: shift_out={a[3:0],28'b0};
101
                5'b11101: shift_out={a[2:0],29'b0};
102
                5'b11110: shift_out={a[1:0],30'b0};
103
                5'b11111: shift_out={a[0],31'b0};
104
                default shift_out ='d0;
105
            endcase
106
        end else if (shift_func== `ALU_SRL) begin
107
            case (shift_amount[4:0])
108
                5'b00000: shift_out=a;
109
                5'b00001: shift_out={1'b0,a[31:1]};
110
                5'b00010: shift_out={2'b0,a[31:2]};
111
                5'b00011: shift_out={3'b0,a[31:3]};
112
                5'b00100: shift_out={4'b0,a[31:4]};
113
                5'b00101: shift_out={5'b0,a[31:5]};
114
                5'b00110: shift_out={6'b0,a[31:6]};
115
                5'b00111: shift_out={7'b0,a[31:7]};
116
                5'b01000: shift_out={8'b0,a[31:8]};
117
                5'b01001: shift_out={9'b0,a[31:9]};
118
                5'b01010: shift_out={10'b0,a[31:10]};
119
                5'b01011: shift_out={11'b0,a[31:11]};
120
                5'b01100: shift_out={12'b0,a[31:12]};
121
                5'b01101: shift_out={13'b0,a[31:13]};
122
                5'b01110: shift_out={14'b0,a[31:14]};
123
                5'b01111: shift_out={15'b0,a[31:15]};
124
                5'b10000: shift_out={16'b0,a[31:16]};
125
                5'b10001: shift_out={17'b0,a[31:17]};
126
                5'b10010: shift_out={18'b0,a[31:18]};
127
                5'b10011: shift_out={19'b0,a[31:19]};
128
                5'b10100: shift_out={20'b0,a[31:20]};
129
                5'b10101: shift_out={21'b0,a[31:21]};
130
                5'b10110: shift_out={22'b0,a[31:22]};
131
                5'b10111: shift_out={23'b0,a[31:23]};
132
                5'b11000: shift_out={24'b0,a[31:24]};
133
                5'b11001: shift_out={25'b0,a[31:25]};
134
                5'b11010: shift_out={26'b0,a[31:26]};
135
                5'b11011: shift_out={27'b0,a[31:27]};
136
                5'b11100: shift_out={28'b0,a[31:28]};
137
                5'b11101: shift_out={29'b0,a[31:29]};
138
                5'b11110: shift_out={30'b0,a[31:30]};
139
                5'b11111: shift_out={31'b0,a[31:31]};
140
                default : shift_out = 0;
141
            endcase
142
        end else
143
            if (shift_func==`ALU_SRA)
144
            begin// SHIFT_RIGHT_SIGNED
145
                case ( shift_amount[4:0])
146
                    5'b00000: shift_out=a;
147
                    5'b00001: shift_out={a[31],a[31:1]};
148
                    5'b00010: shift_out={{2{a[31]}},a[31:2]};
149
                    5'b00011: shift_out={{3{a[31]}},a[31:3]};
150
                    5'b00100: shift_out={{4{a[31]}},a[31:4]};
151
                    5'b00101: shift_out={{5{a[31]}},a[31:5]};
152
                    5'b00110: shift_out={{6{a[31]}},a[31:6]};
153
                    5'b00111: shift_out={{7{a[31]}},a[31:7]};
154
                    5'b01000: shift_out={{8{a[31]}},a[31:8]};
155
                    5'b01001: shift_out={{9{a[31]}},a[31:9]};
156
                    5'b01010: shift_out={{10{a[31]}},a[31:10]};
157
                    5'b01011: shift_out={{11{a[31]}},a[31:11]};
158
                    5'b01100: shift_out={{12{a[31]}},a[31:12]};
159
                    5'b01101: shift_out={{13{a[31]}},a[31:13]};
160
                    5'b01110: shift_out={{14{a[31]}},a[31:14]};
161
                    5'b01111: shift_out={{15{a[31]}},a[31:15]};
162
                    5'b10000: shift_out={{16{a[31]}},a[31:16]};
163
                    5'b10001: shift_out={{17{a[31]}},a[31:17]};
164
                    5'b10010: shift_out={{18{a[31]}},a[31:18]};
165
                    5'b10011: shift_out={{19{a[31]}},a[31:19]};
166
                    5'b10100: shift_out={{20{a[31]}},a[31:20]};
167
                    5'b10101: shift_out={{21{a[31]}},a[31:21]};
168
                    5'b10110: shift_out={{22{a[31]}},a[31:22]};
169
                    5'b10111: shift_out={{23{a[31]}},a[31:23]};
170
                    5'b11000: shift_out={{24{a[31]}},a[31:24]};
171
                    5'b11001: shift_out={{25{a[31]}},a[31:25]};
172
                    5'b11010: shift_out={{26{a[31]}},a[31:26]};
173
                    5'b11011: shift_out={{27{a[31]}},a[31:27]};
174
                    5'b11100: shift_out={{28{a[31]}},a[31:28]};
175
                    5'b11101: shift_out={{29{a[31]}},a[31:29]};
176
                    5'b11110: shift_out={{30{a[31]}},a[31:30]};
177
                    5'b11111: shift_out={{31{a[31]}},a[31:31]};
178
                    default shift_out='d0;
179
                endcase
180
            end
181
            else                         shift_out='d0;
182
    end
183
endmodule

powered by: WebSVN 2.1.0

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