Ich habe das ein paar Mal selbst gemacht.
Im Allgemeinen wählen die Entwurfswerkzeuge basierend auf den Syntheseeinstellungen zwischen einer Fabric-Implementierung und einem DSP-Slice.
Für Xilinx ISE gibt es beispielsweise in den Einstellungen für den Synthesevorgang HDL-Optionen die Einstellung "-use_dsp48" mit den folgenden Optionen: Auto, AutoMax, Ja, Nein. Wie Sie sich vorstellen können, steuert dies, wie stark die Tools versuchen, sie zu platzieren DSP-Slices. Ich hatte einmal ein Problem, bei dem ich eine Ganzzahl mit 3 multiplizierte, was auf ein DSP-Slice schließen ließ - außer dass ich bereits jedes DSP-Slice im Chip manuell ableitete, sodass der Synth fehlschlug! Ich habe die Einstellung auf Nein geändert, da ich bereits jedes dsp-Slice verwendet habe.
Dies ist wahrscheinlich eine gute Faustregel (ich habe es mir gerade ausgedacht): Wenn Ihr Design mit weniger als 50 MHz getaktet ist und Sie wahrscheinlich weniger als 50% der DSP-Slices im Chip verwenden, verwenden Sie einfach die *, + und - Operatoren. Dadurch werden DSP-Slices ohne Pipeline-Register abgeleitet. Dies begrenzt die Höchstgeschwindigkeit wirklich. (Ich habe keine Ahnung, was passiert, wenn Sie Division verwenden)
Wenn es jedoch so aussieht, als würden Sie die Slices näher an der Höchstgeschwindigkeit des DSP-Slice ausführen (333 MHz für Spartan 6 mit normaler Geschwindigkeitsstufe). Wenn Sie alle Slices verwenden möchten, sollten Sie sie manuell ableiten .
In diesem Fall haben Sie zwei Möglichkeiten.
Option 1: Verwenden Sie die rohe DSP-Instanziierungsvorlage manuell. Option 2: Verwenden Sie einen IP-Block von Xilinx Core Generator. (Ich würde diese Option verwenden. Gleichzeitig lernen Sie alles über das Kerngen, was in Zukunft helfen wird.)
Bevor Sie eine dieser Aktionen ausführen, lesen Sie die ersten Seiten des DSP-Slice-Benutzerhandbuchs. Im Fall des Spartan 6 (DSP48A1) wäre dies Xilinx doc UG389:
http://www.xilinx.com/support/documentation/user_guides/ug389.pdf
Betrachten Sie zuerst die Option Core Generator. Normalerweise erstelle ich in Core Generator ein Testprojekt für den Teil, mit dem ich arbeite, in dem ich eine beliebige Anzahl von IP-Blöcken erstelle, um das System zu lernen. Wenn ich dann bereit bin, meinem Entwurf in ISE einen hinzuzufügen, klicke ich mit der rechten Maustaste in die Entwurfshierarchie, klicke auf neue Quelle und wähle "IP (CORE Generator & Architecture Wizard)", damit ich den Block direkt bearbeiten und neu generieren kann von meinem Projekt.
Schauen Sie sich in Core Gen die verschiedenen IP-Blöcke an, aus denen Sie auswählen können - es gibt ein paar Dutzend, von denen die meisten ziemlich cool sind.
Der Multiplikator-Kern ist das, worauf Sie zuerst achten sollten. Überprüfen Sie jede Seite und klicken Sie auf die Schaltfläche Datenblatt. Die wichtigen Teile sind die ganzzahligen Bitbreiten, die Pipeline-Stufen (Latenz) und etwaige Steuersignale. Dies erzeugt den einfachsten Block, indem alle nicht benötigten Ports entfernt werden.
Als ich letztes Jahr einen IIR-Filter mit 5 x 3-Ordnungen erstellte, musste ich die manuelle Instanziierungsvorlage verwenden, da ich eine sehr benutzerdefinierte Implementierung mit 2 DSP-Slices erstellte, die 4x schneller als die Abtastrate getaktet wurden. Es war ein totaler Schmerz.