Danke Euch soweit für die Antworten, Links und die Testbench.
Vielleicht noch ein Wort zur Erläuterung: Ich will die Breite des
Eingangsvektors beibehalten, um das zu verarbeitende Signal nicht (um 6
dB) zu dämpfen - ich rechne hier mit Audiosignalen. Würde ich den
Wertebereich hier erweitern, müsste ich das an anderer Stelle wieder
herausrechnen.
Den für mich entscheidenden Hinweis hat Lothar geliefert:
>Und dass eine Subtraktion eigentlich auch nur eine Addition ist...
D.h. dass das "Borrow out" der Subtraktion dem "Carry Out" der Addition
entspricht - bzw. dem "Überlaufbit" nach dem ich gesucht habe. Da
vorzeichenbehaftete Werte verarbeitet werden, steckt diese Information
im MSB-1. Anhand der Kombination MSB & MSB-1 läßt sich entscheiden, ob
ein Überlauf im positiven- oder negativen Wertebereich erfolgt:
1 | signal to_subst : signed(C_DATA_WIDTH-1 downto 0);
|
2 | signal subst_wc : signed(C_DATA_WIDTH downto 0);
|
3 | signal to_adder : signed(C_DATA_WIDTH-1 downto 0);
|
4 |
|
5 | ...
|
6 |
|
7 | subst_wc <= to_signed(to_integer(to_subst) - to_integer(accu_msb), subst_wc'length);
|
8 | to_adder <= C_MAXINT when subst_wc(subst_wc'high downto subst_wc'high-1) = "01" else
|
9 | C_MININT when subst_wc(subst_wc'high downto subst_wc'high-1) = "10" else
|
10 | subst_wc(subst_wc'high) & subst_wc(subst_wc'high-2 downto 0);
|
wobei der Vektor subst_wc um ein Bit breiter sein muss als to_adder. Das
Synthesetool macht daraus:
Synthesizing Unit <DCremover>.
Related source file is "...\DCremover.vhd".
C_DATA_WIDTH = 14
C_K_WIDTH = 18
DIN_USGND = '1'
Found 32-bit register for signal <accu_reg>.
Found 15-bit subtractor for signal <subst_wc> created at line 75.
Found 32-bit adder for signal <accu_next> created at line 79.
Summary:
inferred 2 Adder/Subtractor(s).
inferred 32 D-type flip-flop(s).
Unit <DCremover> synthesized.
Lediglich das RTL-Schaltbild wird durch die nachgeschaltete
Begrenzerlogik umfangreicher.
Die noch nicht im Duden stehende Sprachschlamperei "Inferieren" möge man
mir bitte nachsehen - sie ist aber im Gegensatz zu "Instanziieren"
eindeutig, wie z.B. der Eintrag im "7 Series FPGA Libraries Guide"
zeigt: Das ADDSUB_MACRO kann zwar instanziiert - aber nicht per Inferenz
angesprochen werden.