Bộ cộng và cộng-trừ: từ một cột bit tới ripple và lookahead
Tiên quyết
- Module A2: Logic tổ hợp: Đang tải
Sau bài này bạn sẽ
- Dựng half/full adder từ bảng cộng bit
- Lần carry qua ripple và khai triển carry-lookahead
- Dùng một đường cộng cho trừ và phân biệt carry, borrow, overflow
Mỗi cột trả hai thông tin
Trong phép cộng binary, tổng của hai bit có thể bằng 2, nên một bit kết quả không đủ. Mỗi cột trả bit sum ở cùng trọng số và bit carry chuyển sang trọng số gấp đôi.
Khi cộng một từ nhiều bit, cột bên phải còn có thể gửi carry vào cột hiện tại. Tách đúng sum và carry là bước đầu để hiểu bộ cộng, bộ trừ và ALU.
Half-adder khác full-adder ở carry-in
Half-adder nhận A và B; sum là XOR, carry là AND.
| A | B | Carry | Sum |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 |
Full-adder nhận thêm carry-in C. Sum là XOR của ba đầu vào; carry bằng 1 khi ít nhất hai đầu vào bằng 1.
| A | B | C | Carry-out | Sum |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 1 |
| 0 | 1 | 0 | 0 | 1 |
| 0 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 1 |
| 1 | 0 | 1 | 1 | 0 |
| 1 | 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 1 |
Có thể ghép hai half-adder và OR hai carry để tạo full-adder. Half-adder chưa đủ cho một cột có ba bit cần cộng; trong incrementer, một đầu vào chỉ là carry từ bước trước nên cấu trúc có thể đơn giản hơn.
Carry đi từ bit thấp tới bit cao
Đặt P_i=A_i XOR B_i, G_i=A_i·B_i. Cột i có S_i=P_i XOR C_i và C_(i+1)=G_i+P_i·C_i, trong đó dấu cộng là OR.
G nghĩa cột tự tạo carry; P nghĩa cột truyền carry vào. Ghép carry-out của cột thấp làm carry-in cột kế tạo ripple-carry.
Ví dụ bốn bit 7 cộng 1, carry-in ban đầu 0:
| Cột | A | B | Carry-in | Sum | Carry-out |
|---|---|---|---|---|---|
| 0 | 1 | 1 | 0 | 0 | 1 |
| 1 | 1 | 0 | 1 | 0 | 1 |
| 2 | 1 | 0 | 1 | 0 | 1 |
| 3 | 0 | 0 | 1 | 1 | 0 |
Đọc sum từ cột 3 về 0 được 1000. Đây là bảng tính theo phụ thuộc logic, không phải waveform hay số đo thời gian cổng. Đường carry qua nhiều cột có thể trở thành đường timing cần quan tâm.
Khai triển carry thay vì đợi từng cột
Thế công thức carry vào chính nó để đưa mỗi carry về G/P và carry-in gốc:
C1=G0+P0·C0.C2=G1+P1·G0+P1·P0·C0.C3=G2+P2·G1+P2·P1·G0+P2·P1·P0·C0.C4=G3+P3·G2+P3·P2·G1+P3·P2·P1·G0+P3·P2·P1·P0·C0.
Đây là carry-lookahead bốn bit với P dùng XOR như đã định nghĩa. Giá trị sum không đổi; cấu trúc phụ thuộc carry thay đổi.
Biểu thức phẳng tăng fan-in khi W lớn. Thiết kế rộng thường ghép nhóm generate/propagate hoặc dùng cấu trúc prefix; không kéo một biểu thức OR rất rộng rồi mặc định nhanh nhất. Cell, tải, wire và constraint còn quyết định kết quả thực.
Ví dụ bài chỉ đối chiếu chức năng ripple/CLA. Không có cell library và STA thì chưa so được timing hoặc area của hai bản.
XOR có điều khiển để dùng cùng bộ cộng
Two’s complement cho phép viết A-B=A+(NOT B)+1 theo modulo của độ rộng đang giữ. Dùng tín hiệu SUB: khi 0, B đi qua; khi 1, đảo từng bit B và đưa 1 vào carry-in.
Với bốn bit, 3 trừ 5: 0011 + 1010 + 1 = 1110. Kết quả giữ lại là −2 nếu đọc signed, hoặc 14 nếu đọc unsigned modulo 16.
Trong quy ước của bài, carry-out khi trừ bằng 1 nghĩa không mượn: A lớn hơn hoặc bằng B theo unsigned. Nó bằng 0 khi có borrow. Đây là quy ước cờ cần công bố, không phải mọi ISA đều dùng cùng tên/ý nghĩa.
Không dùng carry-out để suy signed overflow. Phép trừ signed có thể tràn dù không cần mượn trong cách đọc unsigned.
Giữ độ rộng và đọc cờ theo đúng miền
Tổng unsigned của hai từ bốn bit và carry-in cần năm bit. Cần giữ đủ độ rộng ngay lúc tính, không mở rộng một kết quả đã bị cắt rồi mong lấy lại carry.
Signed overflow ở bộ cộng cùng độ rộng có thể kiểm bằng XOR của carry vào MSB và carry ra MSB. Với cộng hai số cùng dấu, một dấu khác ở kết quả cũng báo overflow; với trừ phải dùng quy tắc phù hợp cho toán hạng bị trừ.
| Phép bốn bit | Kết quả giữ | Carry | Signed overflow |
|---|---|---|---|
| +7 cộng +1 | 1000 |
0 | 1 |
| −1 cộng +1 | 0000 |
1 | 0 |
| +7 trừ −1 | 1000 |
0 theo raw unsigned 7−15 | 1 |
| −8 trừ −8 | 0000 |
1, không borrow | 0 |
Cờ N chỉ đọc MSB kết quả; khi có overflow, nó chưa phải dấu của kết quả toán học không giới hạn. Để so signed bằng hiệu, cần hiệu chỉnh bằng overflow như ở bài ALU.
Những lỗi dễ lọt nếu chỉ thử số nhỏ
- Dùng half-adder cho cột còn carry-in.
- Quên cộng 1 sau khi đảo B lúc trừ.
- Mất bit cao trong biểu thức trước khi gán sang biến rộng hơn.
- Đồng nhất carry/no-borrow với signed overflow.
- Gọi một cách viết CLA là chắc chắn nhanh hơn sau mọi mapping.
Hãy thử các biên 0, toàn bit 1, số dương lớn nhất và số âm nhỏ nhất. Chọn thêm ca carry đi qua nhiều cột; không chỉ kiểm vài tổng không phát sinh carry.
Tính cả sum và các cờ
- Full-adder nhận 1/1/1 cho sum và carry bằng bao nhiêu?
- Lần từng carry của 1111 cộng 0001 với carry-in 0.
- Với A=0101, B=0011, SUB=1, B sau XOR là gì và carry-in bằng bao nhiêu?
- Vì sao +7 trừ −1 không thể dùng dấu của hiệu bốn bit để kết luận thứ tự?
- Nếu CLA và ripple cho cùng kết quả ở mọi input nhỏ, còn cần kiểm gì để chọn vì timing?
Kiểm tra
Bằng chứng kiểm chứng
Expected tính trước chạy: ADDER CHECK half=4 full=8 carry_vectors=512 carry_out=256 signed_overflow=128 addsub=512 subtract_borrow=120 addsub_overflow=128 time_ns=1036.
Half/full kiểm đủ bốn/tám hàng bằng tổng số nguyên. Ripple/CLA kiểm 512 tổ hợp A/B/carry-in; tham chiếu có 256 carry-out và 128 signed overflow. Add/sub kiểm 512 tổ hợp nữa, gồm 120 borrow ở nhánh trừ và 128 overflow tổng hai mode.
Tham chiếu signed giải mã raw u trừ 16 ở nửa âm, rồi xét tổng/hiệu toán học ngoài −8 tới +7. Không dùng lại chuỗi carry hoặc biểu thức dấu của DUT để sinh cờ mong đợi. Parser/lint/simulation/synthesis đạt; generic không có FF/latch. Không claim gate-delay, mapping/STA/PPA hoặc mọi W/X/Z.
Nguồn và mức độ đối chiếu
- Digital Full-Adder Circuit — bản chụp resources.zip, Quick Answer: Full-Adder; Building the Full Adder; Generate and Propagate; The Ripple-Carry Adder; Subtraction and Overflow With the Same Adder. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản A3.adders, Four half-adder/eight full-adder rows, 512 ripple/CLA and 512 add-sub vectors with independent arithmetic flags. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Integral expression widths, concatenation, generated combinational carries and signed-overflow interpretation — chưa đối chiếu LRM. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Digital Half-Adder Circuit — bản chụp resources.zip, Quick Answer: Half-Adder; The Half-Adder Circuit; Chaining Half-Adders: An Incrementer. Trích dẫn; nguồn đã đọc các mục liên quan.