디지털 로직에서 세트 비트 수 확보


9

연습으로, 간단한 디지털 로직으로 Conway의 Game of Life 구현을 설계하려고합니다. 9- 가변 함수를 최소화하여 모든 것을 할 수는 있지만 여전히 상당히 클 것입니다. 알고리즘의 핵심 요소 중 하나는 8 개의 이웃 중 얼마나 많은 것이 '살아있는'지를 결정하는 것입니다.

8 개의 입력이 주어지면 몇 개가 설정되어 있는지 확인하는 가장 쉬운 방법은 무엇입니까? 특히 2가 설정되면 높은 출력이 필요하고 3이 설정되면 높은 출력이 필요합니다.

내 주요 아이디어는 이제 PISO 시프트 레지스터, 카운터 및 3 : 8 디코더로 구성되어 있지만 모든 것을 구동하려면 마이크로 컨트롤러가 거의 필요합니다. 복잡한 기능처럼 보이지 않습니다. 아마도 256x2 ROM도 잘 작동하지만 내 검색에서 이런 종류의 부분이 나타나지 않았습니다.

10 IO가있는 모든 그림이 사소하게 수행 할 수 있다는 것을 알고 있지만 가능한 한 최소한의 방법으로 구현하고 싶습니다.

답변:


13

Fast Bit Counting 계몽 에서 다양한 알고리즘을 찾을 수 있습니다 . 마지막 두 가지 : Nifty Parallel Count와 MIT HAKMEM Count는 게이트로 쉽게 변환 할 수 있습니다. 작동 방식에 대한 자세한 설명은 이 페이지 를 참조하십시오 .

게이트 하드웨어를 사용하여이 작업을 수행 할 수 있습니다. 4 개의 1 비트 가산기를 사용하여 비트 쌍을 함께 추가하십시오. 이렇게하면 4 개의 3 비트 숫자가 제공됩니다. 두 개의 3 비트 가산기를 사용하여 쌍으로 추가하십시오. 단일 4 비트 가산기를 사용하여 추가 할 두 개의 4 비트 숫자를 제공합니다. 이렇게하면 5 비트 값이 남지만 최상위 비트는 무시해도됩니다. 그런 다음 2 개의 4 비트 비교기를 사용하여 값 2와 3을 테스트하십시오.

부품 수를 최소화하려면 왜 아날로그가 아닙니까?

하나의 저항기 위에 전압 분배기를 만들고 8 개의 입력을 8 개의 저항기로 병렬로 연결합니다. 그런 다음 두 개의 비교기 세트를 사용하여 2 또는 3 비트가 생성하는 전압 레벨을 감지하십시오. 그것은 단지 6 개의 부분입니다 :

비트 카운트 검출기

8- 레지스터 네트워크는 0v (0 비트 세트의 경우)에서 5v (8 비트 세트의 경우) 사이의 전압을 생성합니다. 2 비트는 0.5v를 생성합니다. 3 비트는 1.56v를 생성합니다.

  • 0 또는 1 비트를 사용하면 출력은 00이됩니다.
  • 2 비트 또는 3 비트를 사용하면 출력은 01이됩니다.
  • 4 비트 이상인 경우 출력은 11입니다.

추가 :

훌륭한 제안을 해 주신 DavidCary에게 감사드립니다. 많은 계산을 한 후에는 작동하는 저항 세트를 찾았다 고 생각하지만 먼저 계산을 신중하게 확인해야합니다. 여기서는 오픈 드레인 출력과 비교기를 사용하고 있으며 단일 출력을 갖도록 관리했다고 생각합니다. 낮음은 다음 라운드에서 죽었 음을 의미하고 높음은 다음 라운드에서 살아 있음을 의미합니다.

콘웨이의 인생 회로 게임

좋은 점은이 회로가 다른 회로보다 두 개만 더 많은 구성 요소를 가지고 있다는 것입니다. 그것들은 모두 E8 시리즈 저항이므로 붙잡을 수 있어야합니다. 또한 R6은 4.7k와 같은 높은 값이어야합니다.


4
답이 "마이크로 컨트롤러 사용" 이 아니기 때문에 +1 입니다. 그것은 주변의 기본 모드 인 것 같습니다.
코너 울프

@FakeName : 첫 번째 참조는 소프트웨어 솔루션입니다. 물론 당신은 마이크로 컨트롤러에서 그것들을 구현할 필요가 없으며, 슈퍼 컴퓨터를 사용할 수도 있습니다 :)
Federico Russo

@FedericoRusso-하드웨어에서 어떻게 구현할 수 있는지에 대한 통찰력을주는 소프트웨어 솔루션에 대한 언급을했습니다.
Rocketmagnet

3
아마도 : 중앙 셀의 현재 상태에서 Rocketmagnet 회로의 연산 증폭기 "+"합산 지점까지 20kOhm의 9 번째 "합산 저항"을 추가하십시오. 즉, 중앙 셀에 1과 8 개의 인접 셀의 가중치를 부여하십시오. 그런 다음 전압 분배기를 조정하여 "출생"(3 개의 살아있는 이웃이있는 중앙 죽은 셀; 합계 = 6) 및 "살아있는 상태"(2 또는 3 개의 살아있는 이웃이있는 중앙 죽은 셀, 합계 = 5 또는 7) "01"의 출력을 제공합니다. 다른 모든 경우 (중앙 셀이 죽거나 죽어있는 경우)에는 "00"또는 "11"의 출력이 나타납니다. 그런 다음 XOR 게이트는 중앙 셀의 다음 상태를 제공합니다.
davidcary

1
몇 가지 실험을 통해 발견 한 몇 가지 사항 : 저항이 옳지 않습니다. 몇 가지 더 나은 조합을 찾았지만 여전히 최적화하려고합니다. 또한 이러한 그리드를 만들 때 전류는 summimg 저항을 통해 뒤로 흐르고 물건을 엉망으로 만듭니다. 인터링크의 다이오드는이를 방지하는 한 가지 방법입니다.
captncraig

6

최소는 무엇입니까? 마이크로 제어기는 단지 한 부분이며, 최소 지연 결과를 생성 할 수있다 (<1 들). 54 %에서 ATTiny20 은 Digikey에서 10 개의 I / O를 갖춘 가장 저렴한 마이크로 컨트롤러입니다. μ

또한 룩업 테이블은 단지 한 부분으로 마이크로 컨트롤러보다 빠릅니다. 병렬 EEPROM을 잊어 버리면 비용이 많이 듭니다. 바이트 단위 병렬 플래시를 사용하십시오 . 이것은 512 kByte로 필요한 것보다 2000 배나 더 저렴하지만 가장 저렴한 솔루션입니다 (1 달러). 그리고 같은 가격에 6 비트 이상의 1 비트 기능을 추가 할 수 있습니다.

CPLD를 사용할 수도 있습니다 . VHDL 또는 Verilog에 함수를 하나의 긴 SOP (Sum Of Products) 명령문으로 작성하고 신시사이저가 논리를 작성하게하십시오.

시프트 레지스터는 당신이 결과를 기다릴 수 있으면 OK입니다; 이것이 가장 느린 해결책입니다.

마지막으로, 당신은 논리 게이트로 그것을 할 수 있지만, 모든 기본으로 가고 싶다면 SOP를 최소한의 형태로 줄이는 데 많은 시간을 할애합니다. Rocketmagnet 은 가산기를 사용하는 올바른 아이디어를 가지고 있지만 그의 숫자는 꺼져 있습니다. 비트 결과. 3 비트 반가산기를 사용하여 4 비트 결과를 얻습니다. 1 비트 완전 가산기를 사용하면 2 비트 가산기가 하나만 필요합니다.


1

하이브리드 병렬 순차 회로는 순수 병렬 회로보다 훨씬 콤팩트합니다. 예를 들어, 라이브 셀이 3 개 미만이거나 4 개 이상인 경우 3x3 상자가 중앙의 셀을 죽은 상태로 돌리고 정확히 3 개의 라이브 셀이있는 경우 셀을 켜도록 규칙을 조정하는 경우 새로운 규칙은 원본과 일치합니다), 2 단계 시퀀스를 수행하여 논리를 단순화 할 수 있습니다.

tempVal [x, y] = orig [x-1, y] + orig [x, y] + orig [x + 1, y] '세 개의 1 비트 숫자의 2 비트 합
orig [x, y] = LiveDeadFunc (orig [x, y], tempval [x, y-1] + tempVal [x, y] + tempVal [x, y + 1])

이 배열 tempVal[x,y]에는 셀당 2 비트가 있습니다. 후자의 연산은 이러한 3 개의 숫자를 합하여 0-9의 값을 생성하지만 (4를 초과하는 모든 값은 동일하지만) 다음 세대의 단일 비트 라이브 / 데드 상태를 계산하는 데 사용될 수 있습니다.

BTW, 두 번째 단계에서 산술 합계를 수행하고 값을 검사하는 대안은 tempVal [x, y]를 one-hot 표현으로 변환 한 다음 9 개의 값 조합 중 하나를 명시 적으로 확인하여 3을 생성하는 것입니다. 세포, 또는 4 개를 산출 할 12 개 중 하나.

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