Logik Simulator

Präsentation und Organisation von eigenen Projekten
Antworten
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Logik Simulator

Beitrag von cloidnerux » Mi Okt 29, 2014 7:08 pm

Einleitendes:
Als Aufgabe für die UNI galt es, einen kleinen Simulator für Kombinatorische Logik zu programmieren.
Dabei geht es nicht um die dynamische Auswertung einer Logikgleichung, sondern um das durchlaufen der logischen Signale durch ein gegebenes Netz mit Signalverzögerung(Propagation delay) und sinnvoller Iteration. Daher geht es hier nicht darum, eine Logiggleichung aufzulösen, sondern um die reelle Implementation von Logik durch Bauteile mit parasitären Eigenschaften(Propagation delay, contamination delay)

Grundlage:
Für die Simulation wird ein Netz in "Knoten" und "Funktionen" zerlegt.
Ein "Knoten" ist jeder Eingang/Ausgang sowie die Verbindung zwischen Gattern. Knoten daher, da alle Eingänge die an diesen Punkt angeschlossen sind, den selben Wert haben.
Zudem hat jeder Knoten ein "Gewicht", was angibt durch wie viele Gatter der längste Pfad zu einem Eingang führt. Dies ist wichtig, um bei der Simulation erst alle vorhergehende Knoten zu berechnen, da sonst Fehler auftreten.

Eine Funktion ist alles was aus 1-n Eingängen 1-m Ausgangssignale generiert, sowas wie ein UND-Block oder ähnliches. Dabei hat jede Funktion auch einen "delay", der Angibt wie viele Iterationen es dauert, bis eine Änderung am Eingang eine Änderung am Ausgang erzeugt(propagation delay).

Momentan wird dies noch etwas umständlich Eingegeben:

Code: Alles auswählen

    nodes.push_back(make_shared<node<bool>>(new node<bool>(0)));		//ID 0
	nodes.push_back(make_shared<node<bool>>(new node<bool>(0)));		//ID 1
	nodes.push_back(make_shared<node<bool>>(new node<bool>(0)));		//ID 2
	nodes.push_back(make_shared<node<bool>>(new node<bool>(1)));		//ID 3
	nodes.push_back(make_shared<node<bool>>(new node<bool>(1)));		//ID 4
	nodes.push_back(make_shared<node<bool>>(new node<bool>(2)));		//ID 5
	nodes.push_back(make_shared<node<bool>>(new node<bool>(2)));		//ID 6
	nodes.push_back(make_shared<node<bool>>(new node<bool>(3)));		//ID 7

	tFuncs.push_back(make_shared<XORFunc>(new XORFunc(nodes[0], nodes[1], nodes[3], 2)));     //last number is the propagation delay in iteration cycles. For the XOR it is 2
	tFuncs.push_back(make_shared<XORFunc>(new XORFunc(nodes[2], nodes[3], nodes[5], 2)));
	tFuncs.push_back(make_shared<ANDFunc>(new ANDFunc(nodes[0], nodes[1], nodes[4], 1)));
	tFuncs.push_back(make_shared<ANDFunc>(new ANDFunc(nodes[2], nodes[3], nodes[6], 1)));
	tFuncs.push_back(make_shared<ORFunc>(new ORFunc(nodes[6], nodes[4], nodes[7], 1)));
Zuerst werden alle Knoten angelegt und ein Gewicht zugewiesen, danach werden die logischen Blöcke instantiiert und mit den Entsprechenden Knoten verbunden. Dabei muss noch auf eine händische Zeichnung zurück gegriffen werden oder man muss gut Nachdenken ;)
Volladdierer.jpg
Code
Der code ist in diesem Github zu finden:
https://github.com/cloidnerux/LogikSimulator
Projekt kann mit cmake erstellt werden und wurde bisher mit VS2012 unter Win7 x64 getestet.

Momentan ist nur ADD, OR und XOR implementiert, weitere Logikbausteine lassen sich aber einfach durch ableiten der "tFunc" Klasse realisieren.
Durch den Aufbau des ganzen ist es möglich Bausteine mit beliebig vielen Ein- und Ausgängen zu definieren, die eine beliebige Funktion realisieren(wenn man z.B eine ALU hinzufügen will, etc)

Noch in Arbeit
Was noch kommen soll ist das Generieren der Knoten und Funktionen entweder aus einer Logiktabelle oder aus den Daten eines Diagrammzeichners(Dia).
Auch soll noch eine "analoge" Simulation kommen, bei der die Knoten keinen binären Zustand mehr haben(false, true) sondern einen diskreten(0-255) und die Umschaltung mit Zeitfunktionen beschrieben wird.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten