Мне нужно сделать приложение для создания логических схем и просмотра результатов. Это в первую очередь для использования на компьютерных курсах A-Level (Великобритания, обычно для 16-18 лет).
Я никогда не создавал подобных приложений, поэтому я не уверен в лучшем дизайне для хранения схемы и оценки результатов (с восстанавливаемой скоростью, скажем, 100 Гц на одноядерном компьютере с частотой 1,6 ГГц).
Вместо того, чтобы строить схему из базовых вентилей (и, или, nand, и т. Д.), Я хочу разрешить использовать эти вентили для создания «микросхем», которые затем могут быть использованы в других цепях (например, вы можете захотеть сделать 8-битный регистр или 16-битный сумматор).
Проблема состоит в том, что количество вентилей значительно увеличивается с такими схемами, так что если моделирование работало на каждом отдельном вентиле, у него было бы тысячи вентилей для симуляции, поэтому мне нужно упростить эти компоненты, которые можно поместить в схему чтобы их можно было быстро смоделировать.
Я думал о генерации таблицы истинности для каждого компонента, затем симуляция могла бы использовать таблицу поиска, чтобы найти выходные данные для данного ввода. Проблема возникла у меня, хотя размер таких таблиц значительно увеличивается с входными данными. Если у чипа было 32 входа, то таблице истинности нужно 2 ^ 32 строки. При этом во многих случаях используется большой объем памяти, чем требуется, поэтому он не практичен для нетривиальных компонентов, он также не будет работать с микросхемами, которые могут хранить свое состояние (например, с регистрами), поскольку они не могут быть представлены просто таблица входов и выходов.
Я знаю, что мог бы просто жестко кодировать такие вещи, как регистрировать микросхемы, однако, поскольку это для образовательных целей, я хочу, чтобы люди могли создавать свои собственные компоненты, а также просматривать и редактировать реализации для стандартных. Я рассмотрел возможность создания и редактирования таких компонентов с использованием кода (например, dll или языка сценариев), чтобы сумматор, например, мог быть представлен как «output = inputA + inputB», однако это предполагает, что учащиеся выполнили достаточно программирования на данный язык, чтобы иметь возможность понимать и писать такие плагины, чтобы имитировать результаты их схемы, что, скорее всего, не так ...
Есть ли какой-нибудь другой способ взять булеву логическую схему и автоматически упростить ее, чтобы симуляция могла быстро определить выходы компонента?
Что касается хранения компонентов, я думал о сохранении некоторой древовидной структуры, так что каждый компонент оценивается, как только все компоненты, которые ссылаются на его входные данные, оцениваются.
например, рассмотреть: A.B + C
Имитатор сначала оценивает логический элемент И, а затем оценивает логический элемент ИЛИ, используя выходные данные логического элемента И и C.
Однако мне только что пришло в голову, что в случаях, когда выходы связываются обратно со входами, вызовет взаимоблокировку, потому что там никогда не будут оцениваться все входы ... Как я могу преодолеть это, так как программа может оценить только один ворота за один раз?