Симулатор на цифрова електроника

xyz1

Registered
В интернет съществуват множество сайтове, които емулират не само цифрова, но и аналогова електроника. Това което на мен ми трябва е да симулирам единствено цифрова електроника. Вместо готово решение, то реших да си създам свое, което ще ми е доста по-удобно за употреба. Ето ключовите моменти които считам да приложа:
1. За удобство приложението ще е web базирано. Така няма да има инсталации и евентуалните опасения за вируси от външни потребители ще са по-малки.
2. Ще е изцяло javascript базирано, без флаш и други подобни. При това ще се опитвам да ползвам колкото се може по-стари технологии (за съвместимост с по-старите браузъри).
3. Ще работи без сървър. Ще може да се ползва от компютъра offline, само след отварянето на записана статична уеб страница.

В тази тема ще представя как изграждам това приложение. Стъпка по стъпка. Мисля, че ще е полезно и на други. Целта е не да се ползват супер качествени техники, а просто нещата трябва да работят. Отначало ще се бия с html и javascript, а след това ще реализирам и подобрявам функционалността.

Начало

Като първа стъпка трябва да си създам работна област. Разбира се това ще е нещо просто, ето такова:
Код:
<html>
<head>

</head>
<body>
 Работна област:
 <div style="height:400px;border:1px solid red;"></div>
</body>
</html>
Записваме горният код в текстов документ с разширение html и го отваряме от браузъра и в текстов редактор. При Windows XP поради неизвестни причини разширението на файловете е скито. Затова като отворите Windows Explorer трябва да изберете 'Tools'/'Folder options...', след което избирате таб 'View'. След това трябва да изключите отметката на "Hide extensions for known file types" и да натиснете "OK". Сега вече всички файлове са си с видими разширения.

Активиране

Това което направихме за момента е една статична страница. Ще ни трябва javascript код, който да използваме за динамичните промени по страницата.

Но как се използваше този javascript... Тъй като съм забрави (не целия javascript, а начина за добавяне на елементи), то търся в Google за следния низ: "javascript add element". Отварям първия резултат и си записвам редовете от показаният там сорс, които ме интересуват:
var ni=document.getElementById('myDiv'); Така се създава указател към контретен елемент от уеб страницата
...
var newdiv = document.createElement('div'); Така се създава нов div елемент, който все още е само виртуален (не е в страницата)
...
newdiv.setAttribute('id',divIdName); Така се добявят атрибути за DIV елемента
...
ni.appendChild(newdiv); Добавяме div елемента в елемента на който ni е указател. Това добавя елемента физически (и визуално) в уеб страницата
По-горе за удобство в курсив съм добавил коментари на български, кое за какво служи.

Готови сме да приложим току що наученото. Отначало ще приложим някои промени в html сорса, а именно:

Тестово извикване на функцията за чертаене.
Код:
<body onload="draw();">
Атрибутът onload съдържа име на функция. Последната се изпълнява веднага, след като страницата бъде заредена.

Даване id на основната територия в която ще се чертае.
Код:
<div id="area" style="height: ...
Както виждате кръстили сме DIV-ът на основната територия с "area".

Накрая в head частта ще напишем и функцията за добавянето на линията:
Код:
 <script type="text/javascript">
  function draw()
  {var draw_area=document.getElementById('area');
   var line=document.createElement('div');
   line.setAttribute("style","position:relative;top:10px;left:10px;width:200px;height:1px; background-color:blue;");
   draw_area.appendChild(line);
  }
 </script>

След нанесените промени записваме страницата и презареждаме същата в браузъра. Вече ще имаме една синя черта в основната територия.

Поправяне на грешки

Какво щеше да стане, ако програмата не работеше? Всъщност какво да направим, ако допуснем грешки?

Съществуват доста разширения за браузърите, които са доста удобни за проверка и следене на функциониране на уеб страниците. Така наречения debugger процес. Ако го нямате, то може да приложите някои по-дървени, но много лесни номера. Как се осъществява това ще покажем по-долу.

Ще започнем със следния фрагмент:
Код:
   line.setAttribute("possition","absolute");
   line.setAttribute("top","10px");
   line.setAttribute("left","10px");
   line.setAttribute("width","200px");
   line.setAttribute("height","1px");
   line.setAttribute("background-color","blue");
Точно това написах, когато писах програмата за първи път. Дали процедурата се изпълнява правилно, или дава грешка на някой от редовете? За целта първата ми задача беше да проверя точно това. Добавяйки "alert(№)" след всеки ред от сорса може да се провери това. Тук чрез "№" се означава номера на използвания alert. Започваме 1, 2, 3 и така нататък. При изпълнението ще се появява специфичен диалогов прозороц в който ще се изобразява съответното число "№".
В конкретния случай се оказа, че процедурата се изпълнява правилно и без проблеми. Но желаната синя линия не се появи, т. е. явно някъде програмата е грешна!

За да открием грешката, то при FireFox браузъра правим следното. Маркираме всичко от резултатната уеб страница. Използваме клавишна комбинация Ctrl+A. След това поставяме курсорът на мишката на част от маркираното (примерно текста "Работна област:") и натискаме десен бутон. Избираме от падащото меню "Изходен код на маркираното" (ако не се с кирилизиран браузър, то не се сещам какъв беше съответния английски тест - ако някой има такава версия, то да каже).
В отвореният прозорец ще видим нещо от вида:
Код:
 Работна област:
 <div id="area" style="height: 400px; border: 1px solid red;">
  <div background-color="blue" height="1px" width="200px" left="10px" top="10px" possition="absolute"></div>
 </div>
Това по-горе само малко го подредих с отмествания за по-добра четимост. Както виждате в основния div вече се съдържа нашия такъв, който трябва да изобразява линията. Грешката ми сега е очевидна, т. е. атрибути на css стила на елемента съм ги декларирал като атрибутите на таговете. Това е грешно. Трябва всичко да се декларира като CSS текст в style атрибут - така както всъщност направихме в работещия вариант.

Между другото показаната тук техника трябва да е ползвате още веднъж, за да откриете още една грешка. Атрибутът possition не се пише така и затова след като прегледате сорсът на страницата по описания начин, то ще видите че нищо подобно на possition няма вътре. След поправка с правилното position атрибутът се появява и изобразяването е вече коректно.

Сега да направим и малка параметризация

Нека направим така, че изчертаваната линия да й се задава височината на която ще се изобразява.
За целта в заглавието на функцията задаваме параметър "h":
Код:
function draw(h)
След това в "style" атрибута трябва вече да направим "top" параметъра да не е фиксиран, както е досега:
Код:
 ... top:10px ...
а да е точно толкова, колкото е параметъра h. Това се прави, като горното парче от текст се замине със следното:
Код:
 ... top:"+h+"px ...

Накрая трябва да тестваме резултата. За целта променямe <body> тага със следното:
Код:
<body onload="draw(10);draw(20);draw(30);draw(40);">
Презареждаме страницата и получаваме очаквания резултат.



Заключение

До момента написахме следната web страница:
Код:
<html>
<head>
 <script type="text/javascript">
  function draw(h)
  {var draw_area=document.getElementById('area');
   var line=document.createElement('div');
   line.setAttribute("style","position:relative;top:"+h+"px;left:10px;width:200px;height:1px; background-color:blue;");
   draw_area.appendChild(line);
  }
 </script>
</head>
<body onload="draw(10);draw(20);draw(30);draw(40);">
 Работна област:
 <div id="area" style="height:400px;border:1px solid red;"></div>
</body>
</html>
В бъдеще при разработването на проекта може би ще опитам да поместя текста на уеб страницата някъде в интернет, за да е удобно хем за тестване, хем за бързо записване.
 
Никакъв шанс..
За да създадеш такова приложение ти трябват и практически знания, но да кажем, че това не е проблем, то представи си твоя скрипт да поддържа само 10 основни компонента, как ще симулираш реалната им работа?

Такива симулатори, въпреки, че има и свободни версии на някои, струват скъпо..
 
Може ли някой да даде инфо за какво става дума? Добрият стар Гугъл не даде нищо... макар че и не знам какво да очаквам.
 
rosko каза:
ти трябват и практически знания
Тук не позна. За да създадеш симулатор ти трябват теоретични знания.

rosko каза:
electronic circuit simulator ... За такова животно става въпрос, сложна работа...
Тук си също в голяма грешка. Това което показваш е симулатор за аналогова електроника. Симулирането на аналогова електроника е нещо много сложно наистина. И много ресурсоемко.

Между другото от симулатори до симулатори разликата е огромна. Ето например starup-а circuits.io в началото на тази година беше закупен от Autodesk. Фирма, доста известна в миналото, но и съществуваща в момента (например популярният сайта instructables.com е неин). Въпросният circuits.io след придобиването си получи симулатор за схеми. Мисля, че е такъв, който се изпълнява в браузъра (не съм сигурен, но предполагам). Въпросният симулатор не успя да реализира обикновен RS тригер, реализиран с транзистори - просто алгоритъмът му за симулация е твърде зле, за да се справи с тази да го кажем базова задача. Това последното съм го пробвал лично.

rosko каза:
Никакъв шанс..
представи си твоя скрипт да поддържа само 10 основни компонента, как ще симулираш реалната им работа?
Аз ще правя симулатор за цифрова електроника. И то такъв, който на мен ми трябва. Сигналите по жиците не са еди колко си волта, а са само 0 (примерно съответстващо на 0V) и 1 (примерно съответстващо на 5V). Самите компоненти ще обработват само такива сигнали - т. е. всички компоненти ще са интегрални схеми за цифрова обработка на данни. Освен това те ще са напълно абстрактни.
Симулацията ще е следната. Имаме точно един тактов генератор, който генерира последователно 1 0 1 0 1 0 ... След като си смени състоянието, то се преминава към поправка на състоянията на напреженията във всички жици. Това става чрез обхождане на графа в ширина, започвайки от тактовия генератор. Ако обхождането зацикли (има си алгоритми които да определят това, като мисля да приложа "ро" алгоритъма, който обичайно се ползва в криптографията де...) - тогава имаме грешка. Т. е. симулацията спира, а схемата се счита безсмислена. Това приемане също е нормално за цифровата електроника. Общо взето това е всичко.

Този симулатор между другото го пиша не за забавление. Ще ми трябва за да го ползвам при конкретна моя разработка. След като го направя, то може да го ползвам и за друго - вече ще е много удобен за усъвършенстване по мой вкус. А и ще е по вкуса на всеки, защото чрез туторияла който пиша всеки ще знае къде какво се прави в сорса.
 
djman каза:
Може ли някой да даде инфо за какво става дума? Добрият стар Гугъл не даде нищо... макар че и не знам какво да очаквам.
Първо да си наясно, че rosko се е заблудил за това, което говоря.
Това което трябва да търсиш е "Digital electronics". На български търси за "Цифрова електроника", "логически схеми тригери".

Съвсем накратко казано цифровата електроника е това което се ползва в компютрите. Имаме жици по които може да се приема най-грубо казано, че текат два сигнала 0 и 1. Условно може да считаш това като жици по които от едно място се праща сигнала, а от другото се приема.

Имаме логически схеми. Например логическата схема "И" приема сигналите от две жици и праща сигнал към трета. Това което праща е логическата операция "и", т. е. компонентът ще прати 1, само ако е получил и по двете си входни жици единици. Друг логически елемент е отрицанието, който приема и изпраща по 1 сигнал. Ако си получил 0 на входа, то изпращаш 1 на изхода и обратно (ако си получил 0, то изпращаш 1).

Другото основно което имаме е запаметяващи компоненти. При тях резултатът не зависи само от това което се подава на входовете, но и от вътрешно състояние на елемента. Например RS тригер. Той има два входа (означени с R и S) и един изход. Ако подадеш 1 на R извода, тогава на изхода се подава 1. След като изключиш R, т. е. му подадеш вече 0, то на изхода състоянието 1 се запазва. Обратно, ако подадеш на S входа 1, тогава на изхода ще получиш 0, която се запазва и след изключване на сигнала. По правило единици на R и S не трябва да се подават едновременно. Друг по-лесен пример е T тригер. Той има един вход и един изход. Отначало на изхода си стои нула. При всяко подаване на 1 на входа състоянието на изхода се променя.

Имаме и още нещо, което се нарича тактов генератор. Той просто генерира сигнали 0 1 0 1 0 1...

Между другото думата тригер на английски се превежда по два начина. Като Flip-flop и като latch. При това двете понятия се отнасят за различна функционалност. Разликата е в това, че Flip-flop-ът реагира не на сигнали, а на промяната на тактовия импулс. Тук съществе е разликата при функциониратено на D тригерите, които обаче не описах. Така имаме два различно действащи "D Latch" и "D Flip-flop".

От техническа гледна точка имаме и други особеност. Примерно RS тригерите са два вида. Аз описах единия, а другият работи на същия принцип, но с входни сигнали наобратно.

Между другото цифровата електроника си е реализирана с аналогови елементи. Това което описах е само един абстрактен модел. Ако правиш истинска платка, тогава трябва да се вземат под внимание много фактори. Примерно ако имаш две жици успоредни по платката и от двете страни. Ако по едната почнеш да пращаш 0 и 1, то по другата ще се индуцира някакво напрежение и съответно вече няма да имаме чисти сигнали 0 и 1. Ако добавим и други шумове от различни източници - нещата стават така, че може дори сигналът да прескочи от 1 в 0 или обратно и схемата да не работи правилно (въпреки коректното й цифрово изпълнение). Друг проблем са времената. Ако жицата е дълга (примерно 5 сантиметра), то сигналът се забавя. Това е съществен проблем при високите честоти (примерно изпълнение около 1GHz и нагоре). Това последното при моя вариант на симулатора е без значение, защото ще симулирам работа на устройство, което работи на много ниски честоти.
 
Предполагам, че става въпрос за нещо такова:

http://geobg.info/web/index.php?kinetic=7&kinetic2=1

http://geobg.info/web/index.php?kinetic=7&kinetic2=2

(Май работи само с Опера, ако не виждате нищо с друг браузър, опитайте с опера)
 
Ами успех!
Имаш толкова много елементи да добавяш, всеки с различни характеристики, тях как ще симулираш?
Ако ще е за 1-2 интегрални цифрови схеми добре, но ако искаш да имаш реален симулатор ти трябва доста повече от 1-2 елемента, още повече, че трябва да можеш да симулираш работата не само на интегралата, а и как тя ще се държи при различни външни елементи - резистори, кондензатори, захранващо напрежение, изходно напрежение и ток и т.н.
Ами какво ще стане ако дадеш изхода на късо(примерно, това също трябва да може да се симулира), конкретната интеграла има ли защита от късо съединение на изхода, няма ли?

А и още нещо - къде в "electronic circuit simulator" видя думичката "analog"?
 
Наистина задачата е сложна, но с някои ограничения може да се опрости.

Не е нужно да се допускат вариантите при късо съединение на входа и изхода и други такива ситуации.

Не е нужно да се въвеждат всички видове интегрални схеми. В цифровата техника има три основни елемента: "И", "ИЛИ", "НЕ". Всичко останало, включително различните видове тригери, делители, генератори, и т.н. са изградени от тези елементи.

Дали един елемент, примерно схемата "И", има два, три или осем входа, принципа на действие и логиката е една и съща.

Разбира се, направата на един пълноценен симулатор едва ли е по-силите само на един човек, пък бил той и отличен програмист, но симулатор на основните елементи и функции в съвсем реална цел.
 
rosko каза:
резистори, кондензатори, захранващо напрежение, изходно напрежение и ток и т.н.
rosko, ама направи най-накрая разлика между "симулатор на електронни схеми" и "симулатор на цифрови електронни схеми". При второто няма никакви кондензатори и резистори. Както споменах симулатор на електронни схеми е дебела работа и че има дори професионални, но супер некадърни разработки. При моята задача късото напрежение се хваща веднага при симулацията и резултатът естествено е появата на грешка. Относно компонентите - ще имам само такива каквито ми трябват за конкретната задача, а по-нататък ще добавям и други.

madmax_3 каза:
Всичко останало, включително различните видове тригери, делители, генератори, и т.н. са изградени от тези елементи.
Да това е вярно, но всъщност е непрактично. Симулацията на shift регистър става много лесно директно и бързо ще се симулира, а с въпросните компоненти ще натовари излишно компютъра.

madmax_3 каза:
Разбира се, направата на един пълноценен симулатор едва ли е по-силите само на един човек
Абсолютно вярно. То и затова аз почнах с туториял, а не да тръсна само нещо работещо. Ако един човек бъде въведен приятно в това, което съм направил, тогава може и да реши да го доразвива.
 
Е, ясно - ти искаш да симулираш само логически операции, а такъв софтуер не е като да няма, но все пак няма лошо да се пробваш, щом имаш желание :)
 

Back
Горе