我试图在Go中实现下面的也不翻转电路逻辑,但在变量声明方面遇到了一些困难。
我的目标是模拟物理工作时的逻辑门和电路。我已经实现了nor门的函数[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
. 您通常通过 "脉冲 "输入来设置(使之为真)或重置(使之为假)触发器的值。 例如,如果你想更紧密地模拟硬件,你需要跟踪硬件的状态,你可以通过 "脉冲 "输入来设置(使真)或重置(使假)触发器的值。
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)
}
我希望这能帮到你(BTW我不是电子工程师:)。