ALU
Biểu diễn và lưu trữ số là một chức năng quan trọng của máy tính, nhưng mục tiêu thực sự là tính toán hoặc thao tác các số theo cách có cấu trúc và có mục đích, giống như cộng hai số với nhau.

Các hoạt động này được xử lý bởi Đơn vị Số học và Logic của máy tính nhưng hầu hết mọi người gọi nó bằng tên đường phố: ALU. ALU là bộ não toán học của máy tính. Khi bạn hiểu thiết kế và chức năng của ALU, bạn sẽ hiểu phần cơ bản của máy tính hiện đại. Nó là thứ thực hiện tất cả các tính toán trong máy tính, vì vậy về cơ bản mọi thứ đều sử dụng nó.
Intel 74181 là ALU nổi tiếng từ trước đến nay, khi nó được phát hành vào năm 1970, nó là ALU hoàn chỉnh đầu tiên nằm hoàn toàn bên trong một con chip - đó là một kỳ công kỹ thuật lớn vào thời điểm đó.

intel 74181
Hôm nay chúng ta sẽ sử dụng các cổng logic Boolean mà chúng ta đã học được vào tuần trước để xây dựng một mạch ALU đơn giản với nhiều chức năng tương tự như 74181
Một ALU thực sự là hai đơn vị trong một- Có một đơn vị số học (arithmetic unit) và một đơn vị logic. Hãy bắt đầu với đơn vị số học, đơn vị này chịu trách nhiệm xử lý tất cả các phép toán số trong máy tính, chẳng hạn như cộng và trừ. Nó cũng thực hiện một loạt những việc đơn giản khác như thêm một vào một số, được gọi là hoạt động tăng dần.

Hôm nay, chúng ta sẽ tập trung vào các hoạt động làm nền tảng cho hầu hết mọi thứ khác mà máy tính thực hiện - cộng hai số với nhau.Chúng ta có thể sử dụng mức độ trừu tượng cao và xây dựng các thành phần của chúng ta từ các cổng logic, trong trường hợp này: Cổng  AND , OR , NOT , XOR.
Mạch cộng đơn giản nhất mà chúng ta có thể xây dựng lấy hai chữ số nhị phân và cộng chúng lại với nhau. Vì vậy, chúng tôi có hai đầu vào, A và B, và một đầu ra là tổng của hai chữ số đó. Chỉ cần làm rõ: A, B và đầu ra là tất cả các bit đơn.Chỉ có bốn kết hợp đầu vào khả thi. Ba đầu tiên là: 0 + 0 = 0; 1+ 0 = 1; 0 + 1 = 1. Hãy nhớ rằng trong hệ nhị phân, 1 giống với true và 0 giống với false. Vì vậy, tập hợp đầu vào này khớp chính xác với logic Boolean của cổng XOR và chúng ta có thể sử dụng nó làm bộ cộng 1 bit nhưng kết hợp đầu vào thứ tư 1 + 1, là trường hợp đặc biệt 1+ 1 là 2 nhưng không có chữ số 2 trong nhị phân. Kết quả là 0 và 1 được chuyển sang cột tiếp theo. Vì vậy, tổng thực sự là 10 trong hệ nhị phân. Bây giờ đầu ra của cổng XOR của chúng tôi đúng một phần 1+ 1, đầu ra là 0. Nhưng chúng ta cần thêm một dây đầu ra cho bit mang đó. Bit mang chỉ "True" khi đầu vào là 1 AND 1, bởi vì đó là thời điểm duy nhất khi kết quả (hai) lớn hơn 1 bit có thể lưu trữ .. và thuận tiện là chúng ta có một cổng cho điều đó!  cổng AND, chỉ đúng khi cả hai đầu vào đều đúng. Vì vậy chúng ta cũng sẽ thêm nó vào mạch của chúng ta. Và đó là nó. Mạch này được gọi là Half Adder. Nó không phức tạp như vậy - chỉ có hai cổng logic - nhưng chúng ta hãy trừu tượng hóa ngay cả mức độ chi tiết này và đóng gói bộ cộng nửa mới được đúc của chúng ta làm thành phần riêng của nó, với hai đầu vào - bit A và B - và hai đầu ra, tổng(sum) và các bit mang(carry)

Half Adder
Điều này đưa chúng ta đến một cấp độ trừu tượng khác: nếu bạn muốn thêm nhiều hơn 1 + 1, chúng tôi sẽ cần một "Full Adder". Half Adder đó đã để lại cho chúng ta một bit thực hiện như đầu ra. Điều đó có nghĩa là khi chúng ta chuyển sang cột tiếp theo trong phép cộng nhiều cột và mỗi cột sau đó, chúng ta sẽ phải cộng ba bit với nhau, không có hai.
Full Adder phức tạp hơn một chút, nó cần ba bit làm đầu vào: A, B và C. Vì vậy, đầu vào tối đa có thể là 1 + 1 + 1, tương đương với 1 thực hiện 1, vì vậy chúng ta vẫn chỉ cần hai dây đầu ra: Carry và Sum.
Chúng ta có thể xây dựng một Full Adder  bằng cách sử dụng một nửa bộ cộng. Để làm điều này, chúng tôi sử dụng bộ cộng một nửa để thêm A cộng với B giống như trước - nhưng sau đó cung cấp kết quả đó và nhập C vào bộ cộng nửa thứ hai. Cuối cùng, chúng ta cần một cổng OR để kiểm tra xem một trong hai bit mang là true. 

Full Adder
Vậy là xong, chúng ta vừa tạo một bộ cộng đầy đủ! Một lần nữa, chúng ta có thể nâng cao mức độ trừu tượng và kết hợp bộ cộng đầy đủ này làm thành phần của riêng nó. Nó cần ba đầu vào, thêm chúng và xuất ra tổng và giá trị thực, nếu có. 


Được trang bị các thành phần mới của chúng tôi, giờ đây chúng ta có thể xây dựng một mạch có hai số 8 bit. Hãy gọi chúng là A và B và cộng chúng lại với nhau. Hãy bắt đầu với bit đầu tiên của A và B mà chúng ta sẽ gọi là A0 và B0. Tại thời điểm này, không có gì phải xử lý vì đây là lần bổ sung đầu tiên của chúng tôi. Vì vậy, chúng ta có thể sử dụng bộ cộng một nửa của mình để thêm hai bit đó lại với nhau. Đầu ra là sum0. Bây giờ chúng ta muốn thêm A1 và B1 với nhau. Có thể đã có một biến từ việc bổ sung A0 và B0 trước đó, vì vậy lần này chúng ta cần sử dụng bộ cộng đầy đủ cũng đầu vào bit mang. Chúng tôi xuất kết quả này dưới dạng sum. Sau đó, chúng ta lấy bất kỳ thực hiện nào từ bộ cộng đầy đủ này và chạy nó vào bộ cộng đầy đủ tiếp theo xử lý A2 và B2. Và chúng ta tiếp tục làm điều này trong một chuỗi lớn cho đến khi tất cả 8 bit đã được thêm vào. Lưu ý cách các bit mang đi chuyển tiếp đến mỗi bộ cộng tiếp theo. Vì lý do này, nó được gọi là bộ cộng mang 8 bit gợn sóng. Lưu ý rằng bộ bổ sung đầy đủ cuối cùng của chúng ta đã thực hiện như thế nào



Nếu có một giá trị mang vào bit thứ 9, điều đó có nghĩa là tổng của hai số quá lớn để vừa với 8 bit, điều này được gọi là tràn(Overflow) . Nói chung, tràn (Overflow) xảy ra khi kết quả của một phép cộng quá lớn để được biểu thị bằng số bit bạn đang sử dụng. Điều này thường có thể gây ra lỗi và hành vi không mong muốn. Nổi tiếng, trò chơi điện tử PacMan ban đầu đã sử dụng 8 bit để theo dõi bạn đang ở cấp độ nào. Điều này có nghĩa là nếu bạn vượt qua cấp độ 255- con số lớn nhất trong 8 bit- đến mức 256, ALU bị overflow. Điều này gây ra một loạt lỗi và trục trặc khiến cấp độ không thể đánh bại. Lỗi này đã trở thành một nghi thức dành cho những người chơi PacMan vĩ đại nhất.


Vì vậy, nếu chúng ta muốn tránh overflow, chúng ta có thể mở rộng mạch của mình với nhiều bộ cộng đầy đủ hơn cho phép chúng ta thêm các số 16 hoặc 32 bit. Điều này làm cho tràn ít khả năng xảy ra hơn, nhưng với chi phí của nhiều cửa hơn. Một nhược điểm bổ sung là mất một chút thời gian để mỗi lần chuyển tiền về phía trước.

Phải thừa nhận rằng không tốn nhiều thời gian, các electron di chuyển khá nhanh, vì vậy chúng ta đang nói về phần tỷ giây nhưng điều đó đủ để tạo ra sự khác biệt trong các máy tính nhanh hiện nay. Vì lý do này, các máy tính hiện đại sử dụng một mạch bổ sung hơi khác được gọi là mạch cộng "mang theo" nhanh hơn, nhưng cuối cùng thực hiện chính xác điều tương tự - thêm số nhị phân. Đơn vị số học của ALU cũng có các mạch cho các phép toán khác. và nói chung 8 thao tác này luôn được hỗ trợ. Và giống như bộ cộng của chúng ta, các hoạt động khác này được xây dựng từ các cổng logic riêng lẻ. Điều thú vị là bạn có thể nhận thấy rằng không có phép toán nhân và chia,
đó là bởi vì các ALU đơn giản không có mạch cho việc này và thay vào đó chỉ thực hiện một loạt các bổ sung. Giả sử bạn muốn nhân 12 với 5- Điều đó cũng giống như việc cộng 12 với chính nó 5 lần. Vì vậy, sẽ mất 5 lần đi qua ALU để thực hiện một phép nhân này
Điều này có bao nhiêu bộ xử lý đơn giản, như bộ điều nhiệt, điều khiển TV và lò vi sóng, thực hiện phép nhân. Nó chậm, nhưng nó hoàn thành công việc. Tuy nhiên, các bộ xử lý đẹp hơn, như trong máy tính xách tay hoặc điện thoại thông minh của bạn có các đơn vị số học với các mạch dành riêng cho phép nhân. Và như bạn có thể mong đợi, mạch phức tạp hơn so với việc bổ sung - Không có phép thuật, nó chỉ cần nhiều cổng logic hơn - đó là lý do tại sao các bộ xử lý rẻ tiền hơn không có tính năng này
Đơn vị Logic (Logic Unit), thay vì các phép toán số học, đơn vị Logic thực hiện các phép toán logic, như AND, OR và NOT, mà chúng ta đã nói trước đây. Nó cũng thực hiện các bài kiểm tra số đơn giản, như kiểm tra xem một số có âm hay không. Ví dụ, đây là một mạch kiểm tra xem đầu ra của ALU có bằng không. Nó thực hiện điều này bằng cách sử dụng một loạt các cổng OR để xem có bit nào là 1. Ngay cả khi một bit đơn lẻ là 1, chúng ta biết số không thể bằng 0 và sau đó chúng tôi sử dụng cổng NOT cuối cùng để lật đầu vào này. đầu ra chỉ là 1 nếu số đầu vào là 0. Vì vậy, đó là tổng quan cấp cao về những gì tạo nên ALU. Chúng tôi thậm chí còn xây dựng một số thành phần chính để chống xước, như bộ cộng ripple. Như bạn đã thấy, đó chỉ là một loạt các cổng logic lớn được kết nối theo những cách thông minh

ALU 8 bit mà chúng ta tạo ra ngày hôm nay, 74181 chỉ có thể xử lý đầu vào 4 bit. Intel 74181 sử dụng khoảng 70 cổng logic và nó không thể nhân hoặc chia. Nhưng đó là một bước tiến lớn trong quá trình thu nhỏ, mở ra cánh cửa cho những máy tính có khả năng hoạt động tốt hơn và ít tốn kém hơn.Mạch ALU 4 bit này đã có rất nhiều thứ để tham gia, nhưng ALU 8 bit của chúng tôi sẽ yêu cầu hàng trăm cổng logic để xây dựng hoàn chỉnh. Các kỹ sư không muốn thấy tất cả sự phức tạp đó khi sử dụng ALU, vì vậy họ đã nghĩ ra một biểu tượng đặc biệt để tổng hợp tất cả, trông giống như một chữ "V" lớn. Chỉ là một cấp độ trừu tượng khác


ALU 8-bit của chúng tôi có hai đầu vào, A và B, mỗi đầu vào có 8 bit. Chúng ta cũng cần phải xác định rõ ALU sẽ thực hiện thao tác nào, ví dụ: phép cộng hoặc phép trừ. Đối với điều đó, chúng ta sử dụng mã hoạt động 4 bit. Tóm lại, 1000 có thể là lệnh cộng, trong khi 1100 là lệnh trừ. Về cơ bản, mã hoạt động cho ALU biết hoạt động nào cần thực hiện. Và kết quả của hoạt động đó trên đầu vào A và B là đầu ra 8 bit. ALU cũng xuất ra một loạt Cờ, là đầu ra 1 bit cho các trạng thái và trạng thái cụ thể. Ví dụ, nếu chúng ta trừ hai số và kết quả là 0, thì mạch kiểm tra số 0 của chúng ta, mạch mà chúng tôi đã thực hiện trước đó sẽ đặt Zero Flag thành True.
Điều này rất hữu ích nếu chúng ta đang cố gắng xác định xem hai số có bằng nhau hay không. Nếu chúng ta muốn kiểm tra xem A có nhỏ hơn B hay không, chúng ta có thể sử dụng ALU để tính A trừ B và xem liệu Negative Flag có được đặt thành true hay không. Nếu đúng như vậy, chúng ta biết A nhỏ hơn B. Và cuối cùng, cũng có một sợi dây được gắn vào phần thực hiện trên bộ cộng mà chúng ta đã xây dựng, vì vậy nếu có sự cố tràn, chúng ta sẽ biết về nó. Đây được gọi là Overflow Flag. Các ALU ưa thích hơn sẽ có nhiều cờ hơn, nhưng ba cờ này là phổ biến và thường xuyên được sử dụng.