Schleife in ModelSim

#1605395
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
#1605475
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
Gast #1605775
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
#1605839
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
Gast #1606536
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
Moderator (Firma: Titel) Persönliche Seite #1606651
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)?
Gast #1606661
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
#1606820
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren