DEV Community

Weerasak Chongnguluam
Weerasak Chongnguluam

Posted on

จำลอง Binary Adder Logic จากหนังสือ Code ด้วย Go

ตอนนี้กำลังอ่านหนังสือที่ชื่อว่า Code เล่มนี้อยู่

Alt Text

ถึงบทที่ชื่อว่า 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,
    ))
}
Enter fullscreen mode Exit fullscreen mode

เมื่อลองรันจะได้

go run main.go
A 🌑 🌕 🌕 🌕 🌕 🌕 🌕 🌕 🌑
B 🌑 🌑 🌑 🌑 🌑 🌑 🌑 🌑 🌕
= 🌑 🌕 🌕 🌕 🌕 🌕 🌕 🌕 🌕
Enter fullscreen mode Exit fullscreen mode

Top comments (0)