4 changed files with 344 additions and 258 deletions
@ -1,89 +1,87 @@
@@ -1,89 +1,87 @@
|
||||
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 |
||||
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 |
||||
); |
||||
|
||||
wire rst = !nrst; |
||||
reg [8:0] buffer; |
||||
wire [8:0] sum; |
||||
wire [8:0] diff; |
||||
`include "parameters.vh" |
||||
|
||||
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); |
||||
reg [8:0] buffer; |
||||
wire [8:0] sum; |
||||
wire [8:0] diff; |
||||
|
||||
initial begin |
||||
buffer <= 0; |
||||
r_v <= 0; |
||||
r_c <= 0; |
||||
end |
||||
assign r_z = result[7:0] == 0; |
||||
assign r_n = result[7]; |
||||
assign sum = A + B + C; |
||||
assign diff = A - B - (1 - C); |
||||
|
||||
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 |
||||
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 |
||||
|
||||
Loading…
Reference in new issue