Vivado DSP Macro einbinden

Wir erzeugen ein neues Projekt mit einer Toplevel-Entity MultAcc. Erst mal ohne IOs.

Links im Project Manager finden wir den Button IP Catalog. Klickt man darauf geht das Projektfenster IP Catalog auf und man findet unter Basic Elements das IP DSP Macro. Ein Doppelklick darauf öffnet dessen Konfigurationsfenster:

Konfiguration DSP Macro

Links sieht man das IP Symbol, so wird es graphisch dargestellt und bei der Verwendung als VHDL-Modul erkennt man sofort seine IOs, also welche Signale man benötigt um mit diesem IP zu interagieren. Ausgänge eines IPs müssen nicht angeschlossen werden, wenn man sie nicht benötigt. Eingänge aber auf jeden Fall.

Zuerst muss man angeben, welche Operationen durchgeführt werden sollen. Als Default angegeben ist hier A*B+C. Wenn man Port  P mit Port C verbinden würde, hätte man also einen Akkumulator. Im Dropdown-Menü zu den Operationen findet man aber auch den Eintrag A*B+P. Das ist genau das, was wir brauchen. Wir wählen also A*B+P und gehen zu den Pipeline Options.

Daraufhin verschwindet der Eingang C und wir stellen im Experten-Modus die Internas ein:

Konfiguration der Pipeline
  1. Wir entfernen die Häkchen für die Pipeline Register A und B. Da A noch durch den Addierer durch muss kommt es zwar etwas später bei der nächsten Pipeline Stufe an, aber der Unterschied ist minimal. Wichtiger ist, dass vor und nach dem langsameren Multiplizierer die Pipeline Register aktiviert sind.
  2. Ganz wichtig sind die beiden Control Eingänge CE und SCLR:
    • CE, also Clock Enable gibt an, wann ein neuer Eingangswert akkumuliert werden soll. Ohne CE, würde der MAC ja andauernd akkumulieren.
    • SCLR ist der synchrone Reset-Eingang, den braucht man um eine neue Berechnung zu starten.

Wir schließen mit OK ab und lassen den IP mit den Default Einstellungen generieren.

Um diese Komponente nun einfach einzubinden hilft einem Vivado weiter:

Instanziierung DSP Macro

Über dem Reiter IP Sources findet man die Instantiation Template für das gerade erzeugte IP. Die .vho Datei ist für VHDL.

Darin findet man dann die Code Snippets für die Deklaration und für die Instanziierung.

------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
COMPONENT dsp_macro_0
  PORT (
    CLK : IN STD_LOGIC;
    CE : IN STD_LOGIC;
    SCLR : IN STD_LOGIC;
    A : IN STD_LOGIC_VECTOR(17 DOWNTO 0);
    B : IN STD_LOGIC_VECTOR(17 DOWNTO 0);
    P : OUT STD_LOGIC_VECTOR(47 DOWNTO 0) 
  );
END COMPONENT;
-- COMP_TAG_END ------ End COMPONENT Declaration ------------

-- The following code must appear in the VHDL architecture
-- body. Substitute your own instance name and net names.

------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
your_instance_name : dsp_macro_0
  PORT MAP (
    CLK => CLK,
    CE => CE,
    SCLR => SCLR,
    A => A,
    B => B,
    P => P
  );
-- INST_TAG_END ------ End INSTANTIATION Template ---------