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.
|
|
|
|
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
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
`include "parameters.vh"
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
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
|