Создание средства моделирования логического элемента

Как прокомментировал Жюльен Коломб, я обнаружил, что в этой ситуации лучше всего сохранять большие объекты, а затем явно загружать их, пока я настраиваю уценку. Это необходимо, если ваши данные поступают через ODBC, и вы не хотите многократно выполнять полные запросы, когда вы работаете со шрифтами и темами.

9
задан Dinah 26 January 2010 в 15:57
поделиться

8 ответов

Если вы можете запретить циклы (обратная связь между выходами и входами), то вы можете значительно упростить задачу. В этом случае для каждого входа будет ровно один определенный выход. Однако циклы могут сделать вывод неразрешимым (или, скорее, постоянно изменяющимся).

Оценка схемы без петель должна быть простой - просто используйте алгоритм BFS с «соединениями» (соединениями между логическими вентилями) в качестве элементов в списке. Начните со всех входов для всех ворот в «неопределенном» состоянии. Как только вентиль имеет все входы «определенные» (либо 1, либо 0), вычислите его выход и добавьте его выходные соединения в список BFS. Таким образом, вам нужно только один раз оценить каждый вентиль и каждое соединение.

Если есть петли, можно использовать тот же алгоритм,

1
ответ дан 4 December 2019 в 13:04
поделиться

Вы смотрели симулятор Ричарда Боулза ?

5
ответ дан 4 December 2019 в 13:04
поделиться

Вы не первый, кто хочет создать собственный симулятор схем; -).

Я предлагаю остановиться на минимальном наборе примитивов. Когда я начал свою работу (которую планирую возобновить в ближайшее время ...), у меня было два примитива:

  • Источник: ноль входов, один выход всегда 1.
  • Транзистор: два входа A и B , один выход это A, а не B .

Очевидно, я немного неправильно использую терминологию, не говоря уже о пренебрежении тонкостями электроники. По второму пункту я рекомендую абстрагироваться от проводов, которые несут единицы и нули, как это сделал я. Мне было очень весело рисовать по ним схемы вентилей и сумматоров. Когда вы сможете собрать их в схемы и нарисовать рамку вокруг набора (с входами и выходами), вы сможете начать создавать более крупные вещи, такие как множители.

Если вы хотите что-нибудь с циклами, вам нужно включить какую-то задержку - поэтому каждый компонент должен сохранять состояние своих выходов. В каждом цикле вы обновляете все новые состояния из текущих состояний вышестоящих компонентов.

Редактировать Что касается ваших опасений по поводу масштабируемости, как насчет использования по умолчанию метода первых принципов для моделирования каждого компонента с точки зрения его состояния и восходящего потока соседей, но предоставляют способы оптимизации подсхем:

  • Если у вас есть подсхема S с входами A [m] с m <8 (скажем, дает максимум 256 строк) и выводит B [n] и без циклов, генерирует таблицу истинности для S и использует ее. Это можно сделать автоматически для идентифицированных подсхем (и повторно использовать, если подсхема появляется более одного раза) или по выбору.

  • Если у вас есть подсхема с циклами, вы все равно можете сгенерировать таблицу истинности. Здесь могут помочь методы поиска с фиксированной точкой.

  • Если ваша подсхема имеет задержки (и они значительны для включающей схемы), таблица истинности может включать столбцы состояний. Например, если подсхема имеет вход A, внутреннее состояние B и выход C, где C <- A и B, B <- A, таблица истинности может быть:

    AB | Британская Колумбия
    0 0 | 0 0
    0 1 | 0 0
    1 0 | 1 0
    1 1 | 1 1

  • Если у вас есть подсхема, которую пользователь утверждает, реализует конкретный известный шаблон, такой как «сумматор», предоставьте возможность использования жестко запрограммированной реализации для обновления этой подсхемы вместо моделирования ее внутренних частей.

3
ответ дан 4 December 2019 в 13:04
поделиться

Возможно, вы захотите взглянуть на программу курса «От Нанда к тетрису за 12 шагов». Об этом есть видео на YouTube.

Страница курса находится по адресу: http://www1.idc.ac.il/tecs/

2
ответ дан 4 December 2019 в 13:04
поделиться

Вы можете жестко запрограммировать все распространенные. Затем позвольте им создать свои собственные из жестко запрограммированных (которые будут включать в себя шлюзы низкого уровня), которые будут оцениваться путем оценки каждого подкомпонента. Наконец, если одна из их «микросхем» имеет менее X входов / выходов, вы можете «оптимизировать» ее в поисковой таблице. Может быть, определить, насколько это распространено, и сделать это только для наиболее часто используемых чипов Y? Таким образом, у вас будет хороший компромисс между скоростью и пространством.

Вы всегда можете JIT-компилировать схемы ...

Поскольку я действительно не думал об этом, я не совсем уверен, какой подход я выберу. ... но, возможно, это был бы гибридный метод, и я бы определенно жестко закодировал и популярные "чипы".

1
ответ дан 4 December 2019 в 13:04
поделиться

Вы можете познакомить их с концепцией карт Карно, которые помогут им упростить для себя значения истинности.

1
ответ дан 4 December 2019 в 13:04
поделиться

Когда я играл с созданием среды моделирования «цифровой схемы», у меня была каждая определенная схема (базовый вентиль, мультиплексор, демультиплексор и пара других примитивов), связанных с передачей функция (то есть функция, которая вычисляет все выходы на основе текущих входов), структура «повестки дня» (в основном связанный список «когда активировать определенную передаточную функцию»), виртуальные провода и глобальные часы.

Я произвольно настроил провода на жесткую модификацию входов всякий раз, когда выход изменился, и действие по изменению входа в любой цепи, чтобы запланировать вызов функции передачи после задержки затвора. Имея это под рукой, я мог приспособить как синхронизированный, так и разблокированный элементы схемы (синхронизированный элемент настроен так, чтобы его передаточная функция выполнялась при "следующем тактовом переходе,плюс задержка затвора », любой разблокированный элемент просто зависит от задержки затвора).

На самом деле никогда не удавалось создать для него графический интерфейс, поэтому я никогда не выпускал код.

1
ответ дан 4 December 2019 в 13:04
поделиться

Когда я делал эмулятор цепи (к сожалению, также неполный и также не выпущенный), вот как я работал с циклами:

  • Каждый элемент цепи сохраняет своё булевое значение
  • Когда элемент "E0" изменяет своё значение, он уведомляет (через образец наблюдателя) всех, кто от него зависит
  • Каждый элемент наблюдения оценивает своё новое значение и делает то же самое

Когда происходит изменение "E0", сохраняется список всех затронутых элементов 1-го уровня. Если элемент уже появился в этом списке, он запоминается в новом списке 2 уровня, но не продолжает уведомлять своих наблюдателей. Когда последовательность, которую начала E0, перестала уведомлять новые элементы, обрабатывается следующий уровень очереди. Т.е. последовательность выполняется и завершается для первого элемента, добавленного на 2 уровень, затем следующего элемента, добавленного на 2 уровень, и т.д. до тех пор, пока не будет завершен весь уровень, после чего вы переходите на уровень -(x+1)

Это ни в коем случае не завершается. Если у вас когда-нибудь будет несколько осцилляторов, выполняющих бесконечные циклы, то неважно, в каком порядке вы их возьмете, один из них может помешать другому когда-нибудь получить свою очередь. Моей следующей целью было облегчить это, ограничив шаги синхронизацией по часам, а не каскадными комбинациями, но я никогда не заходил так далеко в своем проекте.

2
ответ дан 4 December 2019 в 13:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: