Ich multipliziere eine 2s Kompliment Gleitkommazahl und es für einige Mathematik in einem DSP verwenden. Ich bekomme das Ergebnis und möchte es zurückschalten, aber ich bin mir nicht sicher über die einfachste Methode.Einfachste Möglichkeit, eine unterzeichnete Nummer zu verschieben
Zum Beispiel:
constant b_const : integer := integer(real(1.0/3.0)/real((2.0**-10.0)));
signal b : std_logic_vector(10 downto 0);
begin
b <= std_logic_vector(to_signed(b_const, b'length)) ;
dsp: work.entity_dsp -- p = a * b
port map(
clk => clk,
a => a,
b => b,
p => p -- also signed
);
c <= p/2**10; -- Isn't this very resource intensive ?
hatte ich einen Blick auf die Funktion „Größe ändern“, aber es scheint nur entweder oder Pad Bits gestutzt. Ich dachte, eine goldene Regel von FPGAs wäre nie "/" zu verwenden, außer wenn sie eine einfache Lösung für das, was ich versuche, realisiere?
Irgendwelche Ratschläge?
Die Unterteilung ist durch eine Potenz von zwei, die trivialerweise als eine Verschiebung nach rechts durchgeführt wird (plus-Korrektur, wenn Operand negativ) in Ganzzahl mit Vorzeichen oder Festkommaarithmetik und als Exponentensubtraktion in Gleitpunktarithmetik. – njuffa
Vielleicht ist es nicht klar, was die Korrektur für negative Werte sein sollte, wenn man in vorzeichenbehafteter Integer-/Festkomma-Arithmetik arbeitet? Die arithmetische Rechtsverschiebung ist eine Division durch eine Zweierpotenz, wobei * das Ergebnis in Richtung der negativen Unendlichkeit * gerundet wird, während eine Division durch eine Zweierpotenz * das Ergebnis (in C, C++) abschneidet. Die notwendige Korrektur lautet also: "if (x <0) x = x + 2 ** n-1; r = x >> n; ', wobei" >> "die arithmetische Rechtsverschiebung bezeichnet. – njuffa