diff options
author | joshua <joshua@fedora.framework> | 2022-05-14 23:30:38 -0500 |
---|---|---|
committer | joshua <joshua@fedora.framework> | 2022-05-14 23:30:38 -0500 |
commit | b8936029065835366e9e057a219c0c5194db8662 (patch) | |
tree | 31e50944ac6e23850f92bb0e0f6d851b74307f60 /verilog/alu/v1/alu.v | |
parent | d6b7d26cf51b4b3a7b5604f9b81bb43f55cbc33c (diff) | |
download | riscv-processor-inorder-b8936029065835366e9e057a219c0c5194db8662.tar.gz |
Verilog update
Diffstat (limited to 'verilog/alu/v1/alu.v')
-rw-r--r-- | verilog/alu/v1/alu.v | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/verilog/alu/v1/alu.v b/verilog/alu/v1/alu.v new file mode 100644 index 0000000..cb66ddb --- /dev/null +++ b/verilog/alu/v1/alu.v @@ -0,0 +1,34 @@ +`default_nettype none +`timescale 1us/1ns + +`include "aluOp.vh" + +module alu +( +input wire [31:0] alu_in_1, +input wire[31:0] alu_in_2, +input wire[3:0] alu_op_i, +output wire[31:0] alu_output +); + + +wire [31:0] diff = alu_in_1 - alu_in_2; + +assign alu_output = + alu_op_i == `ADD ? alu_in_1 + alu_in_2 : + alu_op_i == `SUB ? diff : + alu_op_i == `XOR ? alu_in_1 ^ alu_in_2 : + alu_op_i == `OR ? alu_in_1 | alu_in_2 : + alu_op_i == `AND ? alu_in_1 & alu_in_2 : + alu_op_i == `SLL ? alu_in_1 << alu_in_2 : + alu_op_i == `SRL ? alu_in_1 >> alu_in_2 : + alu_op_i == `SLTU ? (alu_in_1 < alu_in_2 ? 32'b1 : 32'b0) : + alu_op_i == `NONE ? alu_in_1 : + alu_op_i == `SLT ? (alu_in_1[31] == alu_in_2[31] ? (diff[31] == 1'b0 ? 32'b0 : 32'b1) : (alu_in_1[31] == 1'b1 ? 32'b1 : 32'b0) ) : + alu_op_i == `SRA ? (alu_in_1 >> alu_in_2) | (alu_in_1[31] == 1'b0 ? 32'b0 : + 32'hFFFFFFFF << ((alu_in_2[4] ? 0 : 5'b10000) + (alu_in_2[3] ? 0 : 5'b01000) + + (alu_in_2[2] ? 0 : 5'b00100) + (alu_in_2[1] ? 0 : 5'b00010) + (alu_in_2[0] ? 0 : 5'b00001)) + ) : + 32'b0; + +endmodule |