Como descobrir se um número binário é zero

16

Eu estava implementando a ALU a partir das especificações fornecidas no meu livro de sistemas The Elements of Computing. Estou preso em apenas um problema. Como faço para descobrir se um determinado número é zero ou não. Uma coisa que posso fazer é ou quase tudo no ônibus e, em seguida, aplico um não portão nisso. Mas tem que haver alguma outra solução elegante.

Rick_2047
fonte
6
isso não soa como você está preso realmente - mais como você está insatisfeito :)
vicatcu
7
uma entrada X NOR é a solução elegante. Para determinar se o registro contém zero, cada bit deve ser examinado para verificar se contém um 0. lógico. Você especificou que precisa de uma saída de bit único. Portanto, você precisa de alguma função com entradas X e uma saída, como uma NOR.
W5VO 30/08/10

Respostas:

14

Simplesmente não há maneira de contornar ORing todos os bits, por mais insatisfatório que isso possa parecer. No entanto, você também não está restrito a duas portas de entrada em silicone. Você pode criar uma porta NOR de 4 entradas na lógica do CMOS, colocando 4 transistores do tipo p da série na rede pullup e 4 transistores paralelos do tipo n na rede de pulldown. Isso reduz a profundidade da topologia de sua árvore e, portanto, o atraso na propagação. Você só pode levar essa teoria até agora, antes que a queda de tensão acumulada nos transistores da série faça com que a tração não seja suficiente para ser um "1" ... quatro é uma boa regra geral, se bem me lembro.

vicatcu
fonte
Para um número maior de bits, o uso de portas NOR e NAND alternadas faria sentido? Por exemplo, com fan-in de 4 portas, um teste de zero de 64 bits pode usar 16 portas NOR alimentando um resultado de 1 se os 4 bits forem zero a 4 portas NAND que alimentam um resultado de 0 se todos os 4 bits forem 1 (todos 16 bits originais eram 0), esses quatro resultados seriam enviados para uma porta NOR final. (Eu não sou um EE, mas que parece ser melhor do que usar intermediários inversores para obter o resultado de volta tudo de zero para 0 e usando apenas portas NOR.)
Paul A. Clayton
Também pode haver maneiras de dobrar parcialmente a latência da detecção zero na latência de adição.
Paul A. Clayton
Que tal usar o NMOS: um resistor pull-up e transistores X para reduzir o nível para 0 se alguma entrada for 1?
Oskar Skog
13

A função lógica é a porta NOR. Essa é a função lógica mais simples que existe.

Rex Logan
fonte
8

A solução típica com máquinas de 8 bits era que a ALU produziria um número de bits 'flag' que representariam o resultado da operação mais recente. Embora seja possível ter qualquer número de bits de flag ao redor (por exemplo, você pode ter um flag 'Z' para cada registro em sua CPU), geralmente é o que você acabou de calcular que mais interessa, então faz certo sentido fazer dessa maneira.

Algumas dessas CPUs antigas definiam automaticamente os bits de flag para quase todas as movimentações de dados, enquanto outras exigiam que você ficasse uma instrução específica de 'comparação' no seu código, se de repente você precisasse saber se um determinado registro era zero. E se você fornece uma verificação zero para cada registro ou apenas para o que acabou de ser calculado, realmente não há maneira mais simples de verificar "essa palavra é zero" do que apenas OU todos os bits juntos.

JustJeff
fonte
11
Isso também é típico dos chips ARM de 32 bits e pode ser típico da maioria das arquiteturas. Para o ARM, o APSR (Registro do status do programa de aplicativo) mantém os bits N, Z, C, V e Q (negativos, zero, transporte, oVerflow, saturateQ) para fornecer outras funções além do bit zero que você procura . Estes podem ou não ser úteis para a sua máquina.
Kevin Vermeer
Eu tenho a solução ou tudo bem, mas me incomoda que eu tenha que usar muita lógica para obter apenas um pouco. Tem que haver alguma solução elegante.
Rick_2047
@ Rick_2047 - você não mencionou com o que está implementando isso, mas acho que um FPGA? Também me incomodaria ter que amarrar qualquer número de blocos lógicos apenas para fazer um alto portão de fan-in. Essa é uma boa razão para colocar apenas uma delas.
precisa saber é o seguinte
não exatamente um FPGA, mas um simulador de HDL e hardware.
Rick_2047
3

Algumas CPUs, MIPS, por exemplo, têm um registro que sempre contém zero, tornando muito rápido o teste de outro registro para zero.

Leon Heller
fonte
Como verifico o número se tenho um registro contendo zero? Também eu quero gerar apenas um pouco, o que é verdadeiro ou falso dependendo se o barramento de 16 bits é zero ou não
Rick_2047
11
um comparador ... que degenera a uma glorificado porta NOR ...
vicatcu
Ele pode ganhar algo dessa maneira se os registros forem baratos (eles estão em um bloco SRAM em um FPGA) e ele precisar de uma instrução de comparação de registros por outros motivos.
precisa saber é
@ Vicatu - na verdade, se você quiser comparar dois números de N bits, precisará de portas NOR XOR de 2 entradas. A coisa OR / NOR é boa apenas para zero testes.
precisa saber é o seguinte
mas, em última análise, eu precisaria usar o número de portas que possuo bits de entrada ou pelo menos o número de transistores.
Rick_2047
0

Sou um grande fã or_reduce- a maioria das ferramentas de síntese irá otimizar para a melhor implementação, pois elas sabem exatamente o que você está fazendo.

Aaron D. Marasco
fonte