Fachgebiet Rechnerarchitektur Fachbereich Informatik Aufgabe 2.1: Zähler Lösungsvorschlag 2. Übung Technische Grundlagen der Informatik II Sommersemester 2009 a) Beschreiben Sie einen 4-Bit-Zähler in Verilog HDL. Der Zähler hat einen Eingang für den Takt (mit clk bezeichnet). Der Zählerstand wird mit dem Ausgang count ausgegeben. module counter(clk, count); input clk; b) Der Zähler soll um einen Eingang für ein Enable -Signal erweitert werden. Es wird nur gezählt, wenn das Enable Signal high (1) ist. module counter(clk, enable, count); input clk, enable; if (enable) c) Der Zähler soll mit einem synchronen Reset (sreset) erweitert werden, so dass abhängig vom Takt der Zähler auf 0 zurückgesetzt wird. module counter(clk, enable, sreset, count); input clk, enable, sreset; if (sreset) Seite 1 von 7
d) Der Zähler soll mit einem asynchronen Reset (areset) erweitert werden, so dass unabhängig vom Takt der Zähler auf 0 zurückgesetzt wird. module counter(clk, enable, sreset, areset, count); input clk, enable, sreset, areset; always @(posedge clk or posedge areset) if (areset) else if (sreset) e) Über eine Leitung set und einen 4-Bit-Dateneingang value soll der Zähler synchron auf den Wert von value gesetzt wird, sobald set high ist. module counter(clk, enable, sreset, areset, set, value, count); input clk, enable, sreset, areset, set; input [3:0] value; always @(posedge clk or posedge areset) if (areset) else if (set) count <= value; else if (sreset) f) Der Zähler soll nur bis zu einem Wert max zählen, der über einen zu definieren Parameter gesetzt werden kann. Ist kein Parameter beim Modulaufruf angegeben, soll wie ohne einen Schwellwert gezählt werden. module counter(clk, enable, sreset, areset, count); parameter max = 15; input clk, enable, sreset, areset; always @(posedge clk or posedge areset) if (areset) else if (sreset) if (count >= max) // oder (count == max) Seite 2 von 7
else g) Schreiben Sie einen Testrahmen für die Teilaufgabe f), so dass für max = 5 zwanzig Takte ausgeführt werden. Enable soll immer 1 sein, die verschiedenen Reset-Leitungen immer 0. Geben Sie zusätzlich einen Ausdruck des Timing- Diagramms an, bei dem die Werte für clk und counter zu sehen sind. module countertest(); reg clk; wire [3:0] count; counter #(5) cnt(clk, 1, 0, 0, count); initial clk = 0; always #5 clk =!clk; initial begin repeat(20) @(posedge clk); $finish; initial begin $dumpfile( cnt.vcd ); $dumpvars(0); Alternativ: Testumgebung für Icarus mit Ausgabe auf der Konsole module test(); reg clk, enable, sreset, areset, set; reg [3:0] value; wire [3:0] count; counter #(5) c1 (clk, enable, sreset, areset, set, value, count); //Name des Moduls und der Parameterreihenfolge, Zahl in Klammern: //Maximalwert zum Testen initial begin clk = 0; //Werte zum Testen enable = 1; sreset = 0; Seite 3 von 7
areset = 0; set = 0; value = 4'b0000; repeat (20) #5 clk = ~clk; //Takt always @(clk, count) $display("clk: %b, count: %b, time: %t", clk, count, $time); initial #150 $finish; Aufgabe 2.2: T-Flip-Flop Schreiben Sie ein Modul tff mit den Eingängen t und clk (für den Takt) sowie dem Ausgang q, so dass es einem Toggle-Flip-Flop entspricht (positiv flankengesteuert; immer dann wenn t 1 ist, soll sich der Wert am Ausgang ändern). module tff(clk, t, q); input t, clk; output q; reg q; initial q = 0; if (t) q <=!q; Aufgabe 2.3: JK-Flip-Flop Schreiben Sie ein Modul jkff mit den Eingängen j, k und clk (für den Takt) sowie dem Ausgang q, so dass es einem JK-Flip-Flop entspricht (positiv flankengesteuert). J: Setzeingang, K: Rücksetzeingang. module jkff(clk, j, k, q); input j, k, clk; output q; reg q; initial q = 0; if (j && k) q <=!q; else if (j) q <= 1 b1; else if (k) q <= 1 b0; Seite 4 von 7
Aufgabe 2.4: Moore-Automat, Typ 1 Es ist untenstehes Zustandsdiagramm gegeben. Implementieren Sie einen entsprechen Automaten moore1 in Verilog. Ein Zustandswechsel erfolgt bei steiger Taktflanke, wenn die jeweilige Bedingung zutrifft. x = 1 module moore1(clk, x, y1); input clk, x; output y1; reg [1:0] s; initial s = 0; case (s) 0: if (x == 0) s <= 1; 1: if (x == 1) s <= 2; 2: s <= 0; default: s <= 0; // für den Fall s==3 case assign y1 = (s == 0) (s == 2); Aufgabe 2.5: Mealy-Automat y1 = 1 y1 = 0 y1 = 1 x = 0 x = 1 0 1 2 x = 0 Es ist untenstehes Zustanddiagramm gegeben. Implementieren Sie einen entsprechen Automaten mealy in Verilog. Ein Zustandswechsel erfolgt bei steiger Taktflanke, wenn die jeweilige Bedingung zutrifft. y = 1 y = x y = 0 x = 1 x = 0 x = 1 0 1 2 x = 0 module mealy(clk, x, y); input clk, x; output y; reg [1:0] s; initial s = 0; case (s) 0: if (x == 0) s <= 1; 1: if (x == 1) s <= 2; Seite 5 von 7
2: s <= 0; default s <= 0; // für den Fall s==3 case reg y; always @(s or x) begin case (s) 0: y = 1; 1: y = x; 2: y = 0; case // alternative kann die Ausgabe auch durch folge Zeilen erfolgen: // always @(s or x) y = (s == 0)? 1 : (s == 1)? x : (s==2)? 0 : 0; Aufgabe 2.6: Moore-Automat, Typ 2 Es ist untenstehes Zustandsdiagramm gegeben. Implementieren Sie einen entsprechen Automaten moore2 in Verilog. Das Register yd ist initial 0. Ein Zustandswechsel erfolgt bei steiger Taktflanke, wenn die jeweilige Bedingung zutrifft. yd 1 yd x yd 0 x = 1 x = 0 x = 1 0 1 2 x = 0 module moore2(clk, x, yd, state); input clk, x; output yd; output [1:0] state; assign state = s; reg [1:0] s; initial s = 0; reg yd; case (s) 0: begin if (x == 0) s <= 1; else s <= 0; yd <= 1; 1: begin if (x == 1) s <= 2; else s <= 1; yd <= x; 2: begin s <= 0; yd <= 0; Seite 6 von 7
default: s <= 0; // für den Fall s==3 case Aufgabe 2.7: Simulation und Vergleich der Automaten Simulieren Sie die Automaten aus den Aufgaben 2.4, 2.5 und 2.6. und vergleichen Sie die Zustandsfortschaltung und das Ausgangsverhalten. Die Simulation von Aufgabe 2.4 ergibt folges Verhalten: Die Simulation von Aufgabe 2.5 ergibt folges Verhalten: Die Simulation von Aufgabe 2.6 ergibt folges Verhalten: Es zeigt sich das erwartete Verhalten der Automaten (vgl. TGdI I, Automaten). Achtung Zeitmaßstab beachten! Seite 7 von 7