Forum: FPGA, VHDL & Co. integer range zu bit


von Sven (Gast)


Lesenswert?

Ich mache gerade die ersten schritte in vhdl und hätt da gleich mal eine 
Frage.
Das Beispiel der blinkenden Led verwendet als variable
signal c : integer range 0 to 4000000
Nun würde ich dieses c gerne auf Ausgangspins umleiten um es an Leds 
sichtbar zu machen.
Um das auf bits umzusplitten sagt mein Buch müsste die Variable als 
std_logic_vector(4 downto 0) geschrieben werden.

Jetzt bin ich etwas durcheinander. Jemand mal nen tipp?

Und bitte Tutorials lesen und lehrnen bin ich gerade bei :)

von Sven P. (Gast)


Lesenswert?

to_signed(), to_unsigned(), Casts nach STD_LOGIC_VECTOR...

von Sven (Gast)


Lesenswert?

Ja genau sowas steht in meinem Buch.
Mal ehrlich ich bin anfänger und verstehe den sinn in deinem Posting 
nicht.

von Gustl B. (-gb-)


Lesenswert?

signal i : integer range 0 to 63;
signal u : unsigned(5 downto 0);
...
u <= to_unsigned(i,6);

led(3 downto 0) <= u(4 downto 1);

von Schlumpf (Gast)


Lesenswert?

Du musst einfach einen Cast oder mehrere auf deine Signale machen.
Man kann nicht einfach einen Integer auf einen Pin ausgeben, sondern 
muss den vorher in einen anderen Datentp "wandeln".
Dieses Wandeln nennt man casting.

Es kann auch eventuell erforderlich sein, einen Datentyp über einen 
"Zwischenschritt" zu casten, wenn es von dem einen keinen direkten Cast 
in einen anderen gibt.
Also z.B. von integer nach unsigned und dann von unsigned nach 
std_logic_vector..

Wie die casts im Einzelnen funktionieren, findest du im Internet.. 
einfach mal "vhdl casting" googeln

in deinem Beispiel kann der Integer Werte von 0... 4 000 000 umfassen.
Dazu bedarf es 22 Bit (2 ^22 = 4 194 304)
Daraus machst du einen unsigned der Länge 22 Bit über den Cast:

to_unsigned(c,22)

Diesen unsigned kannst du dann zu std_logic_vetor casten, so dass am 
Ende das bei raus kommt:

zielvektor <= std_logic_vector(to_unsigned(c,22));

Wie du siehst, muss der Zielvektor std_logic_vector(21 downto 0) sein, 
um damit das komplette c darstellen zu können. (4 downto 0) wäre viel zu 
klein...

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


Lesenswert?

Ich würde hier eher einen Vorteiler machen, der den Zählimpuls aus den 
40 MHz herunter teilt, und dann einen unsigned Vektor mit 5 Bit 
hochzählen, und den dann auf die Ports ausgeben...

Ich empfehle übrigens, auch gleich mal so eine simple Sache zu 
simulieren. Das ist gar nicht so kompliziert. Siehe auch dort: 
http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html

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.