Forum: FPGA, VHDL & Co. Ein kleines Problem mit VHDL


von Der Besucher (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

nach einigen Monaten Forum lesen habe ich nun auch einmal eine Frage:

In "problem.vhd" steht ein lauffähiges Testbenchfragment.
Ich habe alles soweit reduziert, dass nur noch das eigentliche Problem 
sichtbar bleibt.

Und zwar möchte ich, dass die Procedure "send" in den Faellen 1a und 1b, 
sowie im Fällen 2a und 2b jeweils die Daten in der selben Reihenfolge 
überträgt. Die a-Fälle liefern das von mir gewünschte Ergebnis. die 
b_fälle übertragen die Daten in der falschen Reihenfolge.

Ich suche aber einen Weg, auf die Variablen sdata5/8 zu verzichten und 
trotzdem bei variabler Vektorlänge die Daten MSB first auf line 
auszugeben.

Wie muß nun "send" umgeschrieben werden?

Ich habe schon viel mit 'high und 'low experimentiert, aber irgendwie 
nicht das erwünschte Resultat erhalten. Sicherlich ist die Lösung ganz 
einfach...
Default scheint eine aufsteigende Reihenfolge (to) bei std_logic_vector 
zu sein.

Der Besucher

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


Lesenswert?

Nimm
1
     for i in data'range loop

von Wolfgang Kopp (Gast)


Lesenswert?

Hi,

entweder ich habe das Problem nicht ganz verstanden, oder es ist 
wirklich recht einfach:

variable sdata8 : std_logic_vector(0 to 7);
mit "to" anstelle von "downto" ergiben die Fälle "a" und "b" das gleiche 
Resultat.

Wenn du alles dann noch umdrehen willst, einfach die Loop Zählweise 
umdrehen:
for i in data'length-1 downto 0 loop
"downto" anstelle von "do"

Wolfgang

von Der Besucher (Gast)


Lesenswert?

@Wolfgang:
ja, die Ergebnisse sind dann die selben. Aber LSB first. Das möchte ich 
nicht.

@Lothar:
Danke, das löst das Problem.
Muss jetzt nur noch rausfinden wieso eigentlich...

Ich ahnte doch, das es was simples ist...

Der Besucher

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


Lesenswert?

Wolfgang Kopp schrieb:
> Wenn du alles dann noch umdrehen willst
dann nimm
1
     for i in data'reverse_range loop

von Der Besucher (Gast)


Lesenswert?

Ok, ich habe mal den Schleifenzähler auf eine weitere Variable gelegt.
Nun ist mir die Funktionsweise von 'RANGE klar und wo der eigentliche 
Unterschied in den beiden Procedureaufrufen liegt.

Vielen Dank für die Mühe!
Der Besucher

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


Lesenswert?

> Danke, das löst das Problem.
> Muss jetzt nur noch rausfinden wieso eigentlich...
Wenn der Default für einen unconstrained std_logic_vector ein Range von 
(0 to x) ist, dann hat das MSB den Index 0. Und weil die Schleife von 0 
to x läuft, kommt das MSB voran.
Wenn du einen constrained std_logic_vector mit (x downto 0) hast, dann 
hat das MSB den Index x. Und deine Schleife läuft von x downto 0.

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.