www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Schleife in ModelSim


Autor: Thomas T. (knibbel)
Datum:

Bewertung
0 lesenswert
nicht 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:
     input <= "0000";
     wait for 100 ns;
     input <= "0001";
     wait for 100 ns;
     input <= "0010";
     wait for 100 ns;
     input <= "0011";
     wait for 100 ns;

     und so weiter...

Ich wollte obiges jetzt in einer Schleife abbilden und habe es hiermit 
versucht:
     for i in 0 to 15 loop
        input <= to_unsigned(i, 4);
        wait for 100 ns;
     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

Autor: Christian R. (supachris)
Datum:

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

Autor: Thomas T. (knibbel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also in etwa so:

process
     variable mytest : std_logic_vector (3 downto 0);

     begin

          mytest := "0000";

          for i in 0 to 15 loop
               input <= mytest;
               mytest := mytest + 1;
               wait for 100 ns;
          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

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: cpt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas T. (knibbel)
Datum:

Bewertung
0 lesenswert
nicht 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:
     for i in 0 to 15 loop
          input <= std_logic_vector(to_unsigned(i, 4));
          wait for 100 ns;
     end loop;

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

Gruß,
Thomas

Autor: cpt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
      variable mytest : std_logic_vector (3 downto 0);
            mytest := mytest + 1;
Denn was kommt denn hier raus:
      variable a : std_logic_vector (3 downto 0);
      variable b : std_logic_vector (3 downto 0);
      variable c : std_logic_vector (3 downto 0);
             a := "1111";
             b := "1111";
             c := a*b;
ist c jetzt "11100001" (unsigned: 15 mal 15 = 225)
oder        "00000001" (signed:   -1 mal -1 = 1)?

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas T. (knibbel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bedeutet, dass wenn man obiges unbedingt mit einer zusätzlichen 
Variable abbilden will, dann so:

variable mytest : unsigned (3 downto 0);

begin

     mytest := to_unsigned(0,4);

     for i in 0 to 15 loop
          input <= std_logic_vector(mytest);
          mytest := mytest + 1;
          wait for 100 ns;
     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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.