วงจรบวก

**วงจรบวก** (Adder) เป็นวงจรเชิงผสม ที่ใช้บวกเลขฐานสอง ซึ่งเป็นหน่วยคำนวณและตรรกะ ชนิดหนึ่ง มักใช้เป็นกรณีศึกษาของการออกแบบวงจรเชิงผสม

## วงจรบวกหนึ่งบิต
วงจรบวกหนึ่งบิตมักแบ่งออกเป็นสองประเภท ดังนี้

### วงจรบวกหนึ่งบิตครึ่งอัตรา
**วงจรบวกหนึ่งบิตครึ่งอัตรา** (Single bit Half-Adder) เป็นวงจรบวกมีอินพุตหนึ่งบิตสองค่า วงจรจะบวกเลขและให้ค่าสองค่าคือ ค่าผลรวม (Sum) และตัวทด (Carry) โดยวงจรนี้จะได้ค่าผลรวมและตัวทดตามตารางต่อไปนี้


ตารางแสดงค่าของ Half-Adder

ลักษณะของการต่อวงจรแบบ Half-Adder คือดังต่อไปนี้


ไฟล์:Half-adder.svg

เป็นการต่อวงจร Half-Adder แบบการใช้ XOR-Gate 

จากรูปทั้งสองจะเห็นได้ว่าการใช้ XOR-Gate ช่วยลดจำนวน Gate ที่ใช้ลงไปได้เป็นอย่างมากและยังช่วยลดความซับซ้อนของวงจรได้อีกด้วย ลักษณะของสมาการ Half-Adder คือ 

:Sum = A \oplus B

:Carry = A \cdot B

วงจรบวกนี้นอกจากจะใช้บวกเลขหนึ่งบิตสองอันแล้ว ยังใช้สำหรับหาผลบวกเลขโดดของเลขสองบิตหรือที่เรียกว่า 2:2 compressor

### วงจรบวกหนึ่งบิตเต็มอัตรา

วงจรบวกหนึ่งบิตเต็มอัตรา (Single bit Full-Adder) เป็นวงจรที่ใช้ในการบวกเลขฐานสองเช่นกันแต่จะสามารถบวกได้มากกว่า Half-Adder โดยจะมีอินพุตหนึ่งบิตสามค่า คือสองค่าที่จะบวก และ ตัวทดเข้า (Carry in) จากภายนอก เพื่อเชื่อมตัวกับวงจรตัวอื่น (เช่น 1112+1012=11002 ตัว 1 และ 0 ที่เป็นตัวหนา ย่อมมีตัวทดจากหลักที่แล้วเข้ามา เป็นต้น) วงจรจะบวกเลขและให้ค่าสองค่าคือ ค่าผลรวม (Sum) และตัวทด (Carry) เช่นเดียวกับ Half-Adder ซึ่งแสดงได้ตามตารางค่าความจริงต่อไปนี้



ตารางแสดงค่าของ Full-Adder

ลักษณะสมการของวงจร Full-Adder คือ 

:Sum = A \oplus B \oplus C_{in}

:Carry_{out} = (A \cdot B)+ (C_{in} \cdot (A \oplus B))

ลักษณะของวงจร Full-Adder สามารถต่อได้หลายแบบ คือการนำ Half-Adder 2 ตัว และ OR-Gate 1 ตัวมาต่อรวมกัน หรือการใช้ XOR เพียง 2 ตัวต่อกันก็เป็น Full-Adder ได้เช่นกัน โดยมีลักษณะวงจรดังต่อไปนี้

ไฟล์:Full Adder Modules.svg

การต่อวงจร Full-Adder แบบใช้ Half-Adder 2 ชุดกับ OR-Gate 1 ตัว มาต่อรวมกัน

ไฟล์:Full-adder.svg

การใช้ XOR-Gate 2 ตัว มาต่อเป็นวงจร Full-Adder

จากรูปข้างต้นจะเห็นได้ว่าการต่อวงจร Full-Adder แบบใช้ XOR-Gate 2 ตัว นั้นจะไม่มี Output ของ Carry Out ออกมาด้วยซึ่งต่างกับแบบแรกที่มี Output เป็น Carry Out ออกมาด้วย แต่จะเห็นได้ว่ามีการใช้จำนวน Gate ต่างกันอย่างชัดเจน
วงจรบวกนี้เราสามารถมองได้ว่ามันบวกเลขหนึ่งบิตสามอันได้ จึงใช้หาผลบวกเลขโดดของเลขสามบิตหรือที่เรียกว่า 3:2 compressor

## วงจรบวกหลายบิตและหลักการการทด

วงจรบวกหลายบิต (Multiple-bit Adder) คือการสร้างวงจรบวกให้สามารถรับอินพุตได้มากขึ้น กล่าวคือบวกเลขได้หลายบิตนั้นเอง หลักการสร้างก็คือการนำ Full-Adder หลาย ๆ ตัวมาต่อรวม ๆ กันเป็นวงจรใหญ่ ๆ เพื่อที่จะได้คำนวณให้ได้หลายบิตมากขึ้นโดยเมื่อมีการต่อวงจรแบบนี้แล้วจะมีการคำนวณการทด ได้หลายแบบดังเช่นการทดแบบริปเปอร์ หรือ การทดแบบดูตัวทดล่วงหน้า เป็นต้น

### การทดแบบริปเปอร์

การทดแบบริปเปอร์ (Ripple Carry Adder) คือการทดโดย เมื่อมีการต่อวงจรบวกหลาย ๆ ตัวจะต้องมีการส่งตัวทด (Carry) ไปให้กับวงจรบวกตัวต่อไปเพื่อคำนวณด้วย (โดยคำว่า Ripple นั้นแปลว่า ระลอก) เพราะฉะนั้น Ripple Carry Adder คือวงจรบวกที่มีการส่งตัวทดเป็นระลอกนั้นเอง ลักษณะวงจรคือ

ไฟล์:4-Bit Full Adder.svg

การต่อวงจรลักษณะนี้มีข้อเสียคือ จะทำให้วงจรมีการทำงานที่ช้าลงเมื่อมีการต่อลอจิกเกตมากขึ้นเพราะว่าจากสมการ Carry ของ Full-Adder จะเห็นได้ว่าจำเป็นต้องมีการรอ Carry-in ก่อนที่จะคำนวณต่อไปได้

### การทดแบบดูตัวทดล่วงหน้า

การทดแบบดูตัวทดล่วงหน้า (Carry-look-Ahead) คือการทดโดยให้วงจรบวกสามารถคาดเดาก่อนได้ว่าจะมีตัวทดมาหรือไม่ โดยดูบิตการบวกคู่หลัง เพราะถ้ามีตัวทดอย่างแน่นอน (บิตหลังเป็น 1 กับ 1) หรือไม่มีตัวทดอย่างแน่นอน (บิตหลังเป็น 0 กับ 0) ก็จะได้คำตอบทันทีไม่ต้องรอตัวทดเข้า เช่นนี้ก็ไม่ต้องรอการส่งผ่านแบบ Ripple-Carry-Adder โดยในวิธีนี้จะช่วยเพิ่มความเร็วให้กับวงจรขนาดใหญ่ได้เพราะไม่จำเป็นต้องรอ Carry-in จาก Full-Adder ตัวข้างหลัง สามารถคำนวณ Carry ออกมาได้พร้อมกับการคำนวณ Sum ได้เลยลักษณะของสูตร Carry-look-Ahead คือ

:Carry_{out} = C_{g} + C_{p} \cdot C_{in} 

:C_{p} = A + B 

:C_{g} = A \cdot B 

ลัษณะการนำไปใช้งาน

ในกรณี Full-Adder แบบ 1 บิต Carry_{out1} = C_{g1} + C_{p1} \cdot C_{in} 

ในกรณี Full-Adder แบบ 2 บิต Carry_{out2} = C_{g2} + C_{p2} \cdot C_{out1} 

ในกรณี Full-Adder แบบ 3 บิต Carry_{out3} = C_{g3} + C_{p3} \cdot C_{out2} 

จะเห็นได้ว่าจะสมการสามารถนำสมการข้างบนลงไปแทนได้เรื่อย ๆ จึงไม่มีข้อจำกัดของจำนวนบิตที่ต้องการ แต่ในกรณีที่จำนวนบิตมีมากเกินไปอาจจะทำให้วงจรยุ่งยากซับซ้อนได้



ตารางแสดงค่า Delay ระหว่าง Ripple-Carry และ Carry-look-Ahead


### ส่วนการดูตัวทดล่วงหน้า
ส่วนการดูตัวทดล่วงหน้า (Lookahead Carry Unit) เป็นวิธีการหนึ่งที่ลดปัญหาการคำนวณซ้ำ ๆ ของ Carry-look-Ahead เมื่อสร้างวงจรบวกบิตมาก ๆ โดยจะสร้างส่วนมาพิจารณาตัวทดโดยเฉพาะ โดยแบ่งเป็นบิตย่อย ๆ เรียกส่วนนี้ว่า ส่วนการดูตัวทดล่วงหน้า
ไฟล์: 64-bit lookahead carry unit.svg

## ดูเพิ่ม
*วงจรลบ

หมวดหมู่:วงจรดิจิทัล