Forum: FPGA, VHDL & Co. Schleife in ModelSim


von Thomas T. (knibbel)


Lesenswert?

Hallo,

ich lerne seit ein paar Tagen mehr oder weniger intensiv VHDL und bin 
jetzt beim Simulieren angelangt.

Um Eingangssignale zuzuweisen habe ich bisher folgendes verwendet:
1
     input <= "0000";
2
     wait for 100 ns;
3
     input <= "0001";
4
     wait for 100 ns;
5
     input <= "0010";
6
     wait for 100 ns;
7
     input <= "0011";
8
     wait for 100 ns;

     und so weiter...

Ich wollte obiges jetzt in einer Schleife abbilden und habe es hiermit 
versucht:
1
     for i in 0 to 15 loop
2
        input <= to_unsigned(i, 4);
3
        wait for 100 ns;
4
     end loop;

Das klappt aber so nicht. ModelSim beschwert sich immer beim 
"to_unsigned" und ich habe keine Ahnung warum? Gibt es irgendwo im Netz 
Muster-Testbenches, wo man sich solche Konstrukte abgucken kann?

Gruß,
Thomas

von Christian R. (supachris)


Lesenswert?

Die Schleifenvariable kann man dafür nicht hernehmen. Du brauchst noch 
eine extra Zähl-Variable, die du selbst inkrementierst.

von Thomas T. (knibbel)


Lesenswert?

Also in etwa so:

1
process
2
     variable mytest : std_logic_vector (3 downto 0);
3
4
     begin
5
6
          mytest := "0000";
7
8
          for i in 0 to 15 loop
9
               input <= mytest;
10
               mytest := mytest + 1;
11
               wait for 100 ns;
12
          end loop;

ModelSim übersetzt es jetzt problemlos und die Simulation funktioniert 
auch. Vielen Dank, Christian, für den Tipp.

Ich lasse die eine Frage aber noch offen: Gibt es im Netz Seiten, wo ich 
derartiges nachschlagen kann?

Gruß,
Thomas

von berndl (Gast)


Lesenswert?

Thomas T. schrieb:
> Ich lasse die eine Frage aber noch offen: Gibt es im Netz Seiten, wo ich
> derartiges nachschlagen kann?

www.mikrocontroller.net?   :o)

von cpt (Gast)


Lesenswert?

Hallo zusammen!

Also eigentlich sollte man die Variable nutzen können...
Vielleicht ist dein Signal ein std_logic_vector?
Dann müsstest du:
input <= std_logic_vector(to_unsigned(i, 4));
benutzen.
Oder du hast use ieee.numeric_std.all vergessen oder sonst irgendwas.
Hilfreich wäre die Fehlermeldung gewesen :-)

Nun ja aber anscheinend hat sich das ja auch erledigt.

Grüße
Cpt

von Thomas T. (knibbel)


Lesenswert?

@Cpt:
Danke, das war genau das, was ich gesucht habe. Ieee.numeric_std.all war 
bereits eingebunden, jedoch muss ich das Ganze wohl erst in einen Vektor 
wandeln, bevor ich es zuweisen kann.

So sieht die Schleife jetzt aus, ohne das ModelSim sich beschwert:
1
     for i in 0 to 15 loop
2
          input <= std_logic_vector(to_unsigned(i, 4));
3
          wait for 100 ns;
4
     end loop;

@berndl:
Nö, www.mikrocontroller.net hat diesbezüglich nicht so viele Infos ...

Gruß,
Thomas

von cpt (Gast)


Lesenswert?

Hi Thomas!

Gut das es jetzt läuft. Grundsätzlich kannst du hier sehen, daß VHDL 
eben eine sehr stark typisierte Sprache ist. Du kannst immer nur gleiche 
Typen zuweisen oder musst eben entsprechend umwandeln. Ist am Anfang 
etwas stressig aber spätestens wenn es an vorzeichenbehaftete 
mathematische Operationen geht wirklich ein Vorteil.

Viele Grüße

Cpt

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> spätestens wenn es an vorzeichenbehaftete
> mathematische Operationen geht wirklich ein Vorteil.
Und spätestens dann sollte auch klar sein, dass mit Vektoren nicht 
gerechnet werden sollte. Sowas ist prinzipiell schlecht:
1
      variable mytest : std_logic_vector (3 downto 0);
2
            mytest := mytest + 1;
Denn was kommt denn hier raus:
1
      variable a : std_logic_vector (3 downto 0);
2
      variable b : std_logic_vector (3 downto 0);
3
      variable c : std_logic_vector (3 downto 0);
4
             a := "1111";
5
             b := "1111";
6
             c := a*b;
ist c jetzt "11100001" (unsigned: 15 mal 15 = 225)
oder        "00000001" (signed:   -1 mal -1 = 1)?

von D. I. (Gast)


Lesenswert?

Lothar Miller schrieb:

>              a := "1111";
>              b := "1111";
>              c := a*b;
>
> ist c jetzt "11100001" (unsigned: 15 mal 15 = 225)
> oder        "00000001" (signed:   -1 mal -1 = 1)?

Weder noch wenn c 4 bits breit ist :x

von Thomas T. (knibbel)


Lesenswert?

Was bedeutet, dass wenn man obiges unbedingt mit einer zusätzlichen 
Variable abbilden will, dann so:
1
variable mytest : unsigned (3 downto 0);
2
3
begin
4
5
     mytest := to_unsigned(0,4);
6
7
     for i in 0 to 15 loop
8
          input <= std_logic_vector(mytest);
9
          mytest := mytest + 1;
10
          wait for 100 ns;
11
     end loop;

Rechnen also nie mit den Vektoren, sondern nur mit signed und unsigned, 
je nach Anwendung. Und erst bei der Signalzuweisung in den Logikvektor 
wandeln. Werde ich mir merken ... :-)

Gruß,
Thomas

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Christopher D. schrieb:
> Weder noch wenn c 4 bits breit ist :x
Sch.....lagskaputt :-/

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.