ฉันจะพยายามอธิบายให้คุณทราบถึงวิธีการออกแบบวงจรดิจิตอลเพื่อแก้ปัญหาการประมวลผลดิจิตอลโดยใช้ปัญหาที่คุณโพสต์: ซีพียูใช้การเพิ่มเติมและการคูณอย่างไร
ประการแรกขอคำถามโดยตรงจากวิธี: ภาษาการเขียนโปรแกรมมีประสิทธิภาพในการประเมินการคูณและการเพิ่มเติมได้อย่างไร คำตอบนั้นง่ายพวกเขารวบรวมพวกเขาเป็นทวีคูณและเพิ่มคำแนะนำ ตัวอย่างเช่นรหัสต่อไปนี้:
a = 1 + 1;
b = a * 20;
เรียบเรียงเป็นบางสิ่งเช่น:
ADD 1 1 a
MUL a 20 b
(โปรดทราบว่าชุดประกอบด้านบนมีไว้สำหรับซีพียูจินตภาพที่ไม่มีอยู่จริงเพื่อความเรียบง่าย)
ณ จุดนี้คุณรู้ว่าคำตอบข้างต้นเพียงแค่เปลี่ยนปัญหาและแก้ปัญหาด้วยเวทมนตร์ฮาร์ดแวร์ คำถามการติดตามเห็นได้ชัดว่าฮาร์ดแวร์เวทย์นั้นทำงานอย่างไร?
ให้ดูที่ปัญหาง่ายกว่าก่อน: นอกจากนี้
ครั้งแรกที่เราทำปัญหาที่คุ้นเคยเพิ่มหมายเลขฐาน 10 ตามปกติ:
17
+28
ขั้นตอนแรกคือการบวก 7 และ 8 แต่ผลลัพธ์นี้ใน 15 ซึ่งมากกว่าหลักเดียว ดังนั้นเราจึงนำ 1:
(1)
17
+28
= 5
ตอนนี้เราเพิ่ม 1, 1 และ 2 เข้าด้วยกัน:
17
+28
=45
ดังนั้นจากนี้เราจะได้รับกฎต่อไปนี้:
เมื่อผลลัพธ์ของการเพิ่มมีมากกว่าหนึ่งหลักเราจะเก็บเลขนัยสำคัญน้อยที่สุดและส่งต่อตัวเลขที่สำคัญที่สุดไปข้างหน้า
หากเรามีตัวเลขที่ถูกส่งต่อไปยังคอลัมน์ของเราเราจะเพิ่มเข้าไปพร้อมกับตัวเลขที่เราเพิ่มเข้าไป
ตอนนี้ได้เวลาตีความกฎข้างต้นในฐาน 2 - พีชคณิตแบบบูลแล้ว
ดังนั้นในพีชคณิตแบบบูลเพิ่ม 0 และ 1 เข้าด้วยกัน = 1 เพิ่ม 0 และ 0 = 0 และเพิ่ม 1 และ 1 = 10 ซึ่งเป็นตัวเลขมากกว่าหนึ่งหลักดังนั้นเราจึงดำเนินการไปข้างหน้า 1
จากนี้เราสามารถสร้างตารางความจริง:
a b | sum carry
-------------------
0 0 | 0 0
0 1 | 1 0
1 0 | 1 0
1 1 | 0 1
จากนี้เราสามารถสร้างสองวงจร / สมการบูลีน - หนึ่งสำหรับการส่งออกของผลรวมและอีกหนึ่งสำหรับการส่งออกของการดำเนินการ วิธีที่ไร้เดียงสาที่สุดคือการใส่รายการอินพุตทั้งหมด ตารางความจริงใด ๆ ไม่ว่าจะใหญ่และซับซ้อนเพียงใดที่สามารถเรียกคืนได้ในรูปแบบนี้:
(AND inputs in first row) OR (AND of inputs in second row) OR ...
นี่เป็นผลรวมของรูปแบบผลิตภัณฑ์ เราดูเฉพาะผลลัพธ์ที่ส่งผลให้ 1 และละเว้น 0s:
sum = (NOT a AND b) OR (a AND NOT b)
ลองเปลี่ยนสัญลักษณ์ภาษาและการเขียนโปรแกรมเพื่อให้ง่ายต่อการอ่าน:
sum = (!a & b) | (a & !b)
โดยพื้นฐานแล้วเราได้แปลงตารางดังนี้:
a b | sum equation
-------------------
0 0 | 0
0 1 | 1 (!a & b)
1 0 | 1 (a & !b)
1 1 | 0
สิ่งนี้สามารถนำมาใช้โดยตรงเป็นวงจร:
_____
a ------------| |
\ | AND |-. ____
\ ,-NOT--|_____| \ | |
\/ `--| OR |----- sum
/\ _____ ,--|____|
/ `-NOT--| | /
/ | AND |-`
b ------------|_____|
ณ จุดนี้ผู้อ่านที่สังเกตจะสังเกตเห็นว่าตรรกะข้างต้นสามารถนำไปใช้เป็นประตูเดียว - ประตู XOR ซึ่งมีพฤติกรรมที่ต้องการโดยตารางความจริงของเรา:
_____
a ------------| |
| XOR |---- sum
b ------------|_____|
แต่ถ้าฮาร์ดแวร์ของคุณไม่มีประตู XOR ให้คุณขั้นตอนข้างต้นเป็นวิธีการกำหนดและนำไปใช้ในแง่ของ AND, OR และ NOT เกต
วิธีที่คุณจะแปลงเกจลอจิกเป็นฮาร์ดแวร์จริงนั้นขึ้นอยู่กับฮาร์ดแวร์ที่คุณมี พวกเขาสามารถนำมาใช้โดยใช้กลไกทางกายภาพต่าง ๆ ตราบใดที่กลไกมีพฤติกรรมการสลับบางประเภท ประตูลอจิกถูกนำไปใช้กับทุกอย่างตั้งแต่หัวฉีดน้ำหรือพัฟของอากาศ (ของเหลว) ไปจนถึงตัวแปลงสัญญาณ (อุปกรณ์อิเล็กทรอนิกส์) ไปจนถึงหินอ่อนที่ตกลงมา มันเป็นหัวข้อใหญ่ในตัวของมันเองดังนั้นฉันจะทำมันให้จบและบอกว่ามันเป็นไปได้ที่จะใช้ตรรกะประตูเป็นอุปกรณ์ทางกายภาพ
ตอนนี้เราทำแบบเดียวกันกับสัญญาณส่ง เนื่องจากมีเพียงเงื่อนไขเดียวที่สัญญาณการถือเป็นจริงสมการจึงเป็นเพียง:
carry = a & b
ดังนั้นการพกพาจึงง่าย:
_____
a ------------| |
| AND |---- carry
b ------------|_____|
เมื่อรวมเข้าด้วยกันเราจะได้สิ่งที่เรียกว่าแอดเดอร์ฮาล์ฟ:
_____
a ------;-----| |
| | XOR |---- sum
b --;---|-----|_____|
| | _____
| '-----| |
| | AND |---- carry
'---------|_____|
สมการของวงจรข้างต้นโดยวิธีนี้:
sum = a ^ b
carry = a & b
บวกครึ่งจะหายไปบางสิ่งบางอย่าง เราได้นำกฎข้อแรกมาใช้ - หากผลลัพธ์มีมากกว่าหนึ่งหลักมากกว่านำไปข้างหน้า แต่เราไม่ได้นำกฎข้อที่สองไปใช้ - หากมีการเพิ่มที่นำไปรวมกับตัวเลข
ดังนั้นในการติดตั้งแอดเดอร์แบบเต็มวงจรเพิ่มที่สามารถเพิ่มตัวเลขที่มีมากกว่าหนึ่งหลักเราต้องกำหนดตารางความจริง:
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
สมการสำหรับผลรวมอยู่ในขณะนี้:
sum = (!a & !b & c) | (!a & b & !c) | (a & !b & !c) | (a & b & c)
เราสามารถผ่านกระบวนการเดียวกันเพื่อแยกแยะและทำให้สมการง่ายขึ้นและตีความมันเป็นวงจร ฯลฯ ตามที่เราทำไปแล้ว แต่ฉันคิดว่าคำตอบนี้ยาวเกินไป
ถึงตอนนี้คุณควรเข้าใจแนวคิดการออกแบบตรรกะดิจิทัล มีเทคนิคอื่น ๆ ที่ฉันไม่ได้กล่าวถึงเช่นแผนที่ Karnaugh (ใช้เพื่อทำให้ตารางความจริงง่ายขึ้น) และตรรกะคอมไพเลอร์เช่นเอสเปรสโซ (เพื่อให้คุณไม่ต้องแยกตัวประกอบสมการบูลีนด้วยมือ) แต่พื้นฐานคือสิ่งที่ฉัน ระบุไว้ข้างต้น:
สลายปัญหาจนกว่าคุณจะสามารถทำงานในระดับบิตเดียว (หลัก)
กำหนดผลลัพธ์ที่คุณต้องการโดยใช้ตารางความจริง
แปลงตารางเป็นสมการบูลีนและทำให้สมการง่ายขึ้น
ตีความสมการเป็นประตูตรรกะ
แปลงวงจรลอจิกของคุณเป็นวงจรฮาร์ดแวร์จริงโดยใช้ลอจิกเกต
นั่นเป็นวิธีที่ปัญหาพื้นฐาน (หรือค่อนข้างต่ำ) ได้รับการแก้ไขจริง ๆ - ตารางความจริงมากมาย งานสร้างสรรค์ที่แท้จริงคือการทำลายงานที่ซับซ้อนเช่นการถอดรหัส MP3 จนถึงระดับบิตเพื่อให้คุณสามารถทำงานกับตารางความจริงได้
ขออภัยฉันไม่มีเวลาอธิบายวิธีใช้การคูณ คุณสามารถลองดูที่รอยแตกโดยการหากฎว่าการคูณนานแค่ไหนแล้วตีความมันเป็นเลขฐานสองแล้วลองแยกมันออกเป็นตารางความจริง หรือคุณสามารถอ่าน Wikipedia: http://en.wikipedia.org/wiki/Binary_multiplier