Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2014, 08:28   #1
fanlis
Пользователь
 
Регистрация: 13.05.2007
Сообщений: 60
Вопрос Прохождение сигнала по электрической схеме

Появилась необходимость сделать редактор электрических схем, цель которого показать на каком проводе какой сигнал идет (0 или 1). Сделал я минимальный редактор, в котором имеются стандартные логические микросхемы (И, ИЛИ, НЕ), которые можно класть на лист, а так же соединять их проводами. Так же имеются источники, которые задают 0 или 1 на входе микросхем. Провода могут соединяться в сложные провода с узлами (разветвлениями). И вот самое главное в программе - это процедура прохождения сигнала. Я ее уже дофига раз переписывал, по-разному пытался подобраться к ней, но один фиг корректно работать не хочет. В итоге у меня сейчас получилась очень большая и навороченная неработающая программа. Разобраться в ней порой я уже и сам не могу, поэтому решил спросить умных людей, может есть какой-то способ (алгоритм) для реализации сего действия.

Задача такая: имеются микросхемы, соединенные проводами, так же имеются источники сигналов (0 или 1), куда-то тоже подключенных. Нужно сделать распространение сигналов. Но есть один нюанс: если входы микросхемы никуда не подключены, то на выходе сигнала нет, если соединены два выхода и на них разные сигналы, то в итоге получается непонятный сигнал. Таким образом получается четыре типа сигналов, я их обозвал uLev0 (нулевой уровень), uLev1 (единичный уровень), uLevN (нет сигнала), uLevU (непонятный уровень).

Реализация такая: микросхемы, провода, узлы являются объектами моего класса. В каждом объекте имеются ссылки на другие объекты, с которыми данный объект связан.
Изначально на всех выводах всех объектов имеется сигнал uLevN (кроме источников, на них определенный сигнал). Я в цикле прохожу по всем объектам и последовательно от источников по определенным правилам распространяю сигнал. На простых схемах работает, но на сложных из-за того, что сигнал распространяется постепенно, получаются непонятные сигналы, которых быть не должно.

Ну собственно я прошу не мой метод разобрать, а подсказать более подходящий.
fanlis вне форума Ответить с цитированием
Старый 23.10.2014, 19:08   #2
shonty
Пользователь
 
Регистрация: 21.10.2014
Сообщений: 13
По умолчанию

Цитата:
Сообщение от fanlis Посмотреть сообщение
Но есть один нюанс: если входы микросхемы никуда не подключены, то на выходе сигнала нет, если соединены два выхода и на них разные сигналы, то в итоге получается непонятный сигнал.
Мне кажется тут путаница начинается уже в схеме:
1. Логические микросхемы (МОП, КМОП, TTL) (если мне не изменяет память), при отсутствии подключения по входу, воспринимают это как сигнал высокого уровня.
Вход должен быть подключён к общей шине через резистор.. эээээ... не помню номиналы.
Иначе, если нет подключения, и вход весит в воздухе - сделай, что бы программа выдавала окно с ошибкой.

2. Вторая часть цитаты вообще мне не понятна: зачем соединять два выхода различных логических элементов??? Тут программа сразу должна выдать ошибку.
(Разные выходы от двух элементов должны приходить на входы третьего, например 2ИНЕ, а он уже определит какой уровень сигнала установить на своём выходе).
shonty вне форума Ответить с цитированием
Старый 23.10.2014, 20:18   #3
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Непонятно, какие у вас микросхемы. Если "стандартные" , то есть без управляющих входов ВК(выбор кристалла) или по-американски CS, то никаких "нет сигнала" или "непонятный уровень" на выходе быть не может. Потому что, как уже написали, на вмсячем входе будет уровень 1 ( по крайней мере у ТТЛ точно выше порога переключения).
Сигнала на выходе не будет только в случае отсутствия питания.

А если микросхы с "третьим состоянием" или то же самое с "Z-состоянием", или с "высокоимпедансным выходом", то кроме информационных входов должен быть управляющий вход - тот самый CS. Если на нем сигнал неактивный, то на выходе - Z-состояние, то есть выход как бы оборван. Это делается тогда, когда выходы подключаются к так называемой " шине" . Шине данных ( та, которая 32 или 64 разряда) или шине адреса. То есть например, к одной точке подключается 1-й разряд от ЦП, 1-й разряд от ОП, и т д. То есть выходы разных микросхем соединяются. В этом случае у всех микросхем кроме одной, CS должны быть неактивны.
type_Oleg вне форума Ответить с цитированием
Старый 24.10.2014, 08:38   #4
fanlis
Пользователь
 
Регистрация: 13.05.2007
Сообщений: 60
По умолчанию

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

Соединяют два выхода как раз из-за третьего состояния.

Рассмотрим такой случай: несколько микросхем своим выходом подключены к одной точке (пусть шине) и только на одной на выходе сигнал, на других нет. Я сейчас добавил такой элемент, как сложный провод, т.е. у него не два конца, а больше (разветвления). Я смотрю какие концы подключены к выходам микросхем и смотрю какие сигналы там есть. Если есть только один сигнал (0 или 1), а на остальных uLevN (нет сигнала), то нормально и сигнал проходит. А если больше одного сигнала и они разные (грубо говоря соединяются 0 и 1), то получается непонятный сигнал (uLevU). И вот в сложных схемах, так как сигналы у меня распространяются постепенно, от источника к одной мс, потом к следующей и т.д., на какую-то микросхему на один вход сигнал приходит раньше, на другой позже и мс переключается сначала в одно состояние, потом в другое и это промежуточное состояние может привести как раз к непонятному сигналу, который начинает распространяться дальше. В этом и проблема. У меня не работает такая схема.
fanlis вне форума Ответить с цитированием
Старый 24.10.2014, 09:43   #5
shonty
Пользователь
 
Регистрация: 21.10.2014
Сообщений: 13
По умолчанию

fanlis , приведи пример рабочей схемы, где выходы с логических элементов вешаются на одну шину.
А за висячий в воздухе вход ты не прав 2 раза. Во первых он воспринимается как сигнал высокого уровня, во вторых зачем тебе вообще нужен висячий в воздухе вход? Я выше писал про резисторы.

И зачем нужна программа которая эмитирует работу заведомо неработающей схемы.
shonty вне форума Ответить с цитированием
Старый 24.10.2014, 10:34   #6
fanlis
Пользователь
 
Регистрация: 13.05.2007
Сообщений: 60
По умолчанию

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

И вообще мне кажется что мы ведем беседу не в том направлении. Или вы мне хотите сказать, что мне не нужно использовать такие сигналы, как uLevN и uLevU ?
fanlis вне форума Ответить с цитированием
Старый 24.10.2014, 15:34   #7
fanlis
Пользователь
 
Регистрация: 13.05.2007
Сообщений: 60
По умолчанию

Вот пример схемы с транзисторами, которые я добавил. Это обычный ключ коммутации на КМДП транзисторах. D-Q - данные, Е - разрешение (открыт/закрыт). Транзисторы я рассматриваю как микросхемы со входами и выходами и определенной логикой работы. Выводы 1 и 4 - управляющие входы, выводы 3 и 5 - входы данных, выводы 2 и 6 - выходы.

На первом рисунке на Е ноль, ключ разомкнут (транзисторы "закрыты") и сигнал не идет. На выходе Q сигнал uLevN. Далее я меняю сигнал Е с 0 на 1.
Логика распространения такая (смотрим на первый рисунок):
1. проходим по всем проводам
1.1. рассматриваем верхний провод (который от D). К нему подключены два выхода (от источник D и от левого транзистора) и один вход (правый транзистор). Смотрим какие сигналы на выходах. Это uLev0 и uLevN. uLevN отбрасываем, он значит, что вывод не подключен, остается uLev0. Окрашиваем провод красным цветом.
1.2. рассматриваем средний провод (который от Q). К нему подключен один выход (с правого транзистора) и один вход (от левого транзистора). Сигнал идет от единственного выхода - это uLevN.
1.3. рассматриваем нижний провод (который от E). Сначала сигнал на нем был 0, теперь стал 1. Короче по такому же принципу окрашиваем провод в зеленый цвет.
2. Проходим по всем микросхемам.
2.1. Левый транзистор открылся, на него пошел сигнал uLevN. Соответственно он же и на выходе.
2.2. Правый транзистор открылся, на него пошел сигнал uLev0, он же и на выходе.

Так как сигналы где-то менялись, то повторяем эти циклы еще раз (пока не перестанут меняться сигналы).

1.1. Верхний провод получает два сигнала uLev0 и uLevN, uLevN отбрасывается, остается uLev0.
1.2. средний провод получает сигнал uLev0 с транзистора и окрашивается в красный цвет.
2. Далее снова микросхемы.
2.1. через левую теперь идет сигнал uLev0.
2.2. на правой ничего не менялось.

Снова повторяем цикл.

1.1. Верхний провод теперь получает два сигнала uLev0, они совпадают, значит сигнал остается.

Больше ничего не менялось, цикл закончился. Получили правый рисунок.
Вот как-то так.

Проблемы начинаются, когда я переключаю D с 0 на 1.

При этом верхний провод получает два сигнала uLev1 (с источника) и uLev0 (с транзистора), они разные, значит провод получает сигнал uLevU. Далее этот сигнал идет через правый транзистор, заходит в левый, выходит с него на верхний провод. Ситуация устаканивается и остается неясный сигнал. (((((((

Вот как-то так постарался описать логику работы. Код довольно сложный, поэтому его не привожу.
Изображения
Тип файла: jpg Ключ коммутации2.JPG (14.1 Кб, 70 просмотров)
Тип файла: jpg Ключ коммутации1.JPG (9.7 Кб, 52 просмотров)
fanlis вне форума Ответить с цитированием
Старый 24.10.2014, 15:59   #8
shonty
Пользователь
 
Регистрация: 21.10.2014
Сообщений: 13
По умолчанию

У логики только два состояния 1 и 0. uLevN и uLevU не нужно.

Позвольте узнать, что на рисунках означают стрелки от точки 3 к 2 и от 5 к 6?
(не это ли направление прохождения сигнала)
shonty вне форума Ответить с цитированием
Старый 24.10.2014, 15:59   #9
shonty
Пользователь
 
Регистрация: 21.10.2014
Сообщений: 13
По умолчанию

сообщение раздвоилось

Последний раз редактировалось shonty; 24.10.2014 в 16:07. Причина: сообщение раздвоилось
shonty вне форума Ответить с цитированием
Старый 28.10.2014, 08:53   #10
fanlis
Пользователь
 
Регистрация: 13.05.2007
Сообщений: 60
По умолчанию

Извиняюсь, что не писал долго, приболел.

Ну учитывая, что я написал ранее: "Выводы 1 и 4 - управляющие входы, выводы 3 и 5 - входы данных, выводы 2 и 6 - выходы", то стрелки - это именно направление прохождения сигнала.

И что значит "сообщение раздвоилось"?

Если убрать сигналы uLevN и uLevU, тогда не понятно как делать прохождение сигнала. А так же что будет, если одном проводе встретятся два различных сигнала.
fanlis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите понять прохождение исключений llyDbg Dimka-novitsek Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 14.09.2014 16:36
Прохождение лабиринта (волновой алгоритм) Alexander_A Общие вопросы C/C++ 9 30.10.2011 19:52
резонанс в электрической цепи foxted Помощь студентам 3 25.12.2010 05:14
прохождение практики radikayupov1710 Помощь студентам 0 18.04.2010 17:39
Прохождение подземного лабиринта Джаффара МаксимNEWProgramm Паскаль, Turbo Pascal, PascalABC.NET 3 12.04.2008 19:52