繁体   English   中英

仅使用加法和减法(8 位)的通用门(NOR 或 NAND)运算符

[英]Universal Gate (NOR or NAND) Operator using Only Addition and Subtraction (8 bit)

我正在构建一个Ben Eater 的 8 位计算机的实现,最后声称它将通过添加条件跳转指令来完成图灵。 如果这是真的,那么应该可以使用仅执行加法和减法的 ALU 来执行逻辑运算符,例如 AND、OR、NOT... 等。

如何仅使用加法或减法来实现 NAND 或 NOR(通用门运算符)? 考虑到机器有 16 字节的 RAM 和 2 字节的寄存器,是否有可能做到这一点?

我认为 16 字节 RAM 是限制因素,但一般来说,使用带有加法器的 ALU 可以实现任何逻辑功能。 诀窍是不要考虑位级别的事情,而是考虑使用完整的指令集(无论它可能有多么有限)来编写子程序或小程序来做我们想做的事情。

例如,我们可以使用具有以下伪汇编的 16 元素查找表来创建 2 位 NOR 运算。 假设 A 和 B 是 2 位数字 A 1 A 0和 B 1 B 0 ,并且内存中存在一个名为nor_array的 16 元素数组,定义为{ 0b11, 0b10, 0b01, 0b00, 0b10, ... }

add a, a, a           // A = A + A, this is basically A = 2*A which effects a left shift
add a, a, a           // Same, only now A is equal to the original A * 4
add a, a, b           // A = A + B. A now has the original value of A in position [3,2]
                      // and the original value of B in position [1,0]
load a, nor_array[a]  // Load A with the value in memory at the nor_array base addr + A

请注意 nor_array 的元素是如何设置为等于数组索引的第 0 位和第 2 位 nor'd 一起以及第 1 位和第 3 位一起 nor'd 的。

nor_array[0000] = 0b11 // 0 NOR 0 = 1 ; 0 NOR 0 = 1
nor_array[0001] = 0b10 // 0 NOR 0 = 1 ; 0 NOR 1 = 0
nor_array[0010] = 0b01 // 0 NOR 1 = 0 ; 0 NOR 0 = 1
nor_array[0011] = 0b00 // 0 NOR 1 = 0 ; 0 NOR 1 = 0
nor_array[0100] = 0b10 // 0 NOR 0 = 1 ; 1 NOR 0 = 0
...

所以 A 和 B 一起定义了 16 个唯一的输入组合,我们可以通过在内存中查找我们预先计算为 A 和 B 之间的 NOR 运算结果的值来实现 NOR 运算。我们可以以这种方式对 2 位数字进行任何逻辑运算,我相信可以扩展这些小子程序,使其也能够通过仅以如下方式移动操作数来对 A 和 B 的任意长值实现逻辑运算一次建立最终结果 2 位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM