หน่วยประมวลผลทางตรรกะและคณิตศาสตร์ (ALU)
สรุปใจความสำคัญ
- ALU เป็นส่วนประกอบหลักของ CPU, GPU และ FPU ที่ทำหน้าที่คำนวณเลขฐานสอง
- รับข้อมูลนำเข้าเป็น Operands และคำสั่งการทำงานผ่าน Opcode
- รองรับทั้งการคำนวณทางคณิตศาสตร์ (บวก, ลบ, คูณ, หาร) และการดำเนินการทางตรรกะ (AND, OR, XOR, NOT)
- มีสัญญาณสถานะ (Flags) เช่น Zero, Carry, Negative และ Overflow เพื่อแจ้งลักษณะของผลลัพธ์
หน่วยประมวลผลทางตรรกะและคณิตศาสตร์ หรือ ALU (Arithmetic Logic Unit) คือวงจรดิจิทัลแบบผสม (Combinational Digital Circuit) ที่ทำหน้าที่ประมวลผลการคำนวณทางคณิตศาสตร์และการดำเนินการทางตรรกะ (Bitwise Operations) กับข้อมูลตัวเลขจำนวนเต็มในรูปแบบเลขฐานสอง (Integer Binary Numbers) ALU ถือเป็นส่วนประกอบพื้นฐานที่สำคัญที่สุดอย่างหนึ่งของหน่วยประมวลผลกลาง (CPU) รวมถึงหน่วยประมวลผลทศนิยม (FPU) และหน่วยประมวลผลกราฟิก (GPU)
การทำงานพื้นฐานของ ALU
การทำงานของ ALU จะรับข้อมูลนำเข้า (Inputs) และประมวลผลออกมาเป็นผลลัพธ์ (Outputs) โดยมีองค์ประกอบหลักของสัญญาณดังนี้:
1. ข้อมูลนำเข้าและผลลัพธ์ (Data)
โดยทั่วไป ALU จะมีบัสข้อมูลขนาน (Parallel Data Buses) 3 ชุดหลัก ได้แก่:
- ตัวถูกดำเนินการ A (Operand A): ข้อมูลตัวเลขชุดแรกที่นำมาประมวลผล
- ตัวถูกดำเนินการ B (Operand B): ข้อมูลตัวเลขชุดที่สองที่นำมาประมวลผล
- ผลลัพธ์ Y (Result Y): ข้อมูลที่ได้จากการประมวลผลซึ่งจะถูกส่งออกไปยังรีจิสเตอร์หรือหน่วยความจำ
ความกว้างของบัสข้อมูลเหล่านี้มักจะเท่ากับขนาดคำ (Word Size) ของสถาปัตยกรรมคอมพิวเตอร์นั้นๆ เช่น 32 บิต หรือ 64 บิต
2. รหัสคำสั่ง (Opcode)
Opcode (Operation Code) คือสัญญาณนำเข้าที่ระบุว่า ALU ควรดำเนินการใดกับข้อมูลนำเข้า เช่น การบวก การลบ หรือการเปรียบเทียบทางตรรกะ ขนาดของบัส Opcode จะเป็นตัวกำหนดจำนวนการดำเนินการที่ ALU สามารถทำได้ ตัวอย่างเช่น หาก Opcode มีขนาด 4 บิต จะสามารถรองรับคำสั่งที่แตกต่างกันได้สูงสุด 16 คำสั่ง
3. สัญญาณสถานะ (Status Signals)
ALU จะมีการส่งสัญญาณสถานะเพื่อแจ้งข้อมูลเพิ่มเติมเกี่ยวกับผลลัพธ์ที่เกิดขึ้น ซึ่งมักจะถูกเก็บไว้ใน Status Register หรือ Flags Register:
- Carry-out (ตัวทด): แจ้งว่ามีการทดเลขจากการบวก หรือมีการยืมเลขจากการลบ
- Zero (ศูนย์): แจ้งว่าผลลัพธ์ที่ได้มีค่าเป็นศูนย์ทั้งหมด
- Negative (ค่าลบ): แจ้งว่าผลลัพธ์ที่ได้มีค่าเป็นลบ
- Overflow (ค่าเกิน): แจ้งว่าผลลัพธ์ที่ได้มีค่าเกินกว่าช่วงที่ตัวแปรจะสามารถจัดเก็บได้
- Parity (พาริตี้): แจ้งว่าจำนวนบิตที่มีค่าเป็น 1 ในผลลัพธ์เป็นจำนวนคู่หรือคี่
นอกจากนี้ ALU ยังอาจมีสัญญาณนำเข้าสถานะ เช่น Carry-in เพื่อนำตัวทดจากรอบการคำนวณก่อนหน้ามาใช้ในการคำนวณปัจจุบัน
ประเภทของการดำเนินการใน ALU
การดำเนินการของ ALU สามารถแบ่งออกเป็นสองกลุ่มหลัก:
การดำเนินการทางคณิตศาสตร์ (Arithmetic Operations)
เป็นการคำนวณตัวเลขพื้นฐาน เช่น:
- การบวก (Addition): ใช้ชุดวงจร Adder (เช่น Half Adder, Full Adder)
- การลบ (Subtraction): มักทำโดยการแปลงตัวเลขเป็น Two's Complement แล้วนำไปบวก
- การคูณและการหาร (Multiplication and Division): ใน ALU พื้นฐานอาจใช้การบวกและเลื่อนบิตซ้ำๆ หรือใช้ชุดวงจรเฉพาะ เช่น Wallace Tree สำหรับการคูณ
การดำเนินการทางตรรกะ (Logic Operations)
เป็นการดำเนินการระดับบิต (Bitwise Operations) โดยใช้ลอจิกเกต (Logic Gates) เช่น:
- AND: ผลลัพธ์เป็น 1 เมื่ออินพุตทุกตัวเป็น 1
- OR: ผลลัพธ์เป็น 1 เมื่อมีอินพุตอย่างน้อยหนึ่งตัวเป็น 1
- XOR: ผลลัพธ์เป็น 1 เมื่ออินพุตทั้งสองตัวต่างกัน
- NOT: การกลับค่าบิต (Inversion)
- การเลื่อนบิต (Bit Shifts): การเลื่อนตำแหน่งของบิตไปทางซ้ายหรือขวา เพื่อใช้ในการคูณหรือหารด้วยเลขยกกำลังของสองอย่างรวดเร็ว
ลักษณะทางกายภาพและการทำงานของวงจร
ALU เป็นวงจรลอจิกแบบผสม ซึ่งหมายความว่าผลลัพธ์จะเปลี่ยนแปลงตามอินพุตที่เปลี่ยนไปโดยไม่มีการรอสัญญาณนาฬิกาภายในตัวมันเอง อย่างไรก็ตาม ในระบบคอมพิวเตอร์จริง จะมีระยะเวลาที่เรียกว่า Propagation Delay (ความล่าช้าในการแพร่สัญญาณ) ซึ่งเป็นเวลาที่สัญญาณไฟฟ้าต้องเดินทางผ่านเกตต่างๆ จนกว่าผลลัพธ์จะนิ่งและถูกต้อง วงจรภายนอก (เช่น Control Unit) จึงต้องควบคุมให้สัญญาณอินพุตคงที่และรอจนกว่าจะพ้นช่วงเวลาดังกล่าวก่อนที่จะอ่านค่าผลลัพธ์ออกไป
คำถามที่พบบ่อย
ALU แตกต่างจาก FPU อย่างไร?
ALU (Arithmetic Logic Unit) ประมวลผลข้อมูลตัวเลขจำนวนเต็ม (Integer) ในขณะที่ FPU (Floating Point Unit) ถูกออกแบบมาเพื่อประมวลผลตัวเลขทศนิยม (Floating Point) โดยเฉพาะ
Opcode คืออะไรในบริบทของ ALU?
Opcode คือรหัสคำสั่งที่ส่งไปยัง ALU เพื่อระบุว่าต้องการให้ทำการดำเนินการใด เช่น หากส่งรหัส 0010 อาจหมายถึงการสั่งให้ ALU ทำการบวกข้อมูลนำเข้าสองชุด
สัญญาณ Overflow ใน ALU หมายถึงอะไร?
Overflow เกิดขึ้นเมื่อผลลัพธ์ของการคำนวณทางคณิตศาสตร์มีค่ามากเกินกว่าที่ขนาดบิตของรีจิสเตอร์ผลลัพธ์จะสามารถจัดเก็บได้ ทำให้ค่าที่ได้ผิดเพี้ยนไปจากความเป็นจริง

