提问人:RogueKnight 提问时间:5/23/2020 更新时间:5/23/2020 访问量:205
Go 中 Nor 触发器逻辑门的实现
Implementation of Nor Flip Flop Logic Gates in Go
问:
我正在尝试在 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)
}
答:
3赞
Andrew W. Phillips
5/23/2020
#1
首先,触发器存储状态,因此您需要某种值来保留状态。此外,除了 A0 和 A1 为 0 (false) 且 Out0 和 Out1 均为 1 (true) 的情况(通常在硬件中避免)之外,输出(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)
}
我希望这会有所帮助(顺便说一句,我不是电子工程师:)。
评论
0赞
RogueKnight
5/23/2020
这真的很有帮助,我非常感谢!让我来玩一玩,让你知道它是怎么回事。
0赞
RogueKnight
5/24/2020
我能够让它与您的解决方案一起工作。感谢您的帮助!我正在模拟我在 Go 中设计的简单 8 位 CPU。我可能会将代码开源,并在我获得更多工作后共享它。我真的很感谢你的帮助!谢谢!
评论
int
bool