Line 69... |
Line 69... |
// PASS RB 11_111 // ALUOP <- RB, FLAGS <- RA
|
// PASS RB 11_111 // ALUOP <- RB, FLAGS <- RA
|
//
|
//
|
//
|
//
|
// FLAGS: X X X X OF DF IF TF | SF ZF X AF X PF X CF
|
// FLAGS: X X X X OF DF IF TF | SF ZF X AF X PF X CF
|
//
|
//
|
|
// 09Feb2013 - fixed DAA,DAS bug
|
//////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////
|
`timescale 1ns / 1ps
|
`timescale 1ns / 1ps
|
|
|
module Next186_ALU(
|
module Next186_ALU(
|
input [15:0] RA,
|
input [15:0] RA,
|
Line 108... |
Line 109... |
wire parity = ~^ALUOUT[7:0];
|
wire parity = ~^ALUOUT[7:0];
|
wire zero8 = ~|ALUOUT[7:0];
|
wire zero8 = ~|ALUOUT[7:0];
|
wire zero = ~|ALUOUT[15:0];
|
wire zero = ~|ALUOUT[15:0];
|
wire overflow8 = (SUMOP1[7] & SUMOP2[7] & !SUMOUT[7]) | (!SUMOP1[7] & !SUMOP2[7] & SUMOUT[7]);
|
wire overflow8 = (SUMOP1[7] & SUMOP2[7] & !SUMOUT[7]) | (!SUMOP1[7] & !SUMOP2[7] & SUMOUT[7]);
|
wire overflow = (SUMOP1[15] & SUMOP2[15] & !SUMOUT[15]) | (!SUMOP1[15] & !SUMOP2[15] & SUMOUT[15]);
|
wire overflow = (SUMOP1[15] & SUMOP2[15] & !SUMOUT[15]) | (!SUMOP1[15] & !SUMOP2[15] & SUMOUT[15]);
|
wire LO9 = RA[3:0] > 9;
|
wire LONIBBLE = (RA[3:0] > 4'h9) || FIN[4];
|
wire LONIBBLE = LO9 | FIN[4];
|
wire HINIBBLE = (RA[7:0] > 8'h99) || FIN[0];
|
wire HINIBBLE = (RA[7:4] > 8 && LO9) | FIN[0];
|
|
|
|
// ADDER
|
// ADDER
|
assign {AF, SUMOUT[3:0]} = SUMOP1[3:0] + SUMOP2[3:0] + SCIN;
|
assign {AF, SUMOUT[3:0]} = SUMOP1[3:0] + SUMOP2[3:0] + SCIN;
|
assign {SC8OUT, SUMOUT[7:4]} = SUMOP1[7:4] + SUMOP2[7:4] + AF;
|
assign {SC8OUT, SUMOUT[7:4]} = SUMOP1[7:4] + SUMOP2[7:4] + AF;
|
assign {SC16OUT, SUMOUT[15:8]} = SUMOP1[15:8] + SUMOP2[15:8] + SC8OUT;
|
assign {SC16OUT, SUMOUT[15:8]} = SUMOP1[15:8] + SUMOP2[15:8] + SC8OUT;
|
Line 205... |
Line 205... |
ALUOUT = SUMOUT;
|
ALUOUT = SUMOUT;
|
FOUT[0] = FIN[0];
|
FOUT[0] = FIN[0];
|
end
|
end
|
5'b01100, 5'b01101: begin // DAA, DAS
|
5'b01100, 5'b01101: begin // DAA, DAS
|
ALUOUT = SUMOUT;
|
ALUOUT = SUMOUT;
|
FOUT[0] = HINIBBLE ? 1'b1 : FIN[0];
|
FOUT[0] = HINIBBLE;
|
FOUT[4] = LONIBBLE ? 1'b1 : FIN[4];
|
FOUT[4] = LONIBBLE;
|
end
|
end
|
5'b01110, 5'b01111: begin // AAA, AAS
|
5'b01110, 5'b01111: begin // AAA, AAS
|
ALUOUT = {SUMOUT[15:8], 4'b0000, SUMOUT[3:0]};
|
ALUOUT = {SUMOUT[15:8], 4'b0000, SUMOUT[3:0]};
|
FOUT[0] = LONIBBLE;
|
FOUT[0] = LONIBBLE;
|
FOUT[4] = LONIBBLE;
|
FOUT[4] = LONIBBLE;
|