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

Subversion Repositories cpu16

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 yzoer
module alu (
2
        a,
3
        b,
4
        c_in,
5
        func,
6
        result,
7
        n,
8
        v,
9
        z,
10
        c
11
        );
12
 
13
        input [15:0] a,b;
14
        input c_in;
15
        input [2:0] func;
16
        output [15:0] result;
17
        output n,v,z,c;
18
 
19
        reg [15:0] addsub_result;
20
        reg addsub_c;
21
        reg addsub_v;
22
        always @(*)
23
                if ( func[1])
24
                        { addsub_c, addsub_result } = a + b + (c_in&func[0]);
25
                else
26
                        { addsub_c, addsub_result } = a - b - (c_in&func[0]);
27
 
28
        // overflow calculation
29
        always @(*)
30
                addsub_v = a[15] ^ b[15] ^ addsub_c ^ addsub_result[15];
31
 
32
        reg [15:0] logic_result;
33
        always @(*)
34
                case (func[1:0])
35
                        2'd0 : logic_result = a;                // maps to subtract
36
                        2'd1 : logic_result = a&b;
37
                        2'd2 : logic_result = a|b;
38
                        2'd3 : logic_result = a^b;
39
                endcase
40
 
41
        reg [15:0] result;
42
        always @(*)
43
                if ( func[2])
44
                        result = logic_result;
45
                else
46
                        result = addsub_result;
47
 
48
        reg n,v,z,c;
49
        always @(*)
50
                casex (func)
51
                        3'b0xx, // sub/sbc/add/adc
52
                        3'b100 : begin  // cmp
53
                                n = addsub_result[15];
54
                                v = addsub_v;
55
                                z = ~|addsub_result;
56
                                c = addsub_c;
57
                                end
58
                        default : begin
59
                                n = logic_result[15];
60
                                v = 1'b0;
61
                                z = ~|logic_result;
62
                                c = 1'b0;
63
                                end
64
                endcase
65
 
66
endmodule
67
 
68
 

powered by: WebSVN 2.1.0

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