Seite 1 von 1

4. Übung

Verfasst: 2. Mai 2008 13:18
von m0ep
Mal eine Kurze frage zur Aufgabe 1c
In der Aufgabe steht ja, dass das Ergebnis um einige Takte verzögert berechnet wird.
Doch für einen Takt brauche ich ja einen Taktgeber.

Also hab ich das Modul als Schritt-Steuerwerk implementiert und einen clock-Eingang hinzugefügt.

Da wollte ich fragen ob man das so machen kann oder ich es ohne clock realisieren soll,
da in Aufgabenstellung nichts näheres davon steht.

Re: 4. Übung

Verfasst: 2. Mai 2008 13:32
von Wolfgang
Hallo,

das Modul wird einen Clock-Eingang haben. Richtig!
Allerdings auch bei Aufgabenteil a). Die Realisierung der Pipelinestufen (R1 - R4)
impliziert doch die Benutzung eines Taktes, oder?

Zur Realisierung des valid-Signals gibt es sicherlich mehrere Varianten.
Ein Schritt-Steuerwerk geht sicherlich auch :-)

Viele Grüße

Wolfgang

Re: 4. Übung

Verfasst: 2. Mai 2008 13:57
von m0ep
alles klar, danke

Re: 4. Übung

Verfasst: 6. Mai 2008 15:41
von Maradatscha
gibt es eine elegante Lösung interne register in der Simulation mit auszugeben?
bisher leite ich sie einfach als output nach außen, das ist aber ziemlich unschön.

Re: 4. Übung

Verfasst: 6. Mai 2008 16:09
von attila
Hi,

nach durchgeführter Simulation kannst du im Fenster "Sources" im Reiter "Sim Instances" im Baum die simulierte Instanz (häufig mit "uut" bezeichnet) auswählen. Im Fenster "Processes" erscheinen dann im Reiter "Sim Objects" alle Signale innerhalb dieser Instanz. Mit Drag+Drop lassen sie sich ins Wave-Fenster ziehen. Danach muss die Simulation neu gestartet werden.

Ob das nun besonders elegant ist weiß ich nicht, aber es funktioniert :)

Grüße, Attila

Re: 4. Übung

Verfasst: 6. Mai 2008 22:32
von Xaero
Hat jemand schon die Aufgae 4.c gelöst?
Ich verstehe das mit dem valid nicht ganz.
Wenn ich R1 nach jedem Takt ein neuen Wert anlege, dann ist ja das valid immer 1, wobei schon die Pipeline gefüllt ist. Oder verstehe ich da was falsch?

Re: 4. Übung

Verfasst: 6. Mai 2008 23:54
von Wolfgang
Hallo zusammen,

Du hast natürlich recht: Wenn ich in jedem Takt das R1 neu lade, bleibt das
valid-Bit immer eins.

Aber es kann doch passieren, dass in einem Takt mal kein neuer Wert in R1 geladen wird.
Wenn man mehrere Takte nichts mehr in R1 lädt, würde die Pipeline leer laufen.

Und genau das soll erkannt werden und durch ein Bit angezeigt werden.

Gruß Wolfgang

Re: 4. Übung

Verfasst: 6. Aug 2008 15:32
von Trendopfer
Wolfgang hat geschrieben: das Modul wird einen Clock-Eingang haben. Richtig!
Allerdings auch bei Aufgabenteil a). Die Realisierung der Pipelinestufen (R1 - R4)
impliziert doch die Benutzung eines Taktes, oder?
Hmm...nee für mich nicht wirklich!!
Könnte mir das mal jemand ausführlich erklären wann ich nun eine Clock brauche und wann ich das ohne Takt implementieren kann??

Und warum ist die Registerzuweisung in der Pipeline eigentlich synchron (d.h. Benutzung von <= )??
Die Pipeline habe ich so verstanden dass man Werte sequentiell d.h. nacheinander berechnet!!! Da hat, meiner Meinung nach, die synchrone Zuweisung nichts verloren (denn ich weise die Werte ja sowieso nacheinander nach der jeweiligen Berechnung den Registern zu), oder?!?!?!

Code: Alles auswählen

// Die Pipeline
always @(posedge clock)
begin
if (ldreg1)
r1 <= in;
else
r1 <= r1;
r2 <= f1(r1);
r3 <= f2(r2);
r4 <= f3(r3);
end
Meine Lösung sieht nämlich so aus:

Code: Alles auswählen

always @(posedge clock)
begin
	if (ldreg1)
		begin
			r1 = in;
			r2 = f1(r1);
			r3 = f2(r2);
			r4 = f3(r3);
		end
end
Vielen Dank im Voraus!!

Re: 4. Übung

Verfasst: 7. Aug 2008 18:22
von SebFreutel
Dann hast du grade den Pipelineeffekt ausgeschaltet und nur noch die Berechnung in Teilschritte zerlegt.

Sinn der Pipeline ist es, nacheinenader ausgeführte Operationen zu beschleunigen, indem zu jedem Zeitpunkt mehrere Operationen jeweils einen Teilschritt (eine Pipelinestufe) durchlaufen.

In TGdI2 gabs ein Beispiel von einem Waschsalon, wo jedes Kleidungsstück in die Waschmaschine, den Trockner und die Bügelmaschine kommt.
Da wird natürlich die Waschmaschine schon wieder mit dem 2. Stück befüllt, sobald das 1. fertig ist und in den Trockner kommt, sonst würde die Waschmaschine ja sinnlos im Leerlauf stehen (und das machst du mit deiner blockierenden Zuweisung).
Es wird also gleichzeitig ein Kleidungsstück aus der Bügelmaschine genommen, eins von Trockner in Bügelmaschine transfreiert, eins von Waschmaschine in Trockner und eins in die Waschmaschine getan (wenn bereits alle diese Pipelinestufen gefüllt sind und noch genug Kleidungsstücke da sind, die bearbeitet werden müssen).
Diese Gleichzeitigkeit erfordert eine synchrone Zuweisung, darum das nonblocking statement und der Takt.

Und asynchron kann mans nicht zuwesien, denn wenn der Trockner länger braucht als die Waschmaschine, kann man ja nicht einfach den Kram aus der Waschmaschine in den Trockner füllen, sondern muss sich bei seinem Takt insgesamt nach dem langsamsten Gerät richten.

Sequentiell bearbeitet werden die Kleidungsstücke natürlich trotzdem, es sind nicht mehrere gleichzeitig in der Bügelmaschine, sie gehen in der Reihenfolge aus der Pipeline raus wie sie reinkamen, aber die einzelnen Stufen bearbeiten parallel unterschiedliche Kleidungsstücke und Beschleunigen damit die Gesamtausführung (im Idealfall bei n Stufen n-mal schneller).