2016-04-24 9 views
0

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?

+0

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

+1

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

Antwort

0

Wenn Sie LSBs abschneiden möchten, können Sie die in numeric_std definierte Funktion shift_right verwenden, gefolgt von einer Größenänderung.

c <= resize(shift_right(p, 10), c'length); 

Alternativ kann eine Scheibe nehmen:

c <= p(c'length+10 downto 10); 
+0

Aber das würde den Wert der 2s Kompliment signierte Nummer geändert – fiz

+1

Ja, negative Werte werden anders behandelt, wenn Sie vs Bitshift teilen. Siehe auch diese Antwort: http://stackoverflow.com/a/24145443/5900503 Sie können tun, wie @njuffa vorgeschlagen. Bedingte Addition einer Konstante für negative Zahlen vor der rechten Verschiebung. Abhängig vom FPGA kann dies mithilfe des Post-Addierers im DSP-Block ohne Verwendung zusätzlicher LUTs erfolgen. – elgorwi