Prüfen ob Wert innerhalb eines Bereiches liegt und in welchem

OP #6064213
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.
Gast #6064226
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
Gast #6064245
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.
OP #6064268
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.
#6064308
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 :-)
Persönliche Seite #6064558
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 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.