Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Эмулятор комбинационной схемы (http://www.flasher.ru/forum/showthread.php?t=126012)

Роман Вадимович 08.06.2009 00:15

Эмулятор комбинационной схемы
 
Вложений: 1
Добрый день!
Наверняка каждый из Вас в университете или школе рассматривал комбинационные схемы.
Передо мной стоит задача разработать приложение, позволяющее создавать, и самое ужасное - симулировать их.
Для того чтобы было понятнее, я приведу пример во вложении.
Допустим у нас есть 2 кнопки генерирующие логический 0, либо 1 в зависимости нажаты ли они. Выходы этих клавиш поступают в блок логического "И", который в зависимости от входных данных формирует на выходе 0, либо 1.
Мне нужно создать редактор, позволяющий эмулировать подобные процессы, только элементов там будет значительно больше.
В качестве примера можно привести Electronic WorkBench под винду.
Как реализовать интерфейс и связи между элементами я знаю, но как производить симуляцию сцемы - понятия не имею.
Может кто-то сталкивался и хотя бы подскажет в каком направлении компать. Т.к. для меня важна только идея - код я реализую если алгоритм будет понятен.
Заранее благодарен.

silin 08.06.2009 00:25

http://en.wikipedia.org/wiki/Logic_gate#Logic_gates ?

dimarik 08.06.2009 01:34

А D-триггеры тоже будут? =)

silin, что это?

Там, похоже тема из обычной корпусной электроники 70-х годов. И, ИЛИ, ИЛИ-НЕ, ИСКЛ-И(ИЛИ), RS-ТРИГЕРЫ, C-ТРИГГЕРЫ, регистры, мультиплексоры, счетчики и в таком духе.

Роман Вадимович 08.06.2009 02:44

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

Добавлено:
Нашел внизу страницы, которую дал silin:
http://www.neuroproductions.be/logic...ndex.php?id=52

То что нужно, знать бы как это реализовано...

AL.exe 08.06.2009 02:51

http://code.google.com/p/as3ds/ - возможно, поможет. Особенно не всматривался, что туда входит.

Роман Вадимович 08.06.2009 02:56

Cпасибо, пригодится любая информация!

wizardjedi 08.06.2009 09:58

У вас типичная задача для систем автоматизированного проектирования (САПР). То, что вы хотите реализовать, это моделирование систем на макро-уровне.

Можете прочитать про это в книге И.П. Норенкова "Основы автоматизированного проектирования", ну, или, например, в лекциях В.В. Топоркова ;)

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

Впоследствии применяя метод простых итераций или метод Зейделя решаете задачу определения состояний комбинационной схемы в 0,1, и в переходах 0->1,1->0. Определяете выходные значения(а заодно статические и динамические риски сбоев ;) ).

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

silin 08.06.2009 10:09

>>silin, что это?
наводящий вопрос..:)
я банально не понял, в чем собственно проблема, если "реализовать интерфейс и связи между элементами" не вопрос, то в чем затык ?

Роман Вадимович 08.06.2009 20:21

Вложений: 1
Цитата:

я банально не понял, в чем собственно проблема, если "реализовать интерфейс и связи между элементами" не вопрос, то в чем затык ?
Создать редактор, который позволит расставлять элементы и связывать входы с выходами я знаю как. Но как провести симуляцию - для меня загадка. Спасибо wizardjedi, за приведенную литературу. Сейчас займусь поисками аналогов преложенных книг. Как верно Вы заметили, пересчет всей схемы я планирую осуществлять только при изменении генераторов сигналов, что сократит ресурсоёмкость программы.
Если рассмотреть элементарный пример в приложении, то мы видим 2 кнопки (источники сигнала), логический элемент "ИЛИ" и графичекий индикатор.
Принцип расчета я пока вижу следующим образом:

1) Циклически перебираем все элементы, являющиеся генераторами сигнала (в данном случае 2 кнопки).
2) Берем первый и устанавливаем его значение на всех входах, элементов подключенных к нему.
3) Пытаемся эмуляровать дальше и видим, что у элемента "ИЛИ" известно значение только первого входа, поэтому берем следующий генератор сигнала и повторяем пункт 2.
4) При подаче второго сигнала на входы элемента "ИЛИ" - мы можем двигаться дальше.
5) Получаем выходное значение и зажигаем либо тушим лампочку.

Это все, что я пока могу полагать - не знаю является ли этот алгоритм универсальным, поэтому мне остается только начать изучение книг предложенных, wizardjedi.

Спасибо за помощь.

alatar 08.06.2009 22:11

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

Роман Вадимович 08.06.2009 22:26

Хорошая идея! Я не подумал, действительно удобнее было бы эмулировать в противоположную сторону.
Спасибо за совет.

dimarik 08.06.2009 22:59

Событийная система ту вроде неплохо подходит.
Объекты, преставляющие элементы схемы (элемент ИЛИ на иллюстрации выше) подписываются входными "контактами" на "выходы" предыдущих.

1. Сначала все объекты на входах имеет состояние null или предопределенное.
2. Жмем кнопку! Кнопка диспатчит подписчикам свое состояние.
3. Срабатывает эффект домино. Все довольны.

Цитата:

Сообщение от alatar (Сообщение 826823)
Зачем циклически опрашивать? Есть четыре объекта (в данном случае): два входа, логический элемент, выход. Лампочка запрашивает сигнал с выхода, выход запрашивает логичекий элемент, логический элемент опрашивает свои входы, входы запрашивают состояние своих кнопок.Все

Я считаю, что MVC тут идеально вписывается.

silin 08.06.2009 23:25

в простейшем виде то, что Дима описал:
Код AS3:

package 
{
        import fl.controls.CheckBox;
        import flash.display.Sprite;
        import flash.events.Event;
 
 
        public class Main extends Sprite
        {
                private var _sw1:LogicSorce = new LogicSorce();
                private var _sw2:LogicSorce = new LogicSorce();
                private var _gate:LogicGate = new LogicGate(_sw1,_sw2);
                private var _consumer:LogicConsumer = new LogicConsumer(_gate);
 
                public function Main():void
                {
                        //чекбоксы-переключатели
                        var cb1:CheckBox = new CheckBox();
                        var cb2:CheckBox = new CheckBox();
                        cb2.y = 30;
 
                        cb1.addEventListener(Event.CHANGE, change1Handler);
                        cb2.addEventListener(Event.CHANGE, change2Handler);
 
                        addChild(cb1);
                        addChild(cb2);
 
                }
                //переключаем источники, смотрим трейс на потребителе
                private function change1Handler(evnt:Event):void
                {
                        _sw1.switchState();
                }
 
                private function change2Handler(evnt:Event):void
                {
                        _sw2.switchState();
                }
 
        }
 
}

Код AS3:

package  
{
        import flash.events.*;
        //перключатель
        public class LogicSorce extends EventDispatcher
        {
 
                private var _output:Boolean = false;
 
                public function LogicSorce()
                {
                }
 
                public function switchState():void
                {
                        _output = !_output;
                        dispatchEvent(new Event(Event.CHANGE));
                }
 
 
                public function get output():Boolean
                {
                        return _output;
                }
 
        }
}

Код AS3:

package  
{
        import flash.events.*;
 
        //OR-блок
        public class LogicGate extends EventDispatcher
        {
                private var _output:Boolean = false;
                private var _input1:LogicSorce;
                private var _input2:LogicSorce;
 
                public function LogicGate(inp1:LogicSorce,inp2:LogicSorce)
                {
                        _input1 = inp1;
                        _input2 = inp2;
                        _input1.addEventListener(Event.CHANGE, changeHandler);
                        _input2.addEventListener(Event.CHANGE, changeHandler);
                }
 
                private function changeHandler(evnt:Event):void
                {
                        dispatchEvent(new Event(Event.CHANGE));
                }
 
                public function get output():Boolean
                {
                        return _input1.output || _input2.output;
                }
 
        }
}

Код AS3:

package  
{
        import flash.events.Event;
 
        //лампочка
        public class LogicConsumer
        {
                private var _input:LogicGate;
                public function LogicConsumer(inp:LogicGate)
                {
                        _input = inp;
                        _input.addEventListener(Event.CHANGE, changeHandler);
                }
 
                private function changeHandler(evnt:Event):void
                {
                        trace("лампочка: " + _input.output);
                }
 
        }
}

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

Роман Вадимович 08.06.2009 23:57

dimarik, я с Вами полностью согласен.
Спасибо, silin. Примите невероятные благодарности за реализованный код, он мне очень поможет в разработке.


Часовой пояс GMT +4, время: 02:52.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.