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

Subversion Repositories cpu16

[/] [cpu16/] [trunk/] [shifter.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 yzoer
module shifter (
2
        a,
3
        b,
4
        n_in,
5
        v_in,
6
        z_in,
7
        c_in,
8
        distance,
9
        func,
10
        result,
11
        n,
12
        v,
13
        z,
14
        c
15
        );
16
 
17
        input signed [15:0] a,b;
18
        input n_in;
19
        input v_in;
20
        input z_in;
21
        input c_in;
22
        input [3:0] distance;
23
        input [1:0] func;
24
        output [15:0] result;
25
        output n,v,z,c;
26
 
27
        // hack / workaround to make sure carry / msb gets propagated correctly
28
        wire signed [16:0] x = { a, c_in };
29
 
30
        reg [15:0] result;
31
        reg result_c;
32
        always @(*)
33
                case(func)
34
                        2'd0 : { result_c, result } = { c_in, b };      // mov / lui
35
                        2'd1 : { result, result_c } = x >>> distance;   // sra
36
                        default : { result_c, result } = { c_in, a } << distance;       // sll
37
                endcase
38
 
39
        // flags
40
        reg n,v,z,c;
41
        always @(*)
42
                begin
43
                        if ( func )
44
                                begin   // shifts update accordingly
45
                                        n = result[15];
46
                                        z = ~|result;
47
                                        c = result_c;
48
                                        v = a[15] ^ result[15];
49
                                end
50
                        else    // mov / lui don't change flags as they're frequently used to create literals / masks / addresses
51
                                begin
52
                                        n = n_in;
53
                                        v = v_in;
54
                                        z = z_in;
55
                                        c = c_in;
56
                                end
57
                end
58
 
59
endmodule

powered by: WebSVN 2.1.0

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