Eine Schaltung, einmal gezeichnet
Digitale Entwürfe wiederholen sich: Ein Halbaddierer steckt in jedem Volladdierer, ein Flip-Flop in jedem Register, derselbe Teiler in jeder Stufe eines Zählers. Jede Kopie Gatter für Gatter zu zeichnen dauert lange, und ein Fehler in einer Kopie ist schwer zu finden. Ein Block lässt Sie die Schaltung einmal zeichnen und beliebig oft platzieren.
Einen Block erstellen
Zeichnen Sie die Schaltung auf einer Ebene und benennen Sie ihre Schalter und Lampen: Klicken Sie auf das kleine Schild unter einem INPUT oder OUTPUT und tippen Sie einen Namen. Diese Namen werden zu den Anschlüssen des Blocks. Öffnen Sie dann den Reiter „Blöcke“ und drücken Sie „Block erstellen“. Der Dialog zeigt die gefundenen Anschlüsse, von oben nach unten so geordnet, wie sie auf der Zeichenfläche stehen, die Reihenfolge am Block spiegelt also Ihre Zeichnung.
Der Block erscheint im Reiter „Blöcke“. Klicken Sie ihn an oder ziehen Sie ihn beliebig oft auf die Zeichenfläche und verdrahten Sie ihn wie jedes andere Element.
- Ein Block braucht mindestens einen OUTPUT.
- Er darf keinen CLOCK enthalten: Nehmen Sie innen einen INPUT und führen Sie den Takt von außen in den Block.
- Notizen, Rahmen, VIAs und Netzbezeichnungen der Ebene bleiben draußen.
Einen Block ändern
Doppelklicken Sie einen Block oder drücken Sie den kleinen Stift unter seinem Namen, und die Schaltung in seinem Inneren öffnet sich auf der Zeichenfläche anstelle Ihrer eigenen. Bearbeiten Sie sie wie jede Schaltung und drücken Sie „Fertig“: Jede Kopie des Blocks, auf allen vier Ebenen und in der Bibliothek, übernimmt die neue Definition. Mit „Verwerfen“ ändert sich nichts.
Die Anschlüsse folgen ihren Namen. Benennen Sie einen Anschluss um, und seine Leitung bleibt, wo sie war; fügen Sie einen hinzu, und die anderen rücken mit ihren Leitungen nach unten; entfernen Sie einen, und nur seine Leitung verschwindet. Solange eine Definition geöffnet ist, ist das Speichern einer Schaltungsdatei abgeschaltet, damit ein halb bearbeiteter Block nicht als Ihre Schaltung in einer Datei landet.
Jede Kopie hat ihr eigenes Gedächtnis
Setzen Sie den Teiler zweimal und verketten Sie die Kopien, und Sie erhalten einen Teiler durch vier, dessen zwei Flip-Flops unabhängig zählen. Das ist keine Selbstverständlichkeit. Ein Simulator, der sich jedes Flip-Flop unter seinem nackten Namen merkt, sähe in zwei Blöcken dasselbe Flip-Flop an verschiedenen Anschlüssen, und beide hielten für immer dieselben Daten. Boolflow gibt jedem Element in einem Block einen eigenen Pfad, etwa U1/ff und U2/ff, sodass jede Kopie ihren eigenen Zustand hat.
Intern wird ein Block vor der Simulation in die Schaltung entfaltet, für die er steht, und jedes innere Element nach dem Block benannt, in dem es sitzt. Deshalb können Blöcke andere Blöcke enthalten: Die Entfaltung wiederholt sich einfach.
Was ein Block für die anderen Werkzeuge bedeutet
Für den Rest des Editors ist ein Block keine Blackbox. Der Signalverlauf zeichnet die Flip-Flops darin mit dem Namen des Blocks. Die Testfälle können die Schaltung treiben und über die Blockanschlüsse lesen. Wahrheitstabelle sowie Verilog-, VHDL- und C++-Export arbeiten mit der Schaltung, in der jeder Block entfaltet ist, der exportierte Code enthält also die Logik im Inneren, mit den Ports, die Sie außen benannt haben.
Speichern und Teilen
Eine Schaltungsdatei trägt die Definition jedes verwendeten Blocks, sie öffnet sich also auf jedem Rechner ohne Ihre Blockbibliothek. Die Bibliothek selbst, die Liste im Reiter „Blöcke“, liegt in Ihrem Browser: Ein erstellter Block ist beim nächsten Mal wieder da, und das Entfernen aus der Bibliothek berührt bereits platzierte Kopien nicht.
Probieren Sie es selbst
Öffnen Sie das Teiler-Beispiel: ein DIV2-Block, zweimal platziert. Drücken Sie „Signalverlauf“ und beobachten Sie beide Ausgänge Q. Zeichnen Sie dann Ihren eigenen Halbaddierer mit den Eingängen A und B und den Ausgängen S und C, machen Sie einen Block daraus und verschalten Sie zwei davon und ein OR-Gatter zu einem Volladdierer.