You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.0 KiB
91 lines
2.0 KiB
`default_nettype none |
|
module alu (A, B, C, sel, result, r_n, r_z, r_v, r_c); |
|
|
|
|
|
`include "parameters.vh" |
|
|
|
input logic [7:0] A; |
|
input logic [7:0] B; |
|
input logic C; |
|
input logic [2:0] sel; |
|
output logic [7:0] result; |
|
output logic r_n; |
|
output logic r_z; |
|
output logic r_v; |
|
output logic r_c; |
|
|
|
reg [8:0] buffer; |
|
wire [8:0] sum; |
|
wire [8:0] diff; |
|
|
|
assign r_z = result[7:0] == 0; |
|
assign r_n = result[7]; |
|
assign sum = A + B + C; |
|
assign diff = A - B - (1 - C); |
|
|
|
always_comb |
|
begin |
|
result = 0; |
|
r_c = 0; |
|
r_v = 0; |
|
case (sel) |
|
OP_OR: |
|
begin |
|
result = A | B; |
|
r_v = 0; |
|
r_c = 0; |
|
end |
|
OP_AND: |
|
begin |
|
result = A & B; |
|
r_v = 0; |
|
r_c = 0; |
|
end |
|
OP_EOR: |
|
begin |
|
result = A ^ B; |
|
r_v = 0; |
|
r_c = 0; |
|
end |
|
OP_ADC: |
|
begin |
|
result = sum[7:0]; |
|
r_c = sum[8]; |
|
r_v = !(A[7] ^ B[7]) & (A[7] ^ sum[7]); |
|
end |
|
OP_SUB: |
|
begin |
|
result = diff; |
|
r_c = diff[8]; |
|
r_v = !(A[7] ^ B[7]) & (A[7] ^ diff[7]); |
|
end |
|
OP_ROT: |
|
begin |
|
if (B == SHIFT_LEFT) begin |
|
result[7:1] = A[6:0]; |
|
result[0] = C; |
|
r_c = A[7]; |
|
end |
|
else begin |
|
result[6:0] = A[7:1]; |
|
result[7] = C; |
|
r_c = A[0]; |
|
end |
|
end |
|
OP_SHF: |
|
begin |
|
if (B == SHIFT_LEFT) begin |
|
result[7:1] = A[6:0]; |
|
result[0] = 0; |
|
r_c = A[7]; |
|
end |
|
else begin |
|
result[6:0] = A[7:1]; |
|
result[7] = 0; |
|
r_c = A[0]; |
|
end |
|
end |
|
endcase // case sel |
|
end |
|
|
|
endmodule
|
|
|