logische Schaltungen

Hi, die neue Aufgabe kommt von blueflash:

"ich hab mir ne tolle programmieraufgabe überlegt.
ich muss im studium des öfteren logische schaltungen berechnen. d.h.
eingangssignalverlauf -> ausgangssignalverlauf
wäre cool, dafür ein proggi zu haben. das sollte in zweiter
schwierigkeit auch reaktionszeiten berücksichtigen."

Also gegeben wird eine logische Schaltung(bzw. eine Formel) und der Signalverlauf der Eingangssignale und als Ergebnis wird der Verlauf des Ausgangssignals geliefert.
Man kann das Programm auch noch ergänzen indem es z.B. die Schaltung minimiert oder eine NAND/NOR Schaltung mit gleichem Signalverlauf liefert, aber das sind Zusätze.

Viel Spaß damit

Norna
 
ja ne is klar!
ich würd mich gern an die arbeit machen aber da giebt nur ein problem:
was für schaltungen? also ich kann dir sagen wie man etwas über den com-port ansteuert
aber vom fach hab ich keinen blassen schimmer. also bitte gieb mir ma nen link oder so damit auch ich erleuchtet werde.
 
Er will, dass das Programm nur die Schalter berechnet und nicht das du Schaltungen per PC ansteuerst. Oder irre ich mich?
 
Logische schaltungen sind welche mit Nicht And Or Nor Nand Bausteinen diese werden vorwiegend als ic`s (cmos) vertrieben...
diese Schaltglieder funzen genau nach dem selben prinzip wie die befehle aussm rechner...
Schltbilder sehen ungefähr so aus:
Code:
          _______          
---------|       |
         |    &  |----------     AND
---------|_______|
          _______          
---------|       |
         |    &  |o----------    NAND
---------|_______|
          _______          
---------|       |
         |   ^1  |----------     OR
---------|_______|
          _______          
---------|       |
         |   ^1  |o----------    NOR
---------|_______|
 
Ich weis jetzt net merh wirklich wie das gemeint sein soll. Also sagen wir mal der User sagt das die Schalter so verknüpft sind (nurn Beispiel) und mein Programm gibt dann die Resultate aus:
Code:
1 -
     &  - (Vom Programm berechnet) 0
0 -            -
                   ^1  - (Vom Programm berechnet) 1
1 -            -
     & - (Vom Programm berechnet) 1
1 -
Oder wie soll das ablaufen?
 
Hi
ich sehe das so, bei dem von dir verwendeten beispiel hast du 4 Eingänge, erstellen wir erstmal eine Funktionsgleichung:

(E1 und E2) oder (E3 und E4) = 1

also muss folgendes erfüllt sein
Der Eingang 1 und 2 oder 3 und 4 muss jeweils 1er status haben, damit die Und funktion erfüllt ist, wenn jezt einer der beiden Und Ausgänge 1 hat, ist A1 also der Ausgang der gesammten Schaltung auch 1.

Dies soll dein Programm berechnen, wenn ich Nornagest richtig verstanden habe

mfg
Sven
 
Der User gibt eine Gleichung ein und das Programm gibt
aus was am Ausgang rauskommt, hab ich das richtig verstanden?
 
Ja aber in welcher Weise sollte der User das eingeben etwa so?
Code:
(&E1=0, E2=1;&E3=1, E4=1;)^1
?
Und wenn mans dann och mehr verknüpfen wollte könnte man ja auch das realisieren:
Code:
((&E1=0, E2=0;&E3=1, &E4=1;)^1)&((&E5=1, E6=1;&E7=0, &E8=1;)^1)
(Ergibt übrigens 1) Müsste man dann halt nen Synaxen-Checker(und -Auswerter) für bauen. So würd ichs realisieren.
Dabei wären halt alle Blöcke in Klammern miteinander verknüpft.
Code:
&EingangNummer=Wert, EingangNummer=Wert; -- Synaxe
^1EingangNummer=Wert, EingangNummer=Wert; -- Sysnaxe
() -- Verknüpfung
 
Zur Theorie:

Eine Schaltung lässt sich am besten als ein Baum auffassen, an dessen Spitze der Ausgang steht, dieser Baum verzweigt dann nach unten über diverse Knoten (AND, OR, XOR) bis hin zu den Eingängen. Die Berechnung der Schaltung erfolgt dann rekursiv entlang des Baumes nach unten.

Zur Praxis:
Ich schätze, der beste dateityp für die darstellung dieser schaltung wäre xml, da hier die baumstruktur sehr einfach zu implementieren ist.
 
Eingabe kann man z.B. als XML oder einfach in Formd er Gleichung machen (wie Sven vorschlug).

Berechnen kann das Programm eine Wertetabelle oder auch den Wert am Ausgang für eine bestimmte Eingangsbelegung.

So hatte ich das jedenfalls gedacht,
natürlich ist noch Platz für eigene Erweiterungen. :)

Nornagest
 
Wie währe es mit...

... Wertetabelle vom User eingegeben-> KV-Diagramm -> Blöcke finden -> "Blöcke" aufzeigen -> Einzelne Funktionsterme hinschreiben (E1^!E2 usw.) -> gesamter Funktuionsterm hinschreiben

Hänge gerade am Blöcke aufzeigen (die Darstellung der Blöcke, die über den Rand gehen, machen mir Probleme :( ), gefunden habe ich sie schon, auch mit DontCareFeldern. Auch wie ich auf die Funktionsterme komme, weiß ich schon ziemlich genau. Naja, werde es hier veröffentlichen... wahrscheinlich mit Source (momentan 335 Zeilen Spagethiecode inkl. Pseudoobjektorientierung :D )

MfG zemy

Das hätte ich zumindest in meiner Ausbildung gebraucht... und aus dem Funktionsterm ne Schaltung zu zaubern, müsste man eigentlich alleine hinbekommen....
 
Puh ich hatte auch mal so was in meiner Ausbildung. Musste dann immer diese Pläne selber zeichnen und lesen, das war ein Rotz *g*...
 
Ich kenn das auch noch. So ein KV-Plan aus ner Wertetabelle war einfach.. auch die Schaltung daraus zu entwickeln war maximal zeitraubend. Das Schlimmste war immer die KV-Dinger (mit gekenzeichneten Blöcken natürlich!) in ne Präsi (Powerpoint natürlich!) zu packen. Im 2. HJ. hatte ich mir schon ne Grafik vorbereitet und dort immer nur die 0en und 1en eingetragen. Da ging das wieder. Ich glaube, ich baue auch noch ne SavePictureOption ein. Mal sehen ob ich das Proggi dann fürs Studium brauche^^

PS: Zeichen tut er jetzt :D Ist ne If-Bedingung über 3 Zeilen geworden.
Code:
...
      Pos.Left:= bloecke[i].x + 1;
      Pos.Right:= ((bloecke[i].x + bloecke[i].width -1) mod (KV_WIDTH[akt_num])) + 1;
      Pos.Top:= bloecke[i].y  + 1;
      Pos.Bottom:= ((bloecke[i].y  + bloecke[i].height -1) mod (KV_HEIGHT[akt_num])) + 1;
      if (ARow>0) and (ARow<=KV_HEIGHT[akt_num]) and (
        ((Pos.Top<=Pos.Bottom) and (ARow>=Pos.Top) and (ARow<=Pos.Bottom)) or
        (((Pos.Top>Pos.Bottom) and ((ARow>=Pos.Top) or (ARow<=Pos.Bottom))))) then
        begin
          if (ACol = Pos.Left) then
            begin
              left[lc]:=i;
              inc(lc);
            end;
          if (ACol = Pos.Right) then
            begin
              Right[Rc]:=i;
              inc(Rc);
            end;
        end;
...
^^
 
probier doch mal trysim (oder so ähnlich). damit kannst du entweder in SPS programmieren, ein schaltdiagram zeichenen oder eine funktionsgleichung ausfstellen. das program wandelt es danna uch simultan in die anderen eingabemöglickeiten um, so dass du gleichzeitig in drei umgebungen entwickeln kannst.

Du kannst dir dazu sogar ganze Maschienerien zeichnen, die dann eine Funktion ausführen. Allerdings gibt es glaub ich keine wertetabelle.

Ne demo / lite- version gibt es kostenlos zum download, eine schülerversion kostet nur 10?
 
für digitale schaltungen empfehle ich hspice ;)
musst dir nur deine cmos gatter selbst zusammen bauen, aber simulation, und auswertung wirste nicht präziser kriegen ;)

viel spass, beim coden eines annähernd gleichmächtigen tools :p
 
Zurück
Oben