Forum: FPGA, VHDL & Co. Subtraktion optimieren


von August (Gast)


Lesenswert?

Hi,

kann mir vielleicht jemand einen Tipp geben. Ich habe eine einfache 
16-Bit Subtraktion bei der von dem Vector b immer 1 abgezogen wird. b 
kann dabei beliebige Werte annehmen.

1
signal a,b : std_ulogic_vector(15 downto 0);
2
3
...
4
5
a <= std_ulogic_vector(unsigned(b) - 1);

Kann man hier in irgendeiner Form ausnutzen, dass -1 gerechnet wird um 
das Timing optimieren? In der aktuellen Form hat summiert sich der Pfad 
ja über die einzelnen Bits auf.

Danke!

von uggu (Gast)


Lesenswert?

Hm also ich weiss ja auch nicht, aber -1 ist nicht so harmlos, wie es 
aussieht. Immerhin kann der Carry im ungüstigsten Fall bis bit 16 
durchrattern

von Christian L. (ijuz)


Lesenswert?

Timing optimieren?
subtraction -1 bei 16 bit sind auf einem halbwegs aktuellen FPGA 4 
levels of logic -> ueber 500 MHz (post P&R, gerade ausprobiert)

Das problem wird also wohl eher woander liegen.

von Master Zulu (Gast)


Lesenswert?

Mit welchen Werten?
Hoffentlich keine statischen, die zurechtoptimiert wurden. (?)

von Christian R. (supachris)


Lesenswert?

Also das hier:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity Test is
6
    Port (   CLK : in STD_LOGIC;
7
      A : in  STD_LOGIC_VECTOR (15 downto 0);
8
      B : out  STD_LOGIC_VECTOR (15 downto 0));
9
end Test;
10
11
architecture Behavioral of Test is
12
13
begin
14
15
  Process(CLK)
16
  Begin
17
    if rising_edge(CLK)then
18
      B <= std_logic_vector(signed(A) - to_signed(-1, 16));
19
    end if;
20
  end Process;  
21
22
end Behavioral;

läuft laut statischer Timing-Analyse auf einem Spartan 6 im 3-er 
Speedgrade mit 400MHz. Auf einem -2 noch mit 375MHz. Ich glaub, da kann 
man nicht mehr allzuviel optimieren, die LUTs haben doch diese schnelle 
Carry-Chain da dran.

von August (Gast)


Lesenswert?

Ihr habt ja recht, die Subtraktion ansich ist schon schnell. Allerdings 
ist das nur eine von vielen Operationen in einem Pfad und jede 
Attosekunde weniger bringt mich weiter. :-)

Der 16-Bit Wert b wird vorher über mehrere Stufen kombinatorisch 
"zusammengesetzt". Ich versuch mich da mal dran, nach jeder Logikstufe 
schon feststehende Bits vorher zu berechnen und das ganze nach jeder 
Stufe zu verbinden. Irgendwie muss das möglich sein.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

August schrieb:
> Allerdings ist das nur eine von vielen Operationen in einem Pfad
Da wären die andern aber evtl. auch interessant...

> jede Attosekunde weniger bringt mich weiter.
Hast du mal Zahlen?
Wie langsam ist dein kritischer Pfad?
Wie schnell wilst du werden?
Muss die Berechnung in 1 Takt fertig sein?
Ist Pipelining möglich?

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.