Es gibt einen globalen Takt CLK für alle positiv flankengesteuerte
Speicherglieder (positive edge triggered). Langsamere Abläufe werden mit
der Kombination aus CLK und CE (clock enable) realisiert.
Das CE Signal wird mit der gewünschten Frequenz immer für einen Zyklus '1'.
Praktische Realisierung von Speicherglieder: Baustein
Praktische Realisierung von Speichergliedern: Schaltung
Im Schaltsymbol kann man das Dreieck für die Taktflankensteuerung erkennen.
Es werden 2 Takteingangssignale verwendet.
Diese sind nicht überlappend, damit eine korrekte Funktion sichergestellt wird.
Beim Resetb Eingang sieht man einen Kreis. Das Signal wird invertiert.
Wenn das Signal '0' ist, wird das D-Flip-Flop zurück gesetzt.
Im Zweifelsfall sollte man die Funktion möglichst früh verifizieren.
Wenn man nicht selbsterstellte Schaltungsblöcke verwendet, sollte immer ein Test dabei sein,
der die Funktion verifiziert.
Weiterhin sieht man in der Abbildung den Schaltplan mit Transistoren.
Der Schaltplan enthält 2 Latches. Der Reset ist synchron,
da das Signal alternativ zu den Daten anliegt wird.
Unten sieht man noch lokale Treiber für die CLOCK Signale, um auch invertierte Signale zu erzeugen.
Insgesamt hat die Schaltung 30 Transistoren.
Im Layout sieht man, wie gross ein typisches D-Flip-Flop ist.
Transistoren ergeben sich an den kreuzungen der orangen und grünen Flächen.
Die Gesamtfläche wird dabei weniger durch die Transistoren,
als durch die Anschlüsse und die Verdrahtung bestimmt.
VHDL code eines Speichergliedes
entity: Name, Eingänge, Ausgänge
Process
Sensitivity list !!!
Architecture
Positive Flankensteuerung:
Clk‘event and clk='1'
Asynchrones RESET
Unvollständiges if else erzeugt Speicherglieder.
Clk='0' und Clk='1' fehlt hier
CE: CLK enable signal fehlt
entity DFlop is
port (
clk, d, reset: in std_logic;
q,bq: out std_logic
);
end entity DFlop;
architecture Behavioral of DFlop is
begin
process(clk,reset)
begin
if ( reset = '1') then
q<='0'; bq<= '1';
elsif (clk'event) and (clk='1') then
q<=d; bq<= not(d);
end if;
end process;
end architecture Behavioral;
Für ein Speicherglied benötigt man in VHDL einen 'process' Block und eine unvollständige 'if' Anweisung.
Im Beispiel oben wird nur das Verhalten für eine steigende CLK Flanke definiert.
Alle anderen Fälle für das CLK Signal werden nicht spezifiziert.
Dies stellt eine unvollständige 'if' Abfrage dar und der VHDL Compiler erstellt ein Speicherglied.
Es ist nicht klar, ob der Compiler ein Speicherglied mit Inverter für q und bq synthetisiert,
oder 2 Speicherglieder eins für q und eins für nicht q.
In der Log Datei werden diese Informationen aufgeführt.
Man sollte rising_edge(clk) statt (clk'event) and (clk='1') verwenden.
Verifikation mit Simulation
Hierarchische Blöcke
Component, Instanz
Abfrage eines Tasters
Pull down und/oder pull up Widerstand
Clock: 10 MHz, 100ns
Drücken: 100ms 10 mal pro Sekunde.
Prellen
Jeder Wechsel von 0 auf 1 kann eine Aktion auslösen.
Beim einmaligen Drücken wird der Taster mehrmals von der Clock abgefragt
und der Zähler wird mehrmals hochgezählt.
Ein langsamer Takt, der durch einen Zähler erzeugt werden kann,
oder besser ein CE Signal wird zur Abfrage verwendet.
Das Abfrageintervall darf nicht zu kurz oder lang sein.
Ist das Intervall zu lang hat der Benutzer das Gefühl es passiert nichts.
Zustandsmaschinen
Automaten: zeitgesteuerter Ablauf mit einem Takt
Zähler, Uhr, Waschmaschine, Aufzug, MP3 Player
Mealey, Moore, Medwedew
Mealey: Y = g( x, S(f(x)))
Der Ausgang Y ist vom Eingang X und Zustand S abhängig.
Moore: Y = g( S(f(X)))
Der Ausgang Y vom Zustand S abhängig.
Medwedew: Y = S(f(X))
Der Ausgang Y ist der Zustand S.
Aufgrund der Testbarkeit werden nur noch Medwedew
Automaten verwendet.
Fragen und Diskussion
Ist die Truth Table des CD4013 eine Wahrheitstabelle oder eine Zustandstabelle?
Wozu benötigt man einen Pull down Widerstand?
Warum ist ein CE Signal besser als ein langsames Clock Signal?
Warum ist der Medwedew Automat besser testbar als andere Automaten?