Schleife in ModelSim

OP #1605395
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
OP
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
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)
Gast
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
OP
@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
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
> 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
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
OP
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.