Получить количество установленных битов в цифровой логике

9

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

С учетом 8 входов, какой самый простой способ определить, сколько из них установлено? В частности, мне нужен выходной сигнал высокого уровня, когда установлены 2, и выходной сигнал высокого уровня, если установлены 3.

Моя основная идея теперь состоит из регистра сдвига PISO, счетчика и декодера 3: 8, но мне нужен микроконтроллер для управления всем этим. Это не похоже на сложную функцию. Может быть, ПЗУ 256x2 тоже подойдет, но мои поиски не выявили ничего подобного.

Я знаю, что любой рис с 10 IO мог бы сделать это тривиально, но я хочу реализовать его настолько минимально, насколько это возможно.

captncraig
источник

Ответы:

13

Вы можете найти различные алгоритмы для быстрого подсчета битов . Последние два: Nifty Parallel Count и MIT HAKMEM Count вполне могут быть легко преобразованы в ворота. Смотрите эту страницу для хорошего объяснения того, как это работает.

Вы можете сделать это с помощью оборудования Gates. Используйте четыре 1-битных сумматора, чтобы сложить пары бит вместе. Это дает вам четыре 3-битных числа. Добавьте их попарно, используя два 3-битных сумматора. Это дает вам два 4-битных числа для добавления с помощью одного 4-битного сумматора. Это оставляет вам 5-битное значение, но вы можете игнорировать верхний бит. Затем используйте два 4-битных компаратора для проверки значений 2 и 3.

Для минимального количества деталей, почему бы не сделать это аналоговым?

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

Детектор подсчета битов

Сеть с 8 резисторами будет выдавать напряжение от 0 В (для набора 0 битов) до 5 В (для набора 8 битов). 2 бита произведут 0.5v. 3 бита произведут 1.56v.

  • С 0 или 1 битом, выход будет 00.
  • С 2 или 3 битами, выход будет 01.
  • С 4 или более битами, вывод будет 11.

Добавлено:

Спасибо DavidCary за отличное предложение. После долгих вычислений, я думаю, что я нашел набор резисторов, которые работают, но сначала вы должны тщательно проверить мои расчеты. Здесь я использую компараторы с выходами с открытым стоком, и мне кажется, что мне удалось получить один выход. Низкий означает мертвый в следующем раунде, Высокий - живой в следующем раунде.

Конвей в игре жизни цепи 2

Приятно то, что в этой схеме только два компонента больше, чем в другой схеме. Все они резисторы серии E8, поэтому их можно достать. Кроме того, R6 должен был иметь более высокое значение, например 4.7k или что-то в этом роде.

Rocketmagnet
источник
4
+1 только потому, что ваш ответ не «Используйте микроконтроллер». Это, кажется, режим по умолчанию здесь.
Коннор Вольф
@FakeName: первое упоминание о программных решениях. Конечно, вам не нужно реализовывать их на микроконтроллере, вы также можете использовать суперкомпьютер :)
Федерико Руссо
@FedericoRusso - я дал те ссылки на программные решения, которые дают некоторое представление о том, как он мог бы реализовать его в аппаратном обеспечении.
Ракетный магнит
3
Возможно: добавьте 9-й «суммирующий резистор» 20 кОм от текущего состояния центральной ячейки к точке суммирования операционного усилителя «+» в цепи Ракет-магнита - т.е. дайте центральной ячейке вес 1 и 8 соседних ячеек вес 2. Затем настройте делитель напряжения так, чтобы «рождение» (центральная мертвая ячейка с 3 живыми соседями; сумма = 6) и «остаться в живых» (центральная мертвая ячейка жива с 2 или 3 живыми соседями, сумма = 5 или 7) дает выходы «01»; и все другие случаи (когда центральная ячейка умирает или остается мертвой) дают выходные данные «00» или «11». Затем ворота XOR дают следующее состояние центральной ячейки.
Дэвидкари
1
Несколько вещей, которые я нашел, проводя некоторые эксперименты: сопротивления не совсем правильные. Я нашел несколько лучших комбинаций, но я все еще пытаюсь оптимизировать. Кроме того, при их создании ток будет течь в обратном направлении через суммирующие резисторы и запутывать вещи. Диоды на связях являются одним из способов предотвратить это.
captncraig
6

Что минимально? Микроконтроллер просто 1 часть, и может производить результат с минимальной задержкой (<1 ы). ATTiny20 - самый дешевый микроконтроллер на 54 цента с 10 входами / выходами в Digikey. μ

Таблица поиска также состоит из 1 части и работает быстрее, чем микроконтроллер. Забудьте о параллельных EEPROM, они дорогие. Используйте байтовый параллельный Flash . Это 512 кБайт, это в 2000 раз больше, чем нужно, но это самое дешевое решение (1 доллар). И вы можете добавить еще 6 1-битных функций за ту же цену.

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

Регистр сдвига в порядке , если вы можете ждать результата; это самое медленное решение.

Наконец, вы можете сделать это с помощью логических элементов , но вы потратите много времени, чтобы свести SOP к минимальной форме, если вы хотите использовать все основные принципы. Ракетный магнит имеет правильную идею использования сумматоров, но его числа не совпадают: 1-битный половинный сумматор выдает 2 бита, а не 3. Таким образом, для сложения выходных данных половинных сумматоров два на два требуется два 2-битных половинных сумматора, что дает два немного результатов. Используйте 3-битный половинный сумматор, чтобы получить 4-битный результат. При использовании 1-битных полных сумматоров вам потребуется только один 2-битный сумматор.

stevenvh
источник
1

Гибридная параллельно-последовательная схема склонна быть намного более компактной, чем чисто параллельная схема. Например, если вы измените правила так, чтобы поле 3x3 превратило ячейку в центре мертвой, если осталось менее трех живых клеток или более четырех, и включило ее, если ровно три живых клетки (поведение под этими новые правила будут соответствовать оригиналу), можно упростить логику, выполнив двухэтапную последовательность:

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 (хотя все значения, превышающие четыре, являются эквивалентными), которые затем можно использовать для вычисления однобитного состояния реального времени / мертвого состояния для следующего поколения.

Кстати, альтернативой выполнению арифметической суммы на втором этапе и проверке значения было бы преобразование tempVal [x, y] в представление в одно касание, а затем явная проверка на наличие одной из девяти комбинаций значений, которые дали бы три клетки, или один из двенадцати, которые дали бы четыре.

Supercat
источник