51 / 63 · Khái niệm
ALU và cờ zero, negative, carry, overflow
Tạo ADD/SUB bằng bộ cộng chung, tách carry và overflow signed để suy cả điều kiện so sánh.
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
Kiến thức trước: hiểu bù haiBù hai Cách biểu diễn số nguyên có dấu bằng chuỗi bit có độ rộng cố định. Phạm vi n bit là −2^(n−1) đến 2^(n−1)−1. Tìm hiểu thêm, bộ cộng, MUXBộ chọn kênh Mạch tổ hợp nối một trong nhiều đầu vào tới đầu ra theo tín hiệu chọn. Phải quy định quan hệ giữa bit chọn và số đầu vào. Tìm hiểu thêm tổ hợp và mở rộng bit.
ALU tạo cả kết quả lẫn trạng thái
ALU chọn kết quả của các mạch phép toán và xuất bit trạng thái để diễn giải kết quả. Đầu vào và kết quả rộng bit, hỗ trợ ADD, SUB, AND, OR, XOR. Kết quả số học luôn giữ bit thấp. Cùng chuỗi có thể đọc unsignedunsigned Quy tắc diễn giải chuỗi bit là số nguyên không âm. Phạm vi n bit là 0 đến 2^n−1 và có thể khác diễn giải signed của cùng chuỗi bit. Tìm hiểu thêm hoặc signed bù hai, nên xuất carry và overflow riêng. Không cần hai bộ cộng cho hai cách diễn giải dấu.
Các cờ là , . Z là kết quả rút gọn toàn bộ kết quả được chọn bằng NOR; N là bit cao nhất. N=1 nghĩa chuỗi lưu diễn giải signed là âm. Nếu overflow, dấu này có thể khác dấu tổng thật tính với độ chính xác vô hạn.
Tách carry và overflow
Trong cộng, bit cao nhất của tổng mở rộng là C.
V=1 khi hai đầu vào cùng dấu nhưng dấu kết quả đổi. Gọi các bit cao nhất là , ta có:
Tám bit: cho R=0,C=1,V=0; signed là , không vượt phạm vi. Ngược lại cho R=0x80,C=0,V=1: tổng unsigned 128 vẫn biểu diễn được nhưng vượt giá trị signed lớn nhất là 127. Gộp C với V sẽ không phân biệt được hai trường hợp.
Phép trừ chỉ đảoPhủ định Phép NOT đổi 0 thành 1 và 1 thành 0. Gạch trên biểu thức nghĩa là áp dụng NOT cho toàn bộ phần nằm dưới gạch. Tìm hiểu thêm W bit B, sau đó thêm 0 để mở rộng: . Đảo cả W+1 bit sẽ đổi ý nghĩa carry cao. Bài này định nghĩa C=1 là không mượn, nên unsigned là .
Chỉ trừ hai số khác dấu mới có thể overflow signed. Lệnh so sánh có thể chỉ dùng cờ SUB, không lưu R. Signed là , là . Ví dụ lưu thành +127 nhưng V=1 sửa lỗi nếu chỉ nhìn N.
Ví dụ ADD tám bit này có kết quả unsigned biểu diễn được nhưng signed vượt phạm vi. Xác nhận C=0 và V=1 có thể cùng xảy ra với cùng phép cộng.
- A=7F · B=01: signed 127 + 1
- Tổng T chín bit: 0_10000000
- Kết quả R tám bit: 80 → signed −128
- Cờ trạng thái: Z=0 · N=1 · C=0 · V=1
Bộ cộng dùng chung và quy tắc đầu ra rõ ràng
RTL dưới giả định W≥2. Opcode 0~4 là ADD, SUB, AND, OR, XOR. Phép logic đặt C,V=0. Opcode không dùng cho R=0, nên Z=1 và các cờ khác 0. Đây là quy ước giao diện ALU này, không mô phỏng một tập lệnh CPU cụ thể.
module alu #(parameter int W = 8) (
input logic [W-1:0] a, b,
input logic [2:0] op,
output logic [W-1:0] y,
output logic z, n, c, v
);
logic sub;
logic [W-1:0] bx;
logic [W:0] sum;
always_comb begin
sub = (op == 3'd1);
bx = b ^ {W{sub}};
sum = {1'b0, a} + {1'b0, bx}
+ {{W{1'b0}}, sub};
y = '0;
c = 1'b0;
v = 1'b0;
case (op)
3'd0, 3'd1: begin
y = sum[W-1:0];
c = sum[W];
if (sub)
v = (a[W-1] ^ b[W-1]) & (a[W-1] ^ y[W-1]);
else
v = ~(a[W-1] ^ b[W-1]) & (a[W-1] ^ y[W-1]);
end
3'd2: y = a & b;
3'd3: y = a | b;
3'd4: y = a ^ b;
default: y = '0;
endcase
z = ~(|y);
n = y[W-1];
end
endmoduleĐảo B có điều kiện và carry đầu cho phép ADD/SUB dùng chung cấu trúc cộng. Mỗi nhánh xác định y trước, rồi tính Z,N nên phép logic cũng có cờ nhất quán. Gán mặc định định nghĩa mọi đường đầu ra và ngăn latchLatch Phần tử lưu trữ theo đầu vào khi điều khiển hoạt động, giữ giá trị khi không hoạt động; khác flip-flop chỉ lưu tại cạnh. Tìm hiểu thêm. Không có thanh ghiThanh ghi Mạch lưu trạng thái nhiều bit. Thanh ghi đồng bộ trong khóa học lưu đầu vào đã quy định tại cạnh clock. Tìm hiểu thêm nên không có trễ tính theo clock, nhưng vẫn có trễ lan truyền thực. Kết quả qua MUX chọn phép và mạch phát hiện zero phải đến kịp setup của thanh ghi sau.
Kiểm chứng nên ghép 0, unsigned lớn nhất, signed lớn/nhỏ nhất và hai phía các biên. So R với tham chiếu modulo , C với tổng unsigned mở rộng, V với vượt phạm vi signed. R đúng nhưng các cờ vẫn có thể không đúng với định nghĩa.
Ví dụ thực tách cờ dấu, zero, carry unsigned và overflow signed có trong giải thích cờ điều kiện của Arm.
Tự thử
ALU tám bit: tính R,Z,N,C,V của (1) 0x7F+0x01, (2) 0xFF+0x01, (3) 0x00−0x01, (4) 0x80−0x01. Giải thích vì sao chỉ N sẽ sai khi so signed hai đầu vào của (4).
Đọc giải thích
Theo (R,Z,N,C,V): (1) (0x80,0,1,0,1), (2) (0x00,1,0,1,0), (3) (0xFF,0,1,0,0), (4) (0x7F,0,0,1,1). (3) mượn unsigned nên C=0, signed −1 vẫn biểu diễn được. (4) unsigned 128−1=127 không mượn nên C=1; signed −128−1=−129 vượt phạm vi nên V=1. N=0 của R đã lưu không phản ánh dấu của hiệu thực tế. Signed A<B dùng N xor V=1 nên đúng là true.