如何找出二进制数是否为零


16

我是根据《计算系统元素》一书中给出的规范实施ALU的。我只遇到一个问题。如何查找给定数字是否为零。我可以做的一件事就是总线中的每一点,然后在其上应用非门。但是还必须有其他一些优雅的解决方案。


6
听起来好像并没有真正被卡住-更像是您不满意:)
vicatcu 2010年

7
X输入NOR 一个很好的解决方案。为了确定寄存器是否包含零,必须检查每个位以查看其是否包含逻辑0。您指定需要一个位输出。因此,您需要一些具有X输入和一个输出的功能,例如NOR。
W5VO 2010年

Answers:


14

似乎无法令人满意地对所有位进行“或”运算。但是,您也不限于硅中的两个输入门。您可以通过在上拉网络中放置4个串联p型晶体管和在下拉网络中放置4个并联n型晶体管来在CMOS逻辑中构建4输入或非门。这样可以减少树形拓扑的深度,从而减少传播延迟。尽管在串联晶体管两端的累积压降使上拉电阻不足以使其变为“ 1”之前,您只能采用该理论,如果我没记错的话,四是一个很好的经验法则。


对于更大数量的位,使用交替的NOR和NAND门是否有意义?例如,扇入为4个门,如果4个位为零,则64位零测试可使用16个NOR门提供1的结果;如果4个位均为1,则4个NAND门提供0的结果(所有16个原始位为0),然后将这四个结果发送到最终的NOR门。(我不是EE,但是这似乎比使用中间逆变器要好,以使全零结果恢复为0,并且仅使用或非门。)
Paul A. Clayton 2014年

也可能存在将零检测的延迟部分折叠为附加延迟的方法。
保罗·克莱顿

使用NMOS怎么办:如果任何输入为1,则使用一个上拉电阻器和X晶体管将电平降低至0?
Oskar Skog's


8

使用8位计算机的典型解决方案是ALU将产生许多“标志”位,这些位代表最新操作的结果。尽管可能有任意数量的标志位(即,您的CPU中的每个寄存器都可以有一个“ Z”标志),但这通常是您刚刚计算出的最有趣的东西,因此这样做是有一定意义的。

这些旧的CPU中的一些会为几乎每个数据移动自动设置标志位,而其他的CPU如果您突然需要知道某个寄存器是否为零,则要求您在代码中粘贴特定的“比较”指令。而且,无论是为每个寄存器提供零检查还是仅对计算出的内容进行零检查,检查“这个字是否为零”的方法确实比将所有位或或在一起要简单得多。


1
这也是32位ARM芯片的典型特征,并且可能是大多数体系结构的典型特征。对于ARM,APSR(应用程序状态寄存器)保留N,Z,C,V和Q位(负,零,进位,oVerflow和saturateQ)位,以提供除您要查找的零位以外的其他功能。 。这些对您的计算机可能有用,也可能没有帮助。
凯文·维米尔

我的解决方案不错,但是让我感到烦恼的是,我不得不使用太多的逻辑来只得到一点。必须有一些优雅的解决方案。
Rick_2047 2010年

@ Rick_2047-您没有提到要用什么实现它,但是我猜是FPGA吗?不得不捆绑任何数量的逻辑块只是为了进行高扇入门操作也会使我感到困惑。这是仅放入其中一个的很好的理由。
JustJeff

不完全是FPGA,而是HDL和硬件模拟器。
Rick_2047 2010年

3

某些CPU(例如MIPS)的寄存器始终包含零,因此非常快速地测试另一个寄存器是否为零。


如果我有一个包含零的寄存器,如何检查数字?我也想根据16位总线是否为零来生成一个正确或错误的位
Rick_2047

1
比较器...退化为
光荣的

如果寄存器很便宜(它们在FPGA的SRAM块中)并且他出于其他原因仍需要寄存器比较指令,那么他可能会以这种方式获得一些好处。
jpc

@vicatu-实际上,如果要比较两个N位数字,则需要N个2输入XOR门。OR / NOR仅适用于零测试。
JustJeff

但最终,我将需要使用与输入位一样多的门或至少与晶体管一样多的门。
Rick_2047 2010年

0

我非常支持or_reduce-大多数综合工具都会将其优化为最佳实现,因为他们确切地知道您在做什么。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.