aboutsummaryrefslogtreecommitdiff
path: root/hdl/alu.v
blob: 4e0603c4ef65b0b9ee989eec3ef354abfbddde84 (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
`timescale 1ns / 1ps

/**
 ALU Unit
 */
module alu ( input      [4:0]  alu_ctl, 
             input      [31:0] a_in, b_in, 
             output reg [31:0] result, 
             output            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