ตอนนี้กำลังอ่านหนังสือที่ชื่อว่า Code เล่มนี้อยู่
ถึงบทที่ชื่อว่า A Binary Adding Machine ซึ่งทำให้ดูว่าเราจะสร้าง วงจรบวกเลขผ่าน Logic Gate เช่น XOR, AND และ OR gate ได้ยังไงบ้าง
ซึ่งการบวก ก็จะต้องคำนึงถึงตัวทด (carry) ด้วย สุดท้ายของบทนี้เราก็ได้วงจร FullAdder ที่ input จะมีตัวทดด้วยสำหรับบวกตัวทดของหลักก่อนหน้า
ส่วนการคำนวนผลบวกของเลข 1 BIT นั้นเราจะใช้ XOR gate และ การคำนวณตัวทดเราจะใช้ AND gate แต่ว่านี่จะทำให้ได้แค่ HalfAdder พอเป็น FullAdder จะใช้ OR gate คำนวณ carry สุดท้ายที่ด้วยด้วยโดยเอา carry ของ A บวก B ไป OR กับ carry ของผลบวกของ A กับ B และ carry input นั่นเอง
สุดท้ายเราก็จะเอา FullAdder มาสร้างวงจรของการบวก 8 BITS ได้
นี่คือโค้ด Go ที่ลองเขียนจำลองตามในหนังสือ
package main
import "fmt"
type BIT byte
const (
O BIT = iota
I
)
func (b BIT) String() string {
if b == O {
return "🌑"
} else {
return "🌕"
}
}
func FullAdder(cin, a, b BIT) (cout, out BIT) {
o1 := a ^ b // a XOR b
c1 := a & b // a AND b
out = cin ^ o1 // cin XOR o1
cout = c1 | (cin & o1) // c1 OR (cin AND o1)
return
}
func Add8BIT(
a7, a6, a5, a4, a3, a2, a1, a0,
b7, b6, b5, b4, b3, b2, b1, b0 BIT) (c, o7, o6, o5, o4, o3, o2, o1, o0 BIT) {
c, o0 = FullAdder(c, a0, b0)
c, o1 = FullAdder(c, a1, b1)
c, o2 = FullAdder(c, a2, b2)
c, o3 = FullAdder(c, a3, b3)
c, o4 = FullAdder(c, a4, b4)
c, o5 = FullAdder(c, a5, b5)
c, o6 = FullAdder(c, a6, b6)
c, o7 = FullAdder(c, a7, b7)
return
}
func PResult(c, o7, o6, o5, o4, o3, o2, o1, o0 BIT) {
fmt.Println(c, o7, o6, o5, o4, o3, o2, o1, o0)
}
func main() {
fmt.Println("A", O, I, I, I, I, I, I, I, O)
fmt.Println("B", O, O, O, O, O, O, O, O, I)
fmt.Print("= ")
PResult(Add8BIT(
I, I, I, I, I, I, I, O,
O, O, O, O, O, O, O, I,
))
}
เมื่อลองรันจะได้
go run main.go
A 🌑 🌕 🌕 🌕 🌕 🌕 🌕 🌕 🌑
B 🌑 🌑 🌑 🌑 🌑 🌑 🌑 🌑 🌕
= 🌑 🌕 🌕 🌕 🌕 🌕 🌕 🌕 🌕
Top comments (0)