Tôi sẽ cố gắng cung cấp cho bạn ý tưởng về cách các mạch kỹ thuật số được thiết kế để giải quyết các vấn đề xử lý kỹ thuật số bằng cách sử dụng các vấn đề bạn đặt ra: làm thế nào để CPU thực hiện các phép cộng và phép nhân.
Đầu tiên, hãy đặt câu hỏi trực tiếp ra khỏi cách: làm thế nào để một ngôn ngữ lập trình đánh giá hiệu quả các phép nhân và bổ sung. Câu trả lời rất đơn giản, họ biên dịch chúng thành bội số và thêm hướng dẫn. Ví dụ: đoạn mã sau:
a = 1 + 1;
b = a * 20;
được biên dịch đơn giản thành một cái gì đó như:
ADD 1 1 a
MUL a 20 b
(lưu ý rằng phần lắp ráp ở trên dành cho CPU tưởng tượng không tồn tại, vì đơn giản).
Tại thời điểm này, bạn nhận ra rằng câu trả lời trên chỉ đơn giản là thay đổi vấn đề và giải quyết nó bằng phép thuật phần cứng. Câu hỏi tiếp theo rõ ràng là ma thuật phần cứng đó hoạt động như thế nào?
Trước tiên hãy xem xét vấn đề đơn giản hơn: bổ sung.
Đầu tiên chúng ta làm một vấn đề quen thuộc, thêm vào 10 số cơ bản thông thường:
17
+28
Bước đầu tiên sẽ là thêm 7 và 8. Nhưng kết quả này là 15, nhiều hơn một chữ số. Vì vậy, chúng tôi thực hiện 1:
(1)
17
+28
= 5
Bây giờ chúng ta thêm 1, 1 và 2 lại với nhau:
17
+28
=45
Vì vậy, từ điều này, chúng tôi nhận được các quy tắc sau:
khi kết quả của phép cộng nhiều hơn một chữ số, chúng tôi sẽ giữ chữ số có nghĩa ít nhất và chuyển tiếp chữ số có ý nghĩa nhất
nếu chúng ta có một chữ số được chuyển tiếp vào cột của mình, chúng ta sẽ thêm nó cùng với các số chúng ta thêm vào
Bây giờ là lúc để giải thích các quy tắc trên trong cơ sở 2 - đại số boolean.
Vì vậy, trong đại số boolean, cộng 0 và 1 với nhau = 1. Thêm 0 và 0 = 0. Và thêm 1 và 1 = 10 có nhiều hơn một chữ số để chúng ta tiến lên 1 về phía trước.
Từ đó chúng ta có thể xây dựng một bảng chân lý:
a b | sum carry
-------------------
0 0 | 0 0
0 1 | 1 0
1 0 | 1 0
1 1 | 0 1
Từ đó, chúng ta có thể xây dựng hai mạch / phương trình boolean - một cho đầu ra của tổng và một cho đầu ra của carry. Cách ngây thơ nhất là chỉ đơn giản là liệt kê ra tất cả các đầu vào. Bất kỳ bảng chân lý nào, dù lớn và phức tạp đều có thể được trình bày lại theo hình thức này:
(AND inputs in first row) OR (AND of inputs in second row) OR ...
Đây là cơ bản tổng số các hình thức sản phẩm. Chúng tôi chỉ nhìn vào kết quả đầu ra là 1 và bỏ qua 0:
sum = (NOT a AND b) OR (a AND NOT b)
Hãy thay thế VÀ HOẶC và KHÔNG bằng các ký hiệu ngôn ngữ lập trình để dễ đọc hơn:
sum = (!a & b) | (a & !b)
Về cơ bản, chúng tôi đã chuyển đổi bảng như vậy:
a b | sum equation
-------------------
0 0 | 0
0 1 | 1 (!a & b)
1 0 | 1 (a & !b)
1 1 | 0
Điều này có thể được thực hiện trực tiếp như một mạch:
_____
a ------------| |
\ | AND |-. ____
\ ,-NOT--|_____| \ | |
\/ `--| OR |----- sum
/\ _____ ,--|____|
/ `-NOT--| | /
/ | AND |-`
b ------------|_____|
Tại thời điểm này, các độc giả quan sát sẽ nhận thấy rằng logic trên thực tế có thể được triển khai như một cổng duy nhất - một cổng XOR thuận tiện có hành vi theo yêu cầu của bảng chân lý của chúng tôi:
_____
a ------------| |
| XOR |---- sum
b ------------|_____|
Nhưng nếu phần cứng của bạn không cung cấp cho bạn một cổng XOR, các bước ở trên là cách bạn tiến hành xác định và triển khai nó theo các cổng AND, OR và KHÔNG.
Cách bạn chuyển đổi cổng logic sang phần cứng thực tế phụ thuộc vào phần cứng bạn có. Chúng có thể được thực hiện bằng các cơ chế vật lý khác nhau miễn là cơ chế này cung cấp một số loại hành vi chuyển đổi. Các cổng logic đã được thực hiện với tất cả mọi thứ, từ tia nước hoặc luồng khí (chất lỏng) đến bộ chuyển đổi (thiết bị điện tử) đến viên bi rơi. Đó là một chủ đề lớn theo đúng nghĩa của nó vì vậy tôi sẽ chỉ đề cập đến nó và nói rằng có thể thực hiện các cổng logic như các thiết bị vật lý.
Bây giờ chúng tôi làm tương tự cho tín hiệu mang. Vì chỉ có một điều kiện trong đó tín hiệu mang là đúng, nên phương trình đơn giản là:
carry = a & b
Vì vậy, thực hiện rất đơn giản:
_____
a ------------| |
| AND |---- carry
b ------------|_____|
Kết hợp chúng lại với nhau, chúng ta sẽ có được cái gọi là nửa cộng:
_____
a ------;-----| |
| | XOR |---- sum
b --;---|-----|_____|
| | _____
| '-----| |
| | AND |---- carry
'---------|_____|
Các phương trình cho mạch trên bằng cách này trông như thế này:
sum = a ^ b
carry = a & b
Bộ cộng một nửa là thiếu một cái gì đó. Chúng tôi đã thực hiện quy tắc đầu tiên - nếu kết quả nhiều hơn một chữ số so với chuyển tiếp, nhưng chúng tôi đã không thực hiện quy tắc thứ hai - nếu có một quy tắc cộng thêm cùng với các số.
Vì vậy, để thực hiện một bộ cộng đầy đủ, một mạch thêm có thể thêm các số có nhiều hơn một chữ số, chúng ta cần xác định một bảng chân lý:
a b c | sum carry
---------------------
0 0 0 | 0 0
0 0 1 | 1 0
0 1 0 | 1 0
0 1 1 | 0 1
1 0 0 | 1 0
1 0 1 | 0 1
1 1 0 | 0 1
1 1 1 | 1 1
Phương trình tổng là bây giờ:
sum = (!a & !b & c) | (!a & b & !c) | (a & !b & !c) | (a & b & c)
Chúng ta có thể trải qua quá trình tương tự để xác định và đơn giản hóa phương trình và giải thích nó như một mạch, v.v. như chúng ta đã làm ở trên nhưng tôi nghĩ câu trả lời này đang trở nên quá dài.
Bây giờ bạn sẽ có một ý tưởng về cách logic kỹ thuật số được thiết kế. Có những thủ thuật khác mà tôi chưa đề cập như bản đồ Karnaugh (được sử dụng để đơn giản hóa các bảng chân lý) và các trình biên dịch logic như espresso (để bạn không phải tính các phương trình boolean bằng tay) nhưng cơ bản là những gì tôi đã đã nêu ở trên:
Phân tích vấn đề cho đến khi bạn có thể làm việc ở mức một bit (chữ số).
Xác định kết quả đầu ra mà bạn muốn bằng bảng chân lý.
Chuyển đổi bảng thành phương trình boolean và đơn giản hóa phương trình.
Giải thích phương trình như cổng logic.
Chuyển đổi mạch logic của bạn sang các mạch phần cứng thực bằng cách thực hiện các cổng logic.
Đó là cách giải quyết các vấn đề cơ bản (hay đúng hơn là cấp độ thấp) - rất nhiều và rất nhiều bảng chân lý. Công việc sáng tạo thực sự nằm trong việc phá vỡ một nhiệm vụ phức tạp như giải mã MP3 thành cấp độ bit để bạn có thể làm việc với nó bằng các bảng chân lý.
Xin lỗi tôi không có thời gian để giải thích cách thực hiện phép nhân. Bạn có thể thử bẻ khóa nó bằng cách tìm ra các quy tắc về thời gian nhân lên sau đó diễn giải nó thành nhị phân sau đó thử chia nó thành các bảng chân lý. Hoặc bạn có thể đọc Wikipedia: http://en.wikipedia.org/wiki/Binary_multiplier