Hallo.
Ich hoffe hier finde ich Hilfe. Zuerst mal meine Problemstellung:
Aufgabe ist es mit möglichst wenig VHDL Code möglichst viele Ressourcen
eines Xilinx Virtex-5 FPGA's zu verbrauchen (um diesen richtig zu
fordern und zu überprüfen ob das Leiterplattendesign passt usw.)
Der Ansatz dies zu erreichen ist ein Prozess in welchem eine Schleife
ist die etwas tut wie z.B.:
1 | PROCESS(clk, ce)
|
2 | BEGIN
|
3 | IF rising_edge(clk) THEN
|
4 | IF ce = '1' THEN
|
5 | FOR i IN number_of_dsps - 1 DOWNTO 0 LOOP
|
6 | a(i) <= NOT a(i);
|
7 | tmp(i) <= STD_LOGIC_VECTOR(UNSIGNED(a(i)) * b + c);
|
8 | dout(i) <= tmp(i)(0);
|
9 | END LOOP; -- i
|
10 | END IF;
|
11 | END IF;
|
12 | END PROCESS;
|
Und genau hier ist mein Problem. Es funktioniert (dadurch das tmp mit
dem Attribute keep belegt wurde), dass mir in der Synthese soviele
DSP48-Blöcke erstellt werden wie tmp groß ist. Allerdings nur bis die
Hälfte der DSP48-Blöcke verbraucht ist (320 Stück von 640). Sollen mehr
als 320 DSP-Blöcke erstellt werden kommt folgende Meldung bei der
Synthese:
1 | # Info: [14505]: Resource Allocation was performed for DSP48Es based on 640 available in the device.
|
2 | # Info: [14503]: 320 Instance(s) were allocated to logic implementations instead of 640 DSP48Es.
|
Nun habe ich schon Attribute wie "use_dsp_block" oder "mult_style" auf
das Signal tmp wie folgt angewendet
1 | ATTRIBUTE mult_style : STRING;
|
2 | ATTRIBUTE mult_style OF tmp : SIGNAL IS "Block";
|
3 |
|
4 | ATTRIBUTE use_dsp_block : STRING;
|
5 | ATTRIBUTE use_dsp_block OF tmp : SIGNAL IS "Yes";
|
6 |
|
7 | ATTRIBUTE dedicated_mult : STRING;
|
8 | ATTRIBUTE dedicated_mult OF tmp : SIGNAL IS "ON";
|
allerdings ohne Erfolg (gut möglich das ich diese Falsch verwende?)
Habt ihr mir einen Tipp welche Attribute ich verwenden könnte und wie
damit die Synthese gezwungen wird DSP48-Blöcke für Multiplikationen zu
verwenden und diese nicht in Logik aufzubauen?
Als Synthesetool ist übrigens Precision im Einsatz.
Vielen Dank für eure Unterstützung!
Grüße
Tobias B.