이진수가 0인지 확인하는 방법


16

나는 The Elements of Computing systems 책에 주어진 스펙으로 ALU를 구현하고있었습니다. 나는 하나의 문제에만 붙어 있습니다. 주어진 숫자가 0인지 아닌지 어떻게 알 수 있습니까? 내가 할 수있는 한 가지는 버스의 모든 비트 또는 그런 다음 게이트를 적용하지 않는 것입니다. 그러나 다른 우아한 솔루션이 있어야합니다.


6
그것은 당신이 정말로 붙어있는 것처럼 들리지 않습니다-당신이 불만족하는 것처럼 더 :)
vicatcu

7
X 입력 NOR 우아한 솔루션입니다. 레지스터에 0이 포함되어 있는지 확인하려면 모든 비트를 검사하여 논리 0이 포함되어 있는지 확인해야합니다. 단일 비트 출력이 필요하다고 지정했습니다. 따라서 X 입력과 NOR와 같은 하나의 출력 기능이 필요합니다.
W5VO

답변:


14

만족스럽지 않은 것처럼 모든 비트를 OR 처리하는 방법은 없습니다. 그러나 실리콘에서도 두 개의 입력 게이트로 제한되지 않습니다. 풀업 네트워크에 4 개의 직렬 p 형 트랜지스터를, 풀다운 네트워크에 4 개의 병렬 n 형 트랜지스터를 넣어 CMOS 논리에 4 입력 NOR 게이트를 구축 할 수 있습니다. 그러면 트리 토폴로지의 깊이가 줄어들어 전파 지연이 줄어 듭니다. 직렬 트랜지스터의 누적 전압 강하가 풀업을 "1"로 충분히 끌어 올리지 않기 전에는 지금까지만 이론을 취할 수 있습니다.


더 많은 수의 비트에 대해 교호하는 NOR 및 NAND 게이트를 사용하는 것이 의미가 있습니까? 예를 들어, 4 개 게이트의 팬인 (fan-in)으로 64 비트 제로 테스트는 4 비트가 모두 0이면 4 개의 NAND 게이트이면 1의 결과를 공급하는 16 개의 NOR 게이트를 사용할 수 있습니다. 16 개의 원래 비트는 0),이 4 개의 결과는 최종 NOR 게이트로 전송됩니다. (저는 EE가 아니지만 0으로 결과를 0으로 되돌리고 NOR 게이트 만 사용하는 중간 인버터를 사용하는 것보다 낫습니다.)
Paul A. Clayton

제로 검출 대기 시간을 추가 대기 시간으로 부분적으로 접는 방법도있을 수 있습니다.
Paul A. Clayton 1

NMOS 사용은 어떤가? 입력이 1 인 경우 레벨을 0으로 낮추기 위해 풀업 저항 하나와 X 트랜지스터 하나
Oskar Skog

13

논리 기능은 NOR 게이트입니다. 그것이 존재하는 가장 간단한 논리 함수입니다.


8

8 비트 시스템을 사용하는 일반적인 솔루션은 ALU가 최신 작업의 결과를 나타내는 다수의 '플래그'비트를 생성한다는 것입니다. 많은 수의 플래그 비트를 가질 수 있지만 (즉, CPU의 모든 레지스터에 대해 'Z'플래그를 가질 수 있음) 일반적으로 가장 흥미로운 것으로 방금 계산 한 것입니다. 그렇게하는 것이 어느 정도 의미가 있습니다.

이러한 오래된 CPU 중 일부는 거의 모든 데이터 이동에 대해 자동으로 플래그 비트를 설정하는 반면, 다른 레지스터는 특정 레지스터가 0인지 갑자기 알아야하는 경우 코드에 특정 '비교'명령을 적용해야합니다. 그리고 모든 레지스터에 대해 제로 검사를 제공하든 또는 방금 계산 된 것에 대해서만 제로 검사를 제공하든, 모든 비트를 함께 OR하는 것보다 "이 단어가 0입니까"를 확인하는 간단한 방법은 실제로 없습니다.


1
이것은 또한 32 비트 ARM 칩의 전형적인 것이며 대부분의 아키텍처에서 전형적인 것일 수 있습니다. ARM의 경우 APSR (Application Program Status Register)은 N, Z, C, V 및 Q 비트 (Negative, Zero, Carry, oVerflow, saturateQ) 비트를 유지하여 찾고있는 0 비트 외에 다른 기능을 제공합니다. . 이것들은 기계에 유용하거나 유용하지 않을 수 있습니다.
케빈 베르메르

나는 해결책을 얻었 지 만 하나의 비트를 얻으려면 너무 많은 논리를 사용해야한다는 버그가 있습니다. 우아한 해결책이 있어야합니다.
Rick_2047

@ Rick_2047-당신이 이것을 구현하는 것에 대해 언급하지 않았지만 FPGA를 추측하고 있습니까? 높은 팬인 게이트를 수행하기 위해 로직 블록 수를 묶어야한다는 점도 저를 괴롭힐 것입니다. 그중 하나만 넣는 것이 합당한 이유입니다.
JustJeff

정확히 FPGA가 아니라 HDL 및 하드웨어 시뮬레이터입니다.
Rick_2047

3

예를 들어 MIPS와 같은 일부 CPU에는 항상 0을 포함하는 레지스터가 있으므로 다른 레지스터를 0으로 테스트하는 것이 매우 빠릅니다.


레지스터에 0이 포함되어 있으면 숫자를 어떻게 확인합니까? 또한 16 비트 버스가 0인지 아닌지에 따라 참 또는 거짓 인 비트 하나만 생성하려고합니다.
Rick_2047

1
영광스러운 NOR 게이트로 변성되는 비교기 ...
vicatcu

레지스터가 싸고 (FPGA의 SRAM 블록에있는 경우) 어쨌든 다른 이유로 레지스터 비교 명령이 필요한 경우이 방법으로 무언가를 얻을 수 있습니다.
jpc

@vicatu-실제로 두 개의 N 비트 숫자를 비교하려면 N 2 입력 XOR 게이트가 필요합니다. OR / NOR는 제로 테스트에만 적합합니다.
JustJeff

그러나 궁극적으로 나는 입력 비트 또는 적어도 많은 트랜지스터만큼 많은 게이트를 사용해야합니다.
Rick_2047

0

나는 열렬한 팬입니다 or_reduce. 대부분의 합성 도구는 당신이 무엇을하는지 정확히 알고 있기 때문에 최상의 구현으로 최적화 할 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.