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 nrst,
|
|
|
|
|
input clk,
|
|
|
|
|
input [7:0] A,
|
|
|
|
|
input [7:0] B,
|
|
|
|
|
input C,
|
|
|
|
|
input [2:0] sel,
|
|
|
|
|
output [7:0] result,
|
|
|
|
|
output r_n,
|
|
|
|
|
output r_z,
|
|
|
|
|
output reg r_v,
|
|
|
|
|
output reg r_c
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
wire rst = !nrst;
|
|
|
|
|
reg [8:0] buffer;
|
|
|
|
|
wire [8:0] sum;
|
|
|
|
|
wire [8:0] diff;
|
|
|
|
|
|
|
|
|
|
assign result[7:0] = buffer[7:0];
|
|
|
|
|
assign r_z = buffer[7:0] == 0;
|
|
|
|
|
assign r_n = buffer[7];
|
|
|
|
|
assign sum = A + B + C;
|
|
|
|
|
assign diff = A - B - (1 - C);
|
|
|
|
|
|
|
|
|
|
initial begin
|
|
|
|
|
buffer <= 0;
|
|
|
|
|
r_v <= 0;
|
|
|
|
|
r_c <= 0;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
always @(posedge clk)
|
|
|
|
|
begin
|
|
|
|
|
case (sel)
|
|
|
|
|
OP_OR:
|
|
|
|
|
begin
|
|
|
|
|
buffer <= A | B;
|
|
|
|
|
end
|
|
|
|
|
OP_AND:
|
|
|
|
|
begin
|
|
|
|
|
buffer <= A & B;
|
|
|
|
|
end
|
|
|
|
|
OP_EOR:
|
|
|
|
|
begin
|
|
|
|
|
buffer <= A ^ B;
|
|
|
|
|
end
|
|
|
|
|
OP_ADC:
|
|
|
|
|
begin
|
|
|
|
|
buffer <= sum;
|
|
|
|
|
r_c <= sum[8];
|
|
|
|
|
r_v <= !(A[7] ^ B[7]) & (A[7] & sum[7]);
|
|
|
|
|
end
|
|
|
|
|
OP_SUB:
|
|
|
|
|
begin
|
|
|
|
|
buffer <= diff;
|
|
|
|
|
r_c <= diff[8];
|
|
|
|
|
r_v <= !(A[7] ^ B[7]) & (A[7] & diff[7]);
|
|
|
|
|
end
|
|
|
|
|
OP_ROT:
|
|
|
|
|
begin
|
|
|
|
|
if (B == SHIFT_LEFT) begin
|
|
|
|
|
buffer[8:1] <= A[7:0];
|
|
|
|
|
buffer[0] <= C;
|
|
|
|
|
r_c <= A[7];
|
|
|
|
|
end
|
|
|
|
|
else begin
|
|
|
|
|
buffer[6:0] <= A[7:1];
|
|
|
|
|
buffer[7] <= C;
|
|
|
|
|
r_c <= A[0];
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
OP_SHF:
|
|
|
|
|
begin
|
|
|
|
|
if (B == SHIFT_LEFT) begin
|
|
|
|
|
buffer[8:1] <= A[7:0];
|
|
|
|
|
buffer[0] <= 0;
|
|
|
|
|
r_c <= A[7];
|
|
|
|
|
end
|
|
|
|
|
else begin
|
|
|
|
|
buffer[6:0] <= A[7:1];
|
|
|
|
|
buffer[7] <= 0;
|
|
|
|
|
r_c <= A[0];
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
endcase // case sel
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
endmodule
|