Forum: FPGA, VHDL & Co. Prüfen ob Wert innerhalb eines Bereiches liegt und in welchem


von Holger K. (holgerkraehe)


Lesenswert?

Hallo zusammen

Folgendes:

ich habe ein Array, gefüllt mit Grenzwerten.

Beispiel:
1
type t_bounds is array (0 to 5) of integer range 0 to 40;
2
...
3
signal bounds : t_bounds (0 => 10, 1 => 15, 2 => 20, 3 => 25, 4 => 30, 5 => 37);

Nun habe ich einen Wert, z.B. 22

Ich möchte nun prüfen, an welches Position innerhalb des Arrays dieser 
liegt.
In diesem Beispiel wäre dies zwischen Index 2 und 3.

In C würde ich dies mittels einer Schleife machen. Gerne möchte ich 
jedoch, dass dieses Konstrukt mittels eines direkten Vergleichs 
stattfindet.

Gibt es eine VHDL-Struktur, mit welcher dieses Problem optimal gelöst 
werden kann?

Vielen Dank.

: Bearbeitet durch User
von Duke Scarring (Gast)


Lesenswert?

Holger K. schrieb:
> In C würde ich dies mittels einer Schleife machen. Gerne möchte ich
> jedoch, dass dieses Konstrukt mittels eines direkten Vergleichs
> stattfindet.
Auch in VHDL kann man das in einer Schleife lösen:
Es werden dann mehrere Komperatoren parallel instanziiert.

> Gibt es eine VHDL-Struktur, mit welcher dieses Problem optimal gelöst
> werden kann?
Was ist optimal? Geringer Platzbedarf oder schnelle Durchlaufzeit?

Duke

von VHDL hotline (Gast)


Lesenswert?

Abhängig von der Anzahl der möglichen Werte, kannst du dein Array so 
repräsentieren, dass der Wert als Adresse den Bereich zurückliefert 
(Stichwort CAM):
1
type t_bounds_cam is array(0 to 40) of integer(0 to 5);
2
3
signal bounds_cam :  t_bounds_cam :=
4
(0 => 0, 1 => 0, 2 => 0, ... 10 => 1, 11 => 1, ... 15 => 2 ,... 37 => 5 , ... 40 => 5);

Bis zu gewissen Größen kann man sowas ganz vernünftig in Block-RAMs 
ablegen und hat das Ergebnis in einem Takt. Dann hat man geringen 
Platzbedarf und geringe Durchlaufzeit.

von Holger K. (holgerkraehe)


Lesenswert?

Duke Scarring schrieb:
> Holger K. schrieb:
>> In C würde ich dies mittels einer Schleife machen. Gerne möchte ich
>> jedoch, dass dieses Konstrukt mittels eines direkten Vergleichs
>> stattfindet.
> Auch in VHDL kann man das in einer Schleife lösen:
> Es werden dann mehrere Komperatoren parallel instanziiert.
>
>> Gibt es eine VHDL-Struktur, mit welcher dieses Problem optimal gelöst
>> werden kann?
> Was ist optimal? Geringer Platzbedarf oder schnelle Durchlaufzeit?
>
> Duke

Danke für deine Antwort. Ja, hab an sowas gedacht, dass da Komparatoren 
resultieren. Ziel ist, möglichst geringe Laufzeit.

VHDL hotline schrieb im Beitrag #6064245:
> Bis zu gewissen Größen kann man sowas ganz vernünftig in Block-RAMs
> ablegen und hat das Ergebnis in einem Takt. Dann hat man geringen
> Platzbedarf und geringe Durchlaufzeit.

Interessanter Ansatz.
Es handelt sich um einen Wertebereich von 1-3000.

von Christoph Z. (christophz)


Lesenswert?

Holger K. schrieb:
>>> Gibt es eine VHDL-Struktur, mit welcher dieses Problem optimal gelöst
>>> werden kann?
>> Was ist optimal? Geringer Platzbedarf oder schnelle Durchlaufzeit?
>>
>> Duke
>
> Danke für deine Antwort. Ja, hab an sowas gedacht, dass da Komparatoren
> resultieren. Ziel ist, möglichst geringe Laufzeit.

Form follows function: Zuerst herausfinden ob man eine Look-up-table, 
Komparatoren oder eine andere Hardware Struktur möchte. Daraus ergibt 
sich die VHDL Struktur dann meistens schon fast von alleine.

VHDL ist keine High-level Sprache :-)

von J. S. (engineer) Benutzerseite


Lesenswert?

Die naheliegende Lösung wäre zunächst eine verschachtelte IF_Abfrage für 
den Fall, dass die Werte aufsteigend sortiert sind. Die wird vom 
Compiler aufgelöst und optimiert und ist im schlechtesten Fall so 
langsam wie ein WHEN im günstigsten Fall schneller, wenn eine frühe Zahl 
gefunden wird.
Macht aber nicht viel Unterschied.

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.