www.mikrocontroller.net

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


Autor: tomi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).
  
T2_scale <= signed(T) * signed( resize( unsigned(peak), 17));
  
process
begin
  wait until rising_edge (clk);
  if scale_start = '1' then
      T2 <= to_integer ( unsigned( T2_scale(29 downto 14))); 
   end if;
end process;



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

vielen dank im voraus!

lg tomi

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
process
begin
  wait until rising_edge (clk);
  T2_scale <= signed(T) * signed( resize( unsigned(peak), 17));
  if scale_start = '1' then
      T2 <= to_integer ( unsigned( T2_scale(29 downto 14))); 
   end if;
end process;
Allerdings bekommst du dadurch logischerweise einen Takt Latency auf 
T2_scale...

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

Autor: tomi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
                        20ns
       ______     10ns      10ns      ______
A  ---| D  Q |---(F1)------(F2)------| D  Q |--  B
    C-|>     |                     C-|>     |
      |______|                       |______|
        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.
       ______     10ns      ______     10ns      ______ 
A  ---| D  Q |---(F1)------| D  Q |---(F2)------| D  Q |--  B
    C-|>     |           C-|>     |           C-|>     |
      |______|             |______|             |______|
        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.

Autor: tomi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo Lothar,

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

machs gut u. ciao ^^

tomi

Autor: tomi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

F1 <= A * B;
  
process
begin
  wait until rising_edge (clk);
  if scale_start = '1' then
      T <= F1;
   end if;
end process;

       ______  A      F1    ______               
   ---| D  Q |---(*)-------| D  Q |---(T)
    C-|>     |    |      C-|>     |        
      |______|    |        |______|             
        FFa       |          FFx                
                  |   
                  |  
                  |
       ______  B  |
   ---| D  Q |----+            
    C-|>     |           
      |______|             
        FFb               

 



dein code würde so dann aussehen oder?
  

process
begin
  wait until rising_edge (clk);
  F1 <= A * B;
  if scale_start = '1' then
      T <= F1; 
   end if;
end process;


       ______  A            ______               ______ 
   ---| D  Q |---(*) ------| D  Q |---(F1)------| D  Q |--  T
    C-|>     |    |      C-|>     |           C-|>     |
      |______|    |        |______|             |______|
        FFa       |          FFx                  FFy
                  |   
                  |  
                  |
       ______  B  |
   ---| D  Q |----+            
    C-|>     |           
      |______|             
        FFb        




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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.