Go 中 Nor 触发器逻辑门的实现

Implementation of Nor Flip Flop Logic Gates in Go

我正在尝试在 Go 中实现以下非触发器电路逻辑,但在变量声明方面遇到了一些困难:

我的目标是模拟逻辑门和电路,就像它在物理上工作一样。我已经为或非门 [func nor()] 和触发器本身 [func norFlipFlop()] 实现了一个函数。我面临的问题是声明 out0 和 out1,因为它们相互依赖。如下所示,out0 定义为 nor(a1, out1),out1 定义为 nor(out0, a0)。这显然会吐出一个编译错误,因为在定义 out0 时 out1 尚未初始化和定义。有没有办法让这个逻辑工作,同时尽可能接近物理电路逻辑?

func nor(a int, b int) int {
    if a + b == 0 {
        return 1
    } else {
        return 0
    }
}   

func norFlipFlop(a1 int, a0 int) (int, int) {
    out0 := nor(a1, out1)
    out1 := nor(out0, a0)
    return out1, out0
}

func main() {
    out1, out0 := norFlipFlip(1, 1)
    out := fmt.Sprint(out1, out0)
    fmt.Println(out)
}

首先,触发器存储状态,因此您需要某种值来保留状态。此外,除了 A0 和 A1 为 0(假)且 Out0 和 Out1 均为 1(真)的情况(通常在硬件中避免)之外,输出(Out0 和 Out1)通常是彼此互补的,并且是一个有效的触发器只存储一个布尔值,所以你可以只使用 bool。您通常 "pulse" 用于设置(设为真)或重置(设为假)触发器值的输入。例如:

package main

import "fmt"

type flipFlop bool

func (ff flipFlop)GetOut0() bool {
    return bool(ff)
}

func (ff flipFlop)GetOut1() bool {
    return !bool(ff)
}

func (ff *flipFlop)PulseA0() {
    *ff = true
}

func (ff *flipFlop)PulseA1() {
    *ff = false
}

func main() {
    var ff flipFlop
    ff.PulseA0()
    fmt.Println(ff.GetOut0(), ff.GetOut1())
    ff.PulseA1()
    fmt.Println(ff.GetOut0(), ff.GetOut1())
}

如果您想更接近地模拟硬件,您需要跟踪硬件状态。也许是这样的:

package main

import "fmt"

type flipFlop struct {
    A0, A1 bool
    out0, out1 bool
}

func nor(a, b bool) bool { return !(a || b) }

func (ff *flipFlop)Eval() {
    // Evaluate the circuit until it is stable
    for {
        prev0, prev1 := ff.out0, ff.out1
        ff.out0 = nor(ff.A1, ff.out1)
        ff.out1 = nor(ff.A0, ff.out0)
        if ff.out0 == prev0 && ff.out1 == prev1 {
            break // flip flop is stable
        }
    }
}

func main() {
    var ff flipFlop
    fmt.Println(ff)

    // Pulse a0
    ff.A0 = true
    ff.Eval()
    fmt.Println(ff)
    ff.A0 = false
    ff.Eval()
    fmt.Println(ff)

    // Pulse a1
    ff.A1 = true
    ff.Eval()
    fmt.Println(ff)
    ff.A1 = false
    ff.Eval()
    fmt.Println(ff)
}

希望这对您有所帮助(顺便说一句,我不是电子工程师 :)。