Projekt 2 - Das Flip-Flop

Ein Flip-Flop ist ein Baustein, der als kleinste Speicherzelle aufgefasst werden kann, er kann genau ein Bit speichern. Das einfachste Flip-Flop besitzt zwei Eingänge (Set und Reset) und einen bzw. zwei Ausgänge Q und Q-Strich. Q-Strich ist einfach der invertierte Ausgang von Q. Ein solches Flip-Flop heißt RS-Flip-Flop. Daneben gibt es Flip-Flops die einen getackteten Eingang haben, die mit jeder steigenden (oder fallenden) Taktflanke umschalten und zuletzt das D-Flip-Flop, welches das an D anliegende Signal mit dem nächsten Takt übernimmt.Für die weiteren Projekte werden alle drei Flip-Flop-Typen gebraucht.


Aufgabe:
Erstelle ein D-Flip-Flop. Dieses verfügt über einen Dateneingang data_in, einen Reset-Eingang reset, einem Takteingang clk und einem Datenausgang data_out. Wenn eine positive Taktflanke (rising_edge) auf clk erkannt wird, wird der logische Wert von data_in auf data_out übergeben. Bei einem Reset (reset = '0') wird data_out  <= '0'.


Das RS-Flip-Flop

1.Schritt
Zuerst wird mit dem Projekt-Wizard ein neues Projekt erstellt. Vor dem Starten sollte unbedingt ein leeren Ordner angelegt werden. Dieser wird dann als Verzeichnis angegeben. Der Projektname ist beliebig, er lautet hier RS_Flipflop. Wichtig ist der Top-Level-Enity Name, dieser ist Flipflop_top.Nun kann mit der Schaltfäche Use Existing Project Settings... das erste Projekt eingelesen werden. Beide Warnhinweise werden jeweils mit NO quittiert und danach mit Finish der Wizard beendet.

2.Schritt
Mit File New öffnet sich ein neues Fenster


Ausgewählt wir Block Diagram. Mit OK bestätigen.

3.Schritt
Es öffnet sich ein leeres Fenster, in dem man die Schaltfläche Block Tool auswählt.



4.Schritt
Man zieht einen neuen Block in das Fenster und klickt ein mal auf die Pfeil Schaltfläche.


5.Schritt
Mit der rechten Maustaste klickt man in den Block, es öffnet sich ein neues Fenster. Dort wählt man den Punkt Properties aus.


6.Schritt
In dem neuen Fenster wird der Name des Blockes eingetragen. Dieser muss unbedingt mit dem Top-Level-Entity übereinstimmen, damit man später nichts mehr ändern muss. In unserem Fall lautet er Flipflop_top.


7.Schritt
Durch klicken auf den Reiter I/O gelangt man zu den nächsten Einstellungen. Unser RS-Flip-Flop soll zwei Eingänge (set und reset) und zwei Ausgänge (Q und Q_strich) haben.



Durch klicken in das Feld <NEW> kann man dort den Namen des Ein- bzw. Ausganges eingeben. Mit ENTER bestätigen. Durch einen weiteren Klick in das Feld INPUT kann dort auch OUTPUT ausgewählt werden. Wenn alles richtig gemacht wurde, sieht unser Block nun so aus.



Nun mit File Save...as unter Flipflop_top.bdf speichern.
8.Schritt
Mit der rechten Maustaste noch mal in den Block klicken, es öffnet sich wieder das im Schritt 5 beschriebene Fenster. Diesmal wird allerdings der unten gezeigte Punkt ausgewählt.



Danach öffnet sich ein neues Fenster, in dem VHDL ausgewählt wird und der Dateiname unbedingt Flipflop_top.vhd lauten muss, da er unsere Top-Level-Entity enthält. Das Fenster mit OK schließen.

9.Schritt
Nun wurde automatisch ein VHDL-File erzeugt. Aus diesem kann man alle grünen Kommentare (egal was da steht!) löschen. Unser VHDL-File sieht danach nun so aus.



10.Schritt
Bevor wir nun dieses verändern, können wir die Pins noch zuordnen. Dazu die Schaltfläche  anklicken und nach Fertigstellung den Pin-Planer aufrufen.



Dabei liegt set auf dem Key0 und reset auf dem Key1. Q ist der LEDR0 zugeordnet, Q_strich der LEDR1.

11.Schritt
Nun müssen wir nur noch das Flip-Flops mit VHDL programieren. Der ENTITY -Block ist komplett fertig und darf nicht mehr verändert werden. Das unten gezeigte Program ist eine Möglichkeit der Programmierung. Wem das Eintippen zu lästig ist, kann alles als Textfile RS_Flipflop.txt herunterladen und mit Copy und Paste einfügen.



Kurze Programmerklärung


Zuerst wird mit SIGNAL intern ein internes Signal definiert, dass vom Prinzip her einem Eingabe- oder Ausgabesignal entspricht, aber nicht nach außen verbunden ist.

Achtung: Bei den Tastern bedeutet eine logisch '1' dass der Taster nicht gedrückt wurde.Daher wird ein gedrückter Taster mit einer logischen '0' abgefragt!

Mit BEGIN starten wir die Definition unserer Beschreibung

PROCESS(set,reset) bedeutet, dass dieser Block ausgeführt wird, wenn sich das set oder resetSignal ändert. Er wird ebenfalls mit einem BEGIN gestartet.

Die erste IF....THEN Bedingung fragt das Drücken des SET-Tasters ab. Ist dieser gedrückt, wird das interne Signal auf logisch '1' gezogen.

Die zweite IF....THEN Bedingung fragt den RESET-Taster ab. Das interne Signal wird auf logisch '0' gezogen.

Mit Q <= intern wird Q mit dem internen Signal intern verbunden.

Mit Q_strich <= not intern wird Q_strich mit dem invertierten Signal intern verbunden.

12.Schritt
Das fertige Projekt wird nun mit Compilation übersetzt, was einige Minuten dauern kann und dann mit dem Programer auf das Board übertragen. Die Bedienung des Programers ist in der ersten Anleitung ausführlich beschrieben.



Das komplette Projekt kann als RS_Flipflop.zip heruntergeladen werden.


Das getaktete Flip-Flop mit Reset

1.Schritt Zuerst wird mit dem Projekt-Wizard ein neues Projekt erstellt. Vor dem Starten sollte unbedingt ein leeren Ordner angelegt werden. Dieser wird dann als Verzeichnis angegeben. Der Projektname ist beliebig, er lautet hier T_Flipflop. Wichtig ist der Top-Level-Enity Name, dieser ist T_flipflop_top

Nun kann mit der Schaltfäche Use Existing Project Settings... das erste Projekt eingelesen werden.Beide Warnhinweise werden jeweils mit NO quittiert und danach mit Finish der Wizard beendet.         

                                                                                       

2.Schritt
Mit File New öffnet sich ein neues Fenster. Ausgewählt wird das Block Diagram. Mit OK bestätigen.

3.Schritt Es öffnet sich ein leeres Fenster, in dem man die Schaltfläche Block Tool auswählt.
Man zieht einen neuen Block in das Fenster und klickt ein mal auf die Pfeil-Schaltfläche. Mit der rechten Maustaste klickt man in den Block, es öffnet sich ein neues Fenster. Dort wählt man den Punkt Properties aus.In dem neuen Fenster wird der Name des Blockes eingetragen. Dieser muss unbedingt mit dem Top-Level-Entity übereinstimmen, damit man später nichts mehr ändern muss. In unserem Fall lautet er T_flipflop_top. Durch klicken auf den Reiter I/O gelangt man zu den nächsten Einstellungen. Unser RS-Flip-Flop soll zwei Eingänge (clk und reset) und einen Ausgang (Q ) haben. Durch klicken in das Feld <NEW> kann man dort den Namen des Ein- bzw. Ausganges eingeben. Mit ENTER bestätigen. Durch einen weiteren Klick in das Feld INPUT kann dort auch OUTPUT ausgewählt werden. Wenn alles richtig gemacht wurde, sieht unser Block nun so aus. Nun mit File Save...as unter T_flipflop_top.bdf speichern. Mit der rechten Maustaste noch mal in den Block klicken, es öffnet sich wieder das im Schritt 5 beschriebene Fenster. Diesmal wird allerdings der unten gezeigte Punkt ausgewählt. Danach öffnet sich ein neues Fenster, in dem VHDL ausgewählt wird und der Dateiname unbedingt T_flipflop_top.vhd lauten muss, da er unsere Top-Level-Entity enthält. Das Fenster mit OK schließen. (siehe dazu auch die ausführliche Anleitung weiter oben).

4.Schritt
Nun wurde automatisch ein VHDL-File erzeugt. Aus diesem kann man alle grünen Kommentare (egal was da steht!) löschen. Unser VHDL-File sieht nun so aus.


5.Schritt
Bevor wir nun dieses verändern, können wir die Pins noch zuordnen. Dazu die Schaltfläche Start Analysis & Synthesis anklicken und nach Fertigstellung den Pin-Planer aufrufen.


Dabei liegt clk auf dem Key0 und reset auf dem Key1. Q ist der LEDR0 zugeordnet. Den Pin-Planer einfach schließen, es muss nichts gespeichert werden.


6.Schritt
Nun müssen wir nur noch das Flip-Flops mit VHDL programieren. Der ENTITY-Block ist komplett fertig und darf nicht mehr verändert werden. Das komplette VHDL-Programm kann als T_flipflop_top.txt heruntergeladen werden und mit Copy und Paste eingefügt werden.



Kurze Programmerklärung


Zuerst wird mit SIGNAL intern ein internes Signal definiert, dass vom Prinzip her einem Eingabe- oder Ausgabesignal entspricht, aber nicht nach außen verbunden ist.

Achtung:   Bei den Tastern bedeutet eine logisch '1' dass der Taster nicht gedrückt wurde. Daher wird ein gedrückter Taster mit einer logischen '0' abgefragt!


Mit BEGIN starten wir die Definition unserer Beschreibung


PROCESS(clk) bedeutet, dass dieser Block ausgeführt wird, wenn das clk-Signal eine steigende Flanke (rising_edge) hat. Er wird ebenfalls mit einem BEGIN gestartet.


Die erste IF....THEN Bedingung fragt ob das interne Signal den logischen Wert '0' hat. Wenn ja, dann wird das Signal in logisch '1' geändert, wenn nein in logisch '0'. Das entspricht einer Umschaltung.


Die zweite IF....THEN Bedingung fragt den RESET-Taster ab. Das interne Signal wird auf logisch '0' gezogen. Logisch '0' bedeutet gedrückter Taster (siehe oben!).


Mit Q <= intern wird Q mit dem internen Signal intern verbunden.        


7.Schritt
Das fertige Projekt wird nun mit Compilation übersetzt, was einige Minuten dauern kann und dann mit dem Programmer auf das Board übertragen. Die Bedienung des Programmers ist in der ersten Anleitung ausführlich beschrieben.

Das komplette Projekt kann als T_flipflop.zip heruntergeladen werden.