4 changed files with 344 additions and 258 deletions
@ -1,89 +1,87 @@ |
|||||||
module alu |
module alu |
||||||
( |
( |
||||||
input nrst, |
input logic [7:0] A, |
||||||
input clk, |
input logic [7:0] B, |
||||||
input [7:0] A, |
input logic C, |
||||||
input [7:0] B, |
input logic [2:0] sel, |
||||||
input C, |
output logic [7:0] result, |
||||||
input [2:0] sel, |
output logic r_n, |
||||||
output [7:0] result, |
output logic r_z, |
||||||
output r_n, |
output logic r_v, |
||||||
output r_z, |
output logic r_c |
||||||
output reg r_v, |
|
||||||
output reg r_c |
|
||||||
); |
); |
||||||
|
|
||||||
wire rst = !nrst; |
`include "parameters.vh" |
||||||
reg [8:0] buffer; |
|
||||||
wire [8:0] sum; |
|
||||||
wire [8:0] diff; |
|
||||||
|
|
||||||
assign result[7:0] = buffer[7:0]; |
reg [8:0] buffer; |
||||||
assign r_z = buffer[7:0] == 0; |
wire [8:0] sum; |
||||||
assign r_n = buffer[7]; |
wire [8:0] diff; |
||||||
assign sum = A + B + C; |
|
||||||
assign diff = A - B - (1 - C); |
|
||||||
|
|
||||||
initial begin |
assign r_z = result[7:0] == 0; |
||||||
buffer <= 0; |
assign r_n = result[7]; |
||||||
r_v <= 0; |
assign sum = A + B + C; |
||||||
r_c <= 0; |
assign diff = A - B - (1 - C); |
||||||
end |
|
||||||
|
|
||||||
always @(posedge clk) |
always_comb |
||||||
begin |
begin |
||||||
case (sel) |
case (sel) |
||||||
OP_OR: |
OP_OR: |
||||||
begin |
begin |
||||||
buffer <= A | B; |
result = A | B; |
||||||
end |
r_v = 0; |
||||||
OP_AND: |
r_c = 0; |
||||||
begin |
end |
||||||
buffer <= A & B; |
OP_AND: |
||||||
end |
begin |
||||||
OP_EOR: |
result = A & B; |
||||||
begin |
r_v = 0; |
||||||
buffer <= A ^ B; |
r_c = 0; |
||||||
end |
end |
||||||
OP_ADC: |
OP_EOR: |
||||||
begin |
begin |
||||||
buffer <= sum; |
result = A ^ B; |
||||||
r_c <= sum[8]; |
r_v = 0; |
||||||
r_v <= !(A[7] ^ B[7]) & (A[7] & sum[7]); |
r_c = 0; |
||||||
end |
end |
||||||
OP_SUB: |
OP_ADC: |
||||||
begin |
begin |
||||||
buffer <= diff; |
result = sum[7:0]; |
||||||
r_c <= diff[8]; |
r_c = sum[8]; |
||||||
r_v <= !(A[7] ^ B[7]) & (A[7] & diff[7]); |
r_v = !(A[7] ^ B[7]) & (A[7] ^ sum[7]); |
||||||
end |
end |
||||||
OP_ROT: |
OP_SUB: |
||||||
begin |
begin |
||||||
if (B == SHIFT_LEFT) begin |
result = diff; |
||||||
buffer[8:1] <= A[7:0]; |
r_c = diff[8]; |
||||||
buffer[0] <= C; |
r_v = !(A[7] ^ B[7]) & (A[7] ^ diff[7]); |
||||||
r_c <= A[7]; |
end |
||||||
end |
OP_ROT: |
||||||
else begin |
begin |
||||||
buffer[6:0] <= A[7:1]; |
if (B == SHIFT_LEFT) begin |
||||||
buffer[7] <= C; |
result[7:1] = A[6:0]; |
||||||
r_c <= A[0]; |
result[0] = C; |
||||||
end |
r_c = A[7]; |
||||||
end |
end |
||||||
OP_SHF: |
else begin |
||||||
begin |
result[6:0] = A[7:1]; |
||||||
if (B == SHIFT_LEFT) begin |
result[7] = C; |
||||||
buffer[8:1] <= A[7:0]; |
r_c = A[0]; |
||||||
buffer[0] <= 0; |
end |
||||||
r_c <= A[7]; |
end |
||||||
end |
OP_SHF: |
||||||
else begin |
begin |
||||||
buffer[6:0] <= A[7:1]; |
if (B == SHIFT_LEFT) begin |
||||||
buffer[7] <= 0; |
result[7:1] = A[6:0]; |
||||||
r_c <= A[0]; |
result[0] = 0; |
||||||
end |
r_c = A[7]; |
||||||
end |
end |
||||||
endcase // case sel |
else begin |
||||||
end |
result[6:0] = A[7:1]; |
||||||
|
result[7] = 0; |
||||||
|
r_c = A[0]; |
||||||
|
end |
||||||
|
end |
||||||
|
endcase // case sel |
||||||
|
end |
||||||
|
|
||||||
endmodule |
endmodule |
||||||
|
|||||||
Loading…
Reference in new issue