Отримайте кількість встановлених бітів у цифровій логіці


9

Як вправу я намагаюся розробити реалізацію гри Життя Конвея в простій цифровій логіці. Я міг би зробити все це, зводячи до мінімуму функцію 9-змінної, але я думаю, що вона все ще буде досить великою. Одним із основних елементів алгоритму є визначення кількості ваших 8 сусідів «живих».

З огляду на 8 входів, який найпростіший спосіб визначити, скільки встановлено? Особливо мені потрібен вихід, який є високим, коли встановлено 2, і вихід, який є високим, коли встановлено 3.

Моя головна ідея тепер складається з реєстру змін PISO, лічильника і декодера 3: 8, але мені дуже потрібен мікроконтролер, щоб керувати цим усім. Це не здається таким складним у функції. Можливо, 256x2 ROM також буде працювати, але мої пошуки не виявили жодної такої частини.

Я знаю, що будь-яка картинка з 10 IO могла це зробити тривіально, але я хочу реалізувати це якомога меншим способом.

Відповіді:


13

Можливо, ви знайдете різні алгоритми просвічування швидкого розряду . Останні два: граф паралельних Nifty та граф MIT HAKMEM цілком можна легко перетворити на ворота. Дивіться цю сторінку, щоб дізнатися, як вона працює.

Ви можете зробити це, використовуючи апаратне забезпечення воріт. Використовуйте чотири 1-бітні суматори, щоб додати пари біт разом. Це дає чотири 3-розрядних числа. Додайте їх попарно за допомогою двох 3-бітних додавачів. Це дає вам два 4-бітні числа, які потрібно додати за допомогою одного 4-розрядного суматора. Це залишає вам 5-бітове значення, але ви можете ігнорувати верхній біт. Потім використовуйте два 4-бітні компаратори для тестування значень 2 і 3.

Для мінімального підрахунку деталей, чому б не зробити це Аналогове?

Створіть дільник напруги з одним резистором зверху, а ваші 8 входів підключені до низу паралельно 8 резисторам. Потім просто використовуйте два компаратори, встановлені для виявлення рівнів напруги, які вироблять 2 або 3 біта. Це всього 6 частин:

Детектор лічильника

8-резисторна мережа виробить напругу між 0 В (для 0-бітових наборів) до 5 В (для 8-бітових наборів). 2 біта дадуть 0,5 В. 3 біта вироблять 1,56 В.

  • З 0 або 1 бітом вихід буде 00.
  • З 2 або 3 бітами вихід буде 01.
  • З 4 і більше бітами вихід буде 11.

Додано:

Дякуємо DavidCary за чудову пропозицію. Після багатьох обчислень, я думаю, я знайшов набір резисторів, які працюють, але ви повинні ретельно перевірити мої розрахунки спочатку. Тут я використовую компаратори з виходами з відкритим стоком, і я думаю, що мені вдалося отримати єдиний вихід. Низький означає мертвий наступний раунд, Високий означає живий наступний раунд.

Гра життєвого кола Конвея 2

Приємно, що ця схема має лише два компоненти, ніж інша схема. Всі вони є резисторами серії E8, тому слід мати можливість отримати їх. Крім того, R6 повинен був бути більш високим значенням, як, наприклад, 4.7k чи щось.


4
+1 лише тому, що ваша відповідь не "Використовуйте мікроконтролер". Це, здається, тут режим за замовчуванням.
Коннор Вольф

@FakeName: Перша посилання - на програмні рішення. Звичайно, вам не доведеться реалізовувати їх на мікроконтролері, ви також можете використовувати суперкомп'ютер :)
Федеріко Руссо

@FedericoRusso - Я дав ті посилання на програмні рішення, які дають деяке розуміння того, як він може реалізувати це в апаратному забезпеченні.
Rocketmagnet

3
Можливо: Додайте 9-й "підсумовуючий резистор" 20 кОм від поточного стану центральної комірки до точки підсумовування підсилювача "+" в ланцюзі Rocketmagnet - тобто надайте центральній комірці вагу 1 і 8 сусідніх комірок вага 2. Потім підключіть дільник напруги таким чином "народження" (центральна мертва клітина з 3 живими сусідами; сума = 6) і "залишайтеся в живих" (центральна мертва клітина жива з 2 або 3 живими сусідами, сума = 5 або 7) дає виходи "01"; і всі інші випадки (коли центральна клітина гине або залишається мертвою) дають результати "00" або "11". Тоді затвор XOR надає наступний стан центральної комірки.
davidcary

1
Кілька речей, які я виявив, експериментуючи: опір не зовсім правильний. Я знайшов кілька кращих комбінацій, але все ще намагаюся оптимізувати. Крім того, створюючи сітку з них, струм буде витікати назад через резистори summimg і псувати речі. Діоди на зв язках - це один із способів запобігти цьому.
captncraig

6

Що мінімально? Мікроконтролер просто 1 частина, і може виробляти результат з мінімальною затримкою (<1 и). У 54 цент ATTiny20 - найдешевший мікроконтролер з 10 вводу-виводу на Digikey. μ

Таблиця пошуку - це лише 1 частина, і вона швидша, ніж мікроконтролер. Забудьте про паралельні EEPROM, вони дорогі. Використовуйте паралельний спалах на байтах . Це 512 кбайт, це в 2000 разів більше, ніж потрібно, але це найдешевше рішення (1 долар). І ви можете додати ще 6 1-бітних функцій за ту ж ціну.

Ви також можете використовувати CPLD . Запишіть функцію в VHDL або Verilog як один довгий оператор SOP (Sum Of Products) і дозвольте синтезатору створити логіку.

Регістр зсуву в порядку , якщо ви можете чекати результату; це найповільніше рішення.

Нарешті, ви можете зробити це з логічними воротами , але ви витратите багато часу, щоб зменшити SOP до мінімальної форми, якщо ви хочете пройти все базове. Rocketmagnet має правильну ідею, використовуючи суматори, але його числа вимкнено: 1-бітний половинний суматор дає 2 біти, а не 3. Отже, для додавання виходів половини суматорів два на два потрібно два 2-розрядних половини суматора, даючи два 3- бітові результати. Використовуйте 3-розрядний половинний суматор, щоб отримати 4-розрядний результат. Використовуючи 1-бітні повні суматори, вам знадобиться лише один 2-розрядний суматор.


1

Гібридна паралельно-послідовна схема може бути набагато більш компактною, ніж чисто паралельна схема. Наприклад, якщо ви відрегулюєте правила таким чином, що поле 3х3 перетворить клітинку в центр мертвою, якщо є менше трьох живих клітин або більше чотирьох, і поверне її в реальному житті, якщо є рівно три живі клітини (поведінка під цими нові правила будуть відповідати оригіналу), можна спростити логіку, виконавши двоетапну послідовність:

tempVal [x, y] = orig [x-1, y] + orig [x, y] + orig [x + 1, y] 'Двобітова сума трьох однорозрядних чисел
orig [x, y] = LiveDeadFunc (orig [x, y], tempval [x, y-1] + tempVal [x, y] + tempVal [x, y + 1])

Масив tempVal[x,y]має два біти на комірку; остання операція підсумовує три такі числа для отримання значення 0-9 (хоча всі значення, що перевищують чотири, є еквівалентом), яке потім може бути використане для обчислення однобітного статусу живого / мертвого для наступного покоління.

BTW, альтернативою виконання арифметичної суми на другому етапі та вивчення значення було б перетворення tempVal [x, y] в гаряче подання, а потім чітко перевірити наявність однієї з дев'яти комбінацій значень, яка дала б три клітини, або одна з дванадцяти, яка дала б чотири.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.