Hallo,
ich bin auf der Suche nach einer schnellen und effizienten Lösung zur
Realisierung einer Rampenfunktion von Grenzwert G1 bis Grenzwert G2.
Ich habe 24bit als Eingang und 12bit als Ausgang.
Wäre eigentlich ein klassischer Fall für eine LUT, aber die Grenzwerte
sind variabel und die LUT frisst mit 24x12bit auch recht viel Platz.
Also bleibt nur die Variante die Rampenfunktion abhängig der Granzwerte
zu berechnen.
Eigentlich könnte man ja prinzipiell so vorgehen:
1 | G-Differenz = G2 - G1;
|
2 | if G-Differenz < 4095 then -- Anstieg größer 1
|
3 | Schrittweite = 4095/G-Differenz;
|
4 | elsif G-Differenz > 4095 then -- Anstieg kleiner 1
|
5 | Schrittweite = G-Differenz/4095;
|
6 | else -- Anstieg gleich 1
|
7 | Schrittweite = 1;
|
8 | end if;
|
9 |
|
10 | -- Wert über G1 bestimmen
|
11 | Eingang_scal <= Eingang - G1;
|
12 | -- skalierter Eingang mit Anstieg multiplizieren
|
13 | Ausgang <= Eingang_scal * Schrittweite;
|
Nun habe ich natürlich die in VHDL eher unschönen Rechenarten
Multiplikation und Division dabei.
Man könnte alles ungenauer machen und alles auf 2er Potenzen festnageln
und dann nur noch shiften, aber gerade bei größeren Abständen der
Grenzwerte (im worst case Rampe vom minimalen zum maximalen Eingang)
dürfte es sehr ungenau werden.
Gibt es vielleicht eine Lösung, die nur mit shiften und Addition
auskommt?
Könnte mir vorstellen, dass solche Rampenfunktionen häufiger Anwendung
finden (Schrittmotoren?).
Vielen Dank!
Alex