aboutsummaryrefslogtreecommitdiff
path: root/hdl/alu.v
blob: 17008a92474781d976744d24bfca5f0dd50dace5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
`timescale 1ns / 1ps

/**
 ALU Unit
 */
module alu (
	    input  wire [4:0]   alu_ctl, 
	    input  wire [31:0]  a_in, b_in, 
	    output reg  [31:0]  result, 
	    output wire         zero_flag
	    );
   
   assign zero_flag = (result == 0);
   
   always @(alu_ctl, a_in, b_in) begin  // reevaluate if these change
      case (alu_ctl)
        0:  result = a_in & b_in;         // bitwise and
		1:  result = a_in | b_in;         // bitwise or
		2:  result = a_in + b_in;         // addition
		6:  result = a_in - b_in;         // substraction
		7:  result = a_in < b_in ? 1 : 0; // set on less than
        8:  result = ~(a_in | b_in);      // bitwise nor
        9:  result = a_in ^ b_in;         // bitwise xor
        
        default: result = 0;
      endcase
   end
   
endmodule