Forum: FPGA, VHDL & Co. Wie schreibe ich eine Tesbench in VHDL für einen Multiplexer4x1? Meine funktioniert nicht!


von balle (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag,

ich lerne gerade VHDL und übe an einem 4x1 Multiplexer. Ich verwende 
Quartus und Modelsim. Die vhd Datei dafür habe ich bereits geschrieben 
und ohne Probleme compilieren lassen.

Für die Testbench habe ich mir ein paar Beispiele angeschaut und damit 
dann versucht die Testbench für meinen Multiplexer zu schreiben, die 
aber noch nicht ganz funktionieren kann.
Ich muss doch noch irgendwie festlegen, damit die Werte in Y (Ausgang) 
geschrieben werden?

Für mich wäre es extrem hilfreich, wenn ihr meine Testbench korrigieren 
könntet. Dann hätte ich eine Vorlage mit der ich Lernen kann.

von Dussel (Gast)


Lesenswert?

1
port map(
2
  S => S_TB,
3
  E => E_TB,
4
  Y => Y_TB);
Da muss noch hin, für welche Component das die Port Map ist, also
1
mux:mux4x1 port map(
Dann sollte das so auf den ersten Blick funktionieren.

von balle (Gast)


Lesenswert?

Dussel schrieb:
> Da muss noch hin, für welche Component das die Port Map ist,
> alsomux:mux4x1 port map(…Dann sollte das so auf den ersten Blick
> funktionieren.

Habe dies noch eingefügt. Wieso muss dort vor den Komponentenname noch 
das "mux:" ?

Ich habe nun beide Dateien in Modelsim eingebunden und wollte sie dann 
kompilieren lassen. Allerdings sind in der Testbench noch 13 errors:

In fast jeder Zeile habe ich noch diesen Fehler:
TB.vhd(16): String literal found where non-array type std.STANDARD.BIT 
was expected.

In Zeile 22 und 23:
(22): Signal "S_TB" is type std.STANDARD.BIT; expecting type 
std.STANDARD.BIT_VECTOR.

Und noch am Ende:
(32): VHDL Compiler exiting

von Peter P. (Gast)


Lesenswert?

Ich habe von VHDL keine Ahnung, lese nur aus Interesse mit,
aber ich würde die Fehlermeldung so deuten, dass

component mux4x1 is
  port(S: in bit_vector (1 downto 0);
     E: in bit_vector (3 downto 0);
     Y: out bit);
end component;

--Signale deklarieren
signal S_TB   :bit:= "00";   -- festlegen Startwert: initialisieren für 
Modelsim
signal E_TB   :bit:= "1010";
signal Y_TB   :bit;

oben S und E als bit_vector definiert sind,
unten S_TB und E_TB aber nut als bit, nicht als bit_vector.

Hilft dir dies vielleicht weiter?

von balle (Gast)


Lesenswert?

Peter P. schrieb:
> oben S und E als bit_vector definiert sind,
> unten S_TB und E_TB aber nut als bit, nicht als bit_vector.

Dankeschön. Habe die Signal nun auch noch als bit_vector definiert. Nun 
lässt sich alles kompilieren. Aber die Simualtion bekomme ich immer noch 
nicht hin.
Ich habe alle Variablen zur Wave hinzugefügt und dann auf Run all 
geklickt.

Dann passiert aber nicht. Bei den Variablen steht dann jeweils: -No 
Data-

von Ip E. (bla)


Lesenswert?

Nach dem Hinzufügen in die Wave die Simulation resetten und nochmal 
laufen lassen.

von balle (Gast)


Lesenswert?

Ip E. schrieb:
> Nach dem Hinzufügen in die Wave die Simulation resetten und nochmal
> laufen lassen.

Ich habe auf den Restart Taster gedrückt und danach wieder auf Run-All. 
Nun steht bei den Werten überall eine 0. Auch wenn ich auf Zoom Full 
gehe, also liegt es nicht an der Auflösung.

von Dussel (Gast)


Lesenswert?

balle schrieb:
> Wieso muss dort vor den Komponentenname noch das "mux:" ?
Das weiß ich nicht. Ist so, passt so. Allerdings muss es nicht mux sein. 
Es kann fast jeder beliebige Name verwendet werden.

balle schrieb:
> Ich habe alle Variablen zur Wave hinzugefügt und dann auf Run all
> geklickt.
Welche Variablen sind das? Hast du die Testbench simuliert?

von balle (Gast)


Angehängte Dateien:

Lesenswert?

Dussel schrieb:
> Welche Variablen sind das? Hast du die Testbench simuliert?

Ich habe mal ein Bild angehängt, wie Modelsim bei mir gerade aussieht. 
Die Variablen sind alle meine Ein- und Ausgänge, in meiner Testbench 
habe ich diesen doch Werte festgeschrieben - also dürften diese nicht 
Null sein.

Hier zu meiner Vorgehensweise:

-Neues Projekt erstellt, dort die Testbench und die "normale" Vhdl datei 
reingepackt
-kompiliert
-Simulation gestartet
-Variablen in Wave gepackt
-Restart
-Run All

Dann tut sich überhaupt nichts, wie man in der Wave sehen kann.

von balle (Gast)


Lesenswert?

Dussel schrieb:
> Hast du die Testbench simuliert?

Was meinst du mit Testbench simulieren? Was muss ich da genau machen?

von Dussel (Gast)


Angehängte Dateien:

Lesenswert?

Angehängt ist die Simulation mit gtkwave. Eine angepasste Version 
(bit_vector) deiner Dateien funktioniert also.

In deinem Bild sind die Signale nicht 0, sondern sie werden gar nicht 
angezeigt. Die Nullen stehen wahrscheinlich nur als Platzhalter.

balle schrieb:
> Was meinst du mit Testbench simulieren?
Du musst im Simulator nicht den Multiplexer, sondern die Testbench 
ausführen. Wie das bei dir geht, weiß ich nicht, das hängt vom Programm 
ab.
Du lässt dir die Signale E und S anzeigen, die Signale der Testbench 
sind aber E_TB und S_TB.

Außerdem würde ich empfehlen, std_logic statt bit zu verwenden, weil 
damit mehr Zustände möglich sind. In der Simulation wird als Wert 0 
angezeigt. Da weiß man nicht, ob wirklich der Wert 0 zugewiesen wurde, 
oder noch kein Wert. Bei std_logic stände da wahrscheinlich ein U für 
uninitialised, woran man sehen würde, dass keine Werte zugewiesen sind.

von balle (Gast)


Lesenswert?

Du hattest Recht, ich habe nicht die Testbench ausgeführt.
Jetzt klappt es. Danke euch!

von balle (Gast)


Lesenswert?

Hätte aber noch eine Frage:

Wenn ich mein Programm (wie nennt man das bei VDHL?) kompiliert habe und 
alles klappt, dann kann ich mir bei quartus doch auch irgendwo den 
Schaltplan dazu anschauen. Also wie die einzelnen Gatter verdrahtet 
werden.

Wie geht das bei Quartus?

von balle (Gast)


Lesenswert?

Dussel schrieb:
> Außerdem würde ich empfehlen, std_logic statt bit zu verwenden, weil
> damit mehr Zustände möglich sind.

Und nochmal was, was ist der Datentyp std_logic bzw. welche Werte kann 
er annehmen?

von Peter P. (Gast)


Lesenswert?


von Dussel (Gast)


Lesenswert?

balle schrieb:
> Und nochmal was, was ist der Datentyp std_logic bzw. welche Werte kann
> er annehmen?
Für den Anfang (und wahrscheinlich auch später meistens) reichen aus der 
von Peter verlinkten Liste 0,1,U und X.
U heißt, dass dem Signal noch kein Wert zugewiesen wurde und X bedeutet, 
dass mit dem Signal 'irgendwas nicht stimmt'. Das kann zum Beispiel 
sein, dass einem Signal zwei unterschiedliche Werte zugewiesen werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.