added comments to ship files
[fleet.git] / ships / Alu1.ship
1 ship: Alu1
2
3 == Ports ===========================================================
4 data  in:   in
5 data  in:   inOp
6
7 data  out:  out
8
9 == Constants ========================================================
10 ABS:
11 NEG:
12 INV:
13 INC:
14 DEC:
15
16 == TeX ==============================================================
17 == Fleeterpreter ====================================================
18     public void service() {
19 /*
20         if (in.dataReadyForShip() && op.dataReadyForShip()) {
21             int data   = in.removeDataForShip();
22             int opcode = in.removeDataForShip();
23             switch(opcode) {
24                 case 0: out.addDataFromShip(-1 * data);      // NEG
25                     break;
26                 case 1: out.addDataFromShip(data+1);         // INC
27                     break;
28                 case 2: out.addDataFromShip(data-1);         // DEC
29                     break;
30                 case 3: out.addDataFromShip(Math.abs(data)); // ABS
31                     break;
32                 default: out.addDataFromShip(0);
33                     break;
34             }
35         }
36 */
37     }
38
39 == FleetSim ==============================================================
40 == FPGA ==============================================================
41 `include "macros.v"
42
43 module alu1 (clk, 
44              a_r,    a_a_,  a_d,
45              op_r,   op_a_, op_d,
46              out_r_, out_a, out_d_);
47
48   input  clk;
49   `input(a_r,    a_a,    a_a_,  [(`DATAWIDTH-1):0], a_d)
50   `input(op_r,   op_a,   op_a_, [(`DATAWIDTH-1):0], op_d)
51   `output(out_r, out_r_, out_a, [(`DATAWIDTH-1):0], out_d_)
52   `defreg(out_d_, [(`DATAWIDTH-1):0], out_d)
53
54   reg                    have_a;
55   reg [(`DATAWIDTH-1):0] reg_a;
56   reg                    have_op;
57   reg [(`DATAWIDTH-1):0] reg_op;
58
59   always @(posedge clk) begin
60     if (!have_a) begin
61       `onread(a_r, a_a) have_a = 1; reg_a = a_d; end
62       end
63     if (!have_op) begin
64       `onread(op_r, op_a) have_op = 1; reg_op = op_d; end
65       end
66   
67     if (have_a && have_op) begin
68       case (reg_op)
69         0: out_d = -reg_a;
70         1: out_d = reg_a+1;
71         2: out_d = reg_a-1;
72         3: out_d = (reg_a<0) ? (-reg_a) : reg_a;
73         default: out_d = 0;
74       endcase        
75       `onwrite(out_r, out_a)
76         have_a  = 0;
77         have_op = 0;
78       end
79     end
80   end
81
82 endmodule
83
84
85 == Contributors =========================================================
86 Adam Megacz <megacz@cs.berkeley.edu>