Forum: FPGA, VHDL & Co. viele std_logic_vector vergleichen - minimum finden


von Sssssss (Gast)


Lesenswert?

Hi!

Ich bastel gerade an einem FPGA Projekt und bin beim vhdl coden
auf ein Problem gestossen:
Ich möchte zB 4 verschiedene std_logic_vector (je 9bit) vergleichen.
var1: std_logic_vector(8 downto 0);
var2: std_logic_vector(8 downto 0);
var3: std_logic_vector(8 downto 0);
var4: std_logic_vector(8 downto 0);
out: std_logic_vector(1 downto 0);

Je nachdem welcher dieser std_logic_vectoren den kleinsten Zahlenwert
hat möchte ich out zuweisen.

Ich würde jetzt ein riesen if then elsif Gebilde bauen.
Da gibts aber bestimmt nen Trick ;)
Das wird total unübersichtlich wenn ich das ganze zb mit 20 Zahlen
machen will...

Achja, das ganze soll in einem Takt berechnet werden, Schleifen
scheiden also aus ;)

Jemand eine Idee oder nen Tipp ?
Ich programmiere mit Xilinx Webpack und Zielfpga ist ein Spartan3

von Hagen (Gast)


Lesenswert?

Pseudocode !!

Vergleich <= (Var1 < Var2) & (Var3 < Var4);
case vergleich is
  when "00" => Result <= Var2 < Var4;
  when "01" => Result <= Var2 < Var3;
  when "10" => Result <= Var1 < Var4;
  when others => Result <= Var1 < Var3;
end case


Gruß Hagen

von Sssssss (Gast)


Lesenswert?

D'OH...
Ich denk echt immer zu kompliziert (zumindest bei vhdl ;D)
Danke!

Ich hatte vorhin mal ein
if (a<b) then
 t0 = a
else
 t0 =b
end if

if (c<d) then
 t1 = c
else
 t1 =d
end if

if (t0<t1) then
 res = t0
else
 res = t1
end if

ausprobiert.
Bin echt erstaunt gewesen wie super das der "compiler" optimiert hat
und wie wenig Ressourcen das verbrauchte :-X

War natürlich superschlecht zu lesen 8)
Deine Lösung gefällt mir sehr gut, muss ich mal mit
mehreren variablen ausprobieren.

Später sollen es 4*5=20 Variablen sein.
Wobei ich immer nur 4 mögliche ausgaben habe.
(ich will damit Farben eines Cmos Sensors in 4 Farbklassen einteilen)

von Hagen (Gast)


Lesenswert?

Du kannst in VHDL mit Funktionen arbeiten. Du bastelst also eine
Funktion die das Minimum von 5 Eingabewerten berechnet. Dann nur noch 4
mal nacheinander die Ausgabesignale damit befüllen. Diese Kombinatorik
ist dann im schlimmsten Falle im FPGA 4 mal implementiert, im besten
Falle mir Resourcesharing falls es optimierbar ist liegt es nur 1 mal
im FPGA.

Eines kannst du dir aber sicher sein, die heutigen VHDL Compiler
omptimieren solche Sachen besser als man vermuten würde. In einigen
Tests haben verschiedene Leute ganz verscheidene Lösungen einer Aufgabe
entwickelt, und es stellte sich schlußendlich heraus das sie alle fast
die gleichen Resourcen verbrauchten.

Gruß Hagen

von Sssssss (Gast)


Lesenswert?

Hi!

Ich habs erstmal größtenteils ohne Funktionen als 4x4 gecodet.
Muss ich heute abend mal testen ob es funktioniert, danach schreibe ich
es als Funktionen um ;)
Ressourcenverbrauch ist momentan ~43% der slices und ~42% der 4LUTs.
(ich muss noch ein paar Abstände berechnen etc.)

Eine Frage hätte ich noch, ich musste mir eine boolean2bit function
schreiben:
tmp : bit_vector(1 downto 0);
tmp := bool2bit(a < b) & bool2bit(c < d);

Gibts da nicht sowas fertiges wie conv_std_logic_vector() ?

Ich bin echt überrascht wie gut der vhdl compiler die sachen
optimiert...
Zu beginn hatte ich die Abstandsberechnungsfunktion durch ein
return 123 ersetzt.

Da hab ich mich über die 0% der slices verbraucht Meldung gewundert,
mein Schaltplan bestand dann nur aus: Vcc|-----> output(0) g

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.