Trong mô hình CPU, khối ALU “cộng” hai số. Nhưng cộng thực sự xảy ra thế nào trong silicon? Không có phép cộng kỳ diệu nào cả — chỉ có vài cổng logic bật/tắt, ghép lại. Đi từ một cổng đến bộ cộng 8-bit hoàn chỉnh.
Mọi thứ trong CPU rút gọn về bit: chỉ 0 hoặc 1 (thấp/cao điện áp). Một cổng logic nhận một hoặc hai bit vào và cho ra một bit, theo một quy tắc cố định. Đây là viên gạch nhỏ nhất. Bấm vào các nút input để bật/tắt và xem output đổi theo:
Thử bài toán nhỏ nhất: cộng hai bit. 0+0=0, 0+1=1, 1+0=1, và 1+1=? — bằng 2, nhưng một bit không chứa nổi số 2! Kết quả là 0 nhớ 1 (giống 9+1=10 trong hệ thập phân). Vậy ta cần hai bit ra: Tổng (Sum) và Nhớ (Carry).
Điều kỳ diệu: Sum chính là A XOR B, và Carry chính là A AND B. Chỉ hai cổng. Bật/tắt A, B để kiểm chứng:
Bộ bán cộng thiếu một thứ: khi cộng số nhiều bit, mỗi cột còn phải nhận nhớ từ cột bên phải. Bộ cộng đầy đủ có ba đầu vào: A, B, và Cin (carry vào). Nó vẫn cho ra Sum và Cout (carry ra) — ghép từ hai bộ bán cộng và một cổng OR. Bật cả ba để xem:
Đây là mấu chốt. Xếp 8 bộ cộng đầy đủ cạnh nhau, một cái cho mỗi bit. Carry ra của bộ này nối vào carry vào của bộ bên trái — nhớ “gợn” từ phải sang trái, đúng như khi ta cộng tay. Đặt hai số (bấm vào bit để đổi), rồi bấm “Cộng” để xem nhớ lan từng bước:
CPU không cần mạch trừ riêng. Mẹo: trừ = cộng với số âm, và số âm được biểu diễn bằng số bù hai — đảo tất cả các bit rồi +1. Khi đó A − B trở thành A + (đảo B) + 1, dùng chính bộ cộng vừa xây. Thử xem −B được tạo thế nào:
Lùi lại nhìn cả chồng tầng. Mỗi tầng chỉ dùng tầng ngay dưới nó — đó là sức mạnh của trừu tượng hoá. Lập trình viên gõ a + b, và tận đáy là vài transistor bật/tắt:
ADD mà không cần nghĩ tới XOR.ADD bạn chạy trong mô phỏng nằm ở tầng trên cùng. Mở mô hình CPU → và giờ bạn biết khối ALU đang giấu cả một rừng cổng logic bên trong.Từ transistor — về cơ bản là công tắc điện điều khiển bằng điện. Vài transistor mắc với nhau tạo thành một cổng (ví dụ cổng NAND dùng 4 transistor). Một CPU hiện đại có hàng chục tỉ transistor, khắc trên miếng silicon nhỏ hơn móng tay.
Vì khi cộng hai bit, chữ số hàng đơn vị của kết quả là 1 chỉ khi đúng một trong hai bit là 1 (0+1 hoặc 1+0). Khi cả hai là 1, hàng đơn vị về 0 và sinh nhớ. “Đúng một trong hai” chính là định nghĩa của XOR.
Không — nó là cách dễ hiểu nhất. Vì mỗi bit phải đợi nhớ từ bit trước, bit cuối phải đợi cả chuỗi, nên chậm. CPU thật dùng các thiết kế nhanh hơn như carry-lookahead (tính trước nhớ song song). Nhưng kết quả cộng thì giống hệt.
Vì số bù hai cho phép dùng chung một bộ cộng cho cả cộng lẫn trừ, và chỉ có một cách biểu diễn số 0. Cách “bit dấu” ngây thơ tạo ra cả +0 và −0, và cần mạch riêng cho phép trừ — phức tạp và tốn hơn.
Đúng. Nhân có thể làm bằng cách cộng dịch (shift-and-add) lặp lại — về bản chất là nhiều bộ cộng. Trong mô hình CPU 8-bit, ta thấy điều này ở mức lệnh: phép nhân là cộng nhiều lần. Trong silicon, có cả khối nhân chuyên dụng ghép từ rất nhiều bộ cộng.
Trực tiếp. Khối ALU trong mô hình CPU chính là một bộ cộng 8-bit như ở bước 4. Cờ CARRY và trạng thái “Tràn số” bạn thấy khi cộng quá 255 chính là bit nhớ cuối cùng tràn ra khỏi 8 bit. Trang này mở nắp khối ALU đó ra.
6 bài để chắc chắn em hiểu sâu về cổng logic & bộ cộng. Mỗi bài có đề bài rõ ràng và mục “✅ Hoàn thành khi” để em biết thế nào là làm đúng. Bấm “In bài tập” để in ra giấy làm sau; mở “Đáp án” chỉ sau khi đã tự làm.
Cho hai bit A và B. Hãy điền kết quả của AND, OR, XOR cho cả 4 tổ hợp: 00, 01, 10, 11.
✅ Hoàn thành khi: điền đúng — AND = 0,0,0,1; OR = 0,1,1,1; XOR = 0,1,1,0.
A B │ AND OR XOR 0 0 │ 0 0 0 0 1 │ 0 1 1 1 0 │ 0 1 1 1 1 │ 1 1 0
Bộ bán cộng nhận hai bit a, b và cho ra Tổng (Sum) và Nhớ (Carry). (a) Viết công thức của Sum và Carry theo cổng logic. (b) Với a=1, b=1 thì Sum và Carry bằng mấy?
✅ Hoàn thành khi: (a) Sum = a XOR b, Carry = a AND b; (b) với 1,1 → Sum = 0, Carry = 1 (tức 1+1 = “10” nhị phân).
1 + 1 = 10 trong nhị phân: bit tổng là 0, bit nhớ là 1. Đúng như Carry = AND (chỉ 1 khi cả hai cùng 1) và Sum = XOR (1 khi hai bit khác nhau).
Tính 0101 1010 + 0010 0011 (tức 90 + 35) bằng tay. Cho kết quả ở dạng nhị phân và thập phân, và cho biết có bit nhớ tràn ra ngoài 8 bit không.
✅ Hoàn thành khi: ra 125 = 0111 1101, không tràn (kết quả ≤ 255, carry-out = 0).
0101 1010 (90) + 0010 0011 (35) ----------- 0111 1101 (125) → carry-out = 0, không tràn
Tính 1100 1000 + 0101 0000 (tức 200 + 80) trong 8 bit. Điều gì xảy ra? Giá trị thực sự giữ lại trong 8 bit là bao nhiêu?
✅ Hoàn thành khi: nhận ra 200 + 80 = 280 > 255 → có bit nhớ tràn ra (carry-out = 1); 8 bit chỉ giữ 280 − 256 = 24 = 0001 1000. Trong mô hình CPU, đây chính là lúc báo TRÀN SỐ.
1100 1000 (200) + 0101 0000 (80) ----------- 1 0001 1000 (280) ↑ bit thứ 9 = carry-out (tràn). 8 bit còn lại = 24.
(a) Biểu diễn −5 trong 8 bit bằng số bù hai. (b) Dùng nó để tính 9 + (−5) trong 8 bit và kiểm tra kết quả có bằng 4 không.
✅ Hoàn thành khi: (a) −5 = 1111 1011 (đảo bit của 5 rồi +1); (b) 0000 1001 + 1111 1011 = 1 0000 0100; bỏ bit tràn thứ 9 → 0000 0100 = 4 ✓.
5 = 0000 0101 đảo bit = 1111 1010 +1 = 1111 1011 (= −5) 0000 1001 (9) + 1111 1011 (−5) ----------- 1 0000 0100 → bỏ bit thứ 9 → 0000 0100 = 4 ✓
Đây là lý do CPU chỉ cần một bộ cộng: phép trừ = cộng với số bù hai.
Mở Bài 3 — Mô hình CPU 8-bit. (a) Khối nào trong CPU chính là bộ cộng 8-bit em vừa học? (b) Cờ nào sáng lên khi kết quả phép cộng vượt quá 255?
✅ Hoàn thành khi: (a) chỉ ra khối ALU; (b) cờ CARRY (kèm trạng thái “Tràn số”).