6502 implementation in SystemVerilog
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.

88 lines
1.9 KiB

2 years ago
module alu
(
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
2 years ago
);
`include "parameters.vh"
2 years ago
reg [8:0] buffer;
wire [8:0] sum;
wire [8:0] diff;
2 years ago
assign r_z = result[7:0] == 0;
assign r_n = result[7];
assign sum = A + B + C;
assign diff = A - B - (1 - C);
2 years ago
always_comb
begin
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
2 years ago
endmodule