나는 The Elements of Computing systems 책에 주어진 스펙으로 ALU를 구현하고있었습니다. 나는 하나의 문제에만 붙어 있습니다. 주어진 숫자가 0인지 아닌지 어떻게 알 수 있습니까? 내가 할 수있는 한 가지는 버스의 모든 비트 또는 그런 다음 게이트를 적용하지 않는 것입니다. 그러나 다른 우아한 솔루션이 있어야합니다.
나는 The Elements of Computing systems 책에 주어진 스펙으로 ALU를 구현하고있었습니다. 나는 하나의 문제에만 붙어 있습니다. 주어진 숫자가 0인지 아닌지 어떻게 알 수 있습니까? 내가 할 수있는 한 가지는 버스의 모든 비트 또는 그런 다음 게이트를 적용하지 않는 것입니다. 그러나 다른 우아한 솔루션이 있어야합니다.
답변:
만족스럽지 않은 것처럼 모든 비트를 OR 처리하는 방법은 없습니다. 그러나 실리콘에서도 두 개의 입력 게이트로 제한되지 않습니다. 풀업 네트워크에 4 개의 직렬 p 형 트랜지스터를, 풀다운 네트워크에 4 개의 병렬 n 형 트랜지스터를 넣어 CMOS 논리에 4 입력 NOR 게이트를 구축 할 수 있습니다. 그러면 트리 토폴로지의 깊이가 줄어들어 전파 지연이 줄어 듭니다. 직렬 트랜지스터의 누적 전압 강하가 풀업을 "1"로 충분히 끌어 올리지 않기 전에는 지금까지만 이론을 취할 수 있습니다.
8 비트 시스템을 사용하는 일반적인 솔루션은 ALU가 최신 작업의 결과를 나타내는 다수의 '플래그'비트를 생성한다는 것입니다. 많은 수의 플래그 비트를 가질 수 있지만 (즉, CPU의 모든 레지스터에 대해 'Z'플래그를 가질 수 있음) 일반적으로 가장 흥미로운 것으로 방금 계산 한 것입니다. 그렇게하는 것이 어느 정도 의미가 있습니다.
이러한 오래된 CPU 중 일부는 거의 모든 데이터 이동에 대해 자동으로 플래그 비트를 설정하는 반면, 다른 레지스터는 특정 레지스터가 0인지 갑자기 알아야하는 경우 코드에 특정 '비교'명령을 적용해야합니다. 그리고 모든 레지스터에 대해 제로 검사를 제공하든 또는 방금 계산 된 것에 대해서만 제로 검사를 제공하든, 모든 비트를 함께 OR하는 것보다 "이 단어가 0입니까"를 확인하는 간단한 방법은 실제로 없습니다.
예를 들어 MIPS와 같은 일부 CPU에는 항상 0을 포함하는 레지스터가 있으므로 다른 레지스터를 0으로 테스트하는 것이 매우 빠릅니다.
나는 열렬한 팬입니다 or_reduce
. 대부분의 합성 도구는 당신이 무엇을하는지 정확히 알고 있기 때문에 최상의 구현으로 최적화 할 것입니다.