Forum: FPGA, VHDL & Co. INFO:Xst:2385 - HDL ADVISOR - You can improve the performance of the multiplier


von tomi (Gast)


Lesenswert?

Hallo zusammen,

ich hätte gern eine Frage:

Wenn ich so ein multiplier habe, dann kriege ich eine INFO von xilinx 
ise:

INFO:Xst:2385 - HDL ADVISOR - You can improve the performance of the 
multiplier T2_scale by adding 1 register level(s).
1
  
2
T2_scale <= signed(T) * signed( resize( unsigned(peak), 17));
3
  
4
process
5
begin
6
  wait until rising_edge (clk);
7
  if scale_start = '1' then
8
      T2 <= to_integer ( unsigned( T2_scale(29 downto 14))); 
9
   end if;
10
end process;


Was ist hier gemeint, und was man damit umgehen kann?

vielen dank im voraus!

lg tomi

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


Lesenswert?

tomi schrieb:
> Was ist hier gemeint,
Wenn dein Design so läuft und du zufrieden bist ignorierst du den Tip 
einfach... ;-)

> und was man damit umgehen kann?
Du solltest eine Registerebene mehr einführen, dann kannst du den 
Multiplizierer und damit das Gesamtsystem u.U. schneller takten.
1
process
2
begin
3
  wait until rising_edge (clk);
4
  T2_scale <= signed(T) * signed( resize( unsigned(peak), 17));
5
  if scale_start = '1' then
6
      T2 <= to_integer ( unsigned( T2_scale(29 downto 14))); 
7
   end if;
8
end process;
Allerdings bekommst du dadurch logischerweise einen Takt Latency auf 
T2_scale...

Evtl. kannst du probieren, den Multiplizierer einfach andersrum 
aufzuzäumen:
1
process
2
begin
3
  wait until rising_edge (clk);
4
  if scale_start = '1' then
5
     T2_scale <= signed(T) * signed( resize( unsigned(peak), 17));
6
  end if;
7
end process;
8
T2 <= to_integer ( unsigned( T2_scale(29 downto 14)));
Das kommt aber ganz darauf an, wie T2 und/oder T2_scale weiterverwendet 
wird.

von tomi (Gast)


Lesenswert?

Lothar Miller schrieb:
> Du solltest eine Registerebene mehr einführen, dann kannst du den
> Multiplizierer und damit das Gesamtsystem u.U. schneller takten.

Danke dir für die Antwort!^^

wieso ist es dann schneller?
In meinem System sind (T) und (peak) die flip-flop-Ausgänge, auch mit 
selber clk-flanke.

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


Lesenswert?

> wieso ist es dann schneller?
Sieh dir mal dieses einfache Beispiel an:
Du hast zwei FFs und dazwischen eine Kobinatorische Funktion aus zwei 
Teilen F1 und F2. Wenn F1 z.B. 10ns braucht und F2 ebenfalss 10ns, dann 
darfst du (unter Vernachlässigung von tco und tsu) diese Schaltung mit 
maximal 1/20ns = 50MHz takten.
1
                        20ns
2
       ______     10ns      10ns      ______
3
A  ---| D  Q |---(F1)------(F2)------| D  Q |--  B
4
    C-|>     |                     C-|>     |
5
      |______|                       |______|
6
        FFa                             FFb

Wenn du jetzt aber zwischen die beiden Funktionen nochmal ein FF setzt, 
dann kannst du den Takt (wieder unter Vernachlässigung von tco und tsu) 
auf 100MHz erhöhen.
1
       ______     10ns      ______     10ns      ______ 
2
A  ---| D  Q |---(F1)------| D  Q |---(F2)------| D  Q |--  B
3
    C-|>     |           C-|>     |           C-|>     |
4
      |______|             |______|             |______|
5
        FFa                  FFx                  FFb

Aber: auch hier wird dein eigentliches Ergebins B erst nach 20ns 
berechnet sein!! Du hast dann zwar einen doppelt so hohen Takt, aber 
dafür einen Takt Latency (Verzögerung).

Warum also der ganze Aufwand?

Was wäre, wenn dein restliches FPGA-Design durchaus die 100MHz könnte, 
und nur durch diese F1+F2 Logik ausgebremst würde? Dann könntest du dir 
hier mit deieser zusätzlichen Registerebene den Hals aus der Schlinge 
ziehen, aber dabei immer im Hinterkopf behalten, dass das Ergebnis B um 
einen Takt zu spät ankommt.

> wieso ist es dann schneller?
Die Multiplikation selber wird nicht schneller, aber du könntest den 
Takt erhöhen und damit evtl. den Rest deines FPGAs (der ja idealerweise 
am selben Takt hängt) schneller machen.
Das ist der Tip, den dir der HDL-Tipgeber hier offenbart.

von tomi (Gast)


Lesenswert?

hallo Lothar,

vielen dank für deine sehr gute erklärung^^

machs gut u. ciao ^^

tomi

von tomi (Gast)


Lesenswert?

Lothar Miller schrieb:
> Die Multiplikation selber wird nicht schneller, aber du könntest den
> Takt erhöhen und damit evtl. den Rest deines FPGAs (der ja idealerweise
> am selben Takt hängt) schneller machen.
> Das ist der Tip, den dir der HDL-Tipgeber hier offenbart.

also in meinem fall sieht es aber so aus:
1
F1 <= A * B;
2
  
3
process
4
begin
5
  wait until rising_edge (clk);
6
  if scale_start = '1' then
7
      T <= F1;
8
   end if;
9
end process;
10
11
       ______  A      F1    ______               
12
   ---| D  Q |---(*)-------| D  Q |---(T)
13
    C-|>     |    |      C-|>     |        
14
      |______|    |        |______|             
15
        FFa       |          FFx                
16
                  |   
17
                  |  
18
                  |
19
       ______  B  |
20
   ---| D  Q |----+            
21
    C-|>     |           
22
      |______|             
23
        FFb



dein code würde so dann aussehen oder?
1
  
2
3
process
4
begin
5
  wait until rising_edge (clk);
6
  F1 <= A * B;
7
  if scale_start = '1' then
8
      T <= F1; 
9
   end if;
10
end process;
11
12
13
       ______  A            ______               ______ 
14
   ---| D  Q |---(*) ------| D  Q |---(F1)------| D  Q |--  T
15
    C-|>     |    |      C-|>     |           C-|>     |
16
      |______|    |        |______|             |______|
17
        FFa       |          FFx                  FFy
18
                  |   
19
                  |  
20
                  |
21
       ______  B  |
22
   ---| D  Q |----+            
23
    C-|>     |           
24
      |______|             
25
        FFb


Dann kann es nicht schneller sein, oder? weil es nur eine 
kombinatorische funktion (mul) gibt!?

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


Lesenswert?

tomi schrieb:
> Dann kann es nicht schneller sein, oder?
> weil es nur eine kombinatorische funktion (mul) gibt!?
Weißt du, wie der Multiplizierer real aufgebaut ist? Besteht diese 
Funktion (mul) evtl. aus mehreren kleineren Funktionen (add)?
Sieh dir einfach mal die entsprechenden AppNotes und Datenblätter von 
Xilinx an.

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.