Forum: FPGA, VHDL & Co. multiple Instanziierung einer Komponente


von Alfred (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich versuche aktuell, eine Komponente mehrfach zu instanziieren.

Zuerst habe ich dafür folgenden Code verwendet (kommentarzeichen 
wegdenken):
[Moderator: Kommentarstriche entfernt und [ vhdl ] Token eingefügt, 
nächstesmal bitte selber machen]
1
    reg:
2
  FOR i IN 0 TO 4 - 1 GENERATE
3
        inst : COMPONENT gen_output_register
4
        GENERIC MAP(
5
            g_data_width    => g_slice_width,
6
            g_address_width => ceil_log2(g_slice_count),
7
            g_address       => i
8
        )
9
        PORT MAP(
10
            demux_in => input_vector,
11
            demux_out => output_vector(((i + 1) * g_slice_width) - 1  DOWNTO i * g_slice_width),
12
            sel => index,
13
            ena => ena,
14
            clk => clk
15
        );
16
    END GENERATE;

Diese Code generiert, siehe Bild im Anhang, nur diese eine Instanz.
(Zu wissen ist: g_Slice_width = 64 und g_slice_count = 4)
Als das nicht funktionierte, habe ich Testweise die Schleife ausgerollt:
1
       inst_0 : COMPONENT gen_output_register
2
        GENERIC MAP(
3
            g_data_width    => g_slice_width,
4
            g_address_width => ceil_log2(g_slice_count),
5
            g_address       => 0
6
        )
7
        PORT MAP(
8
            demux_in => input_vector,
9
            demux_out => output_vector(((0 + 1) * g_slice_width) - 1  DOWNTO 0 * g_slice_width),
10
            sel => index,
11
            ena => ena,
12
            clk => clk
13
        );
14
15
        inst_1 : COMPONENT gen_output_register
16
        GENERIC MAP(
17
            g_data_width    => g_slice_width,
18
            g_address_width => ceil_log2(g_slice_count),
19
            g_address       => 1
20
        )
21
        PORT MAP(
22
            demux_in => input_vector,
23
            demux_out => output_vector(((1 + 1) * g_slice_width) - 1  DOWNTO 1 * g_slice_width),
24
            sel => index,
25
            ena => ena,
26
            clk => clk
27
        );
28
29
        inst_2 : COMPONENT gen_output_register
30
        GENERIC MAP(
31
            g_data_width    => g_slice_width,
32
            g_address_width => ceil_log2(g_slice_count),
33
            g_address       => 2
34
        )
35
        PORT MAP(
36
            demux_in => input_vector,
37
            demux_out => output_vector(((2 + 1) * g_slice_width) - 1  DOWNTO 2 * g_slice_width),
38
            sel => index,
39
            ena => ena,
40
            clk => clk
41
        );

Allerdings produziert diese Code das selbe Ergebnis (siehe Bild).
Jetzt ist die Frage, was mache ich falsch ?
In der Verhaltenssimulation funktioniert die Schleifenvariante und es 
werden 4 Register erzeugt. Diese Variante wurde im Post-Translage 
getestet und dort funktioniert sie nicht mehr. Dort wird nur das erste 
Register erzeugt (dieses funktioniert aber korrekt).

: Bearbeitet durch Moderator
von Duke Scarring (Gast)


Lesenswert?

Alfred schrieb:
> Diese Variante wurde im Post-Translage
> getestet und dort funktioniert sie nicht mehr. Dort wird nur das erste
> Register erzeugt
Vielleicht optimiert die Synthese da was weg?
Wird g_address innerhalb der Komponente auch genutzt?

Duke

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


Lesenswert?

Duke Scarring schrieb:
> Vielleicht optimiert die Synthese da was weg?
Oder es wird noch später wegoptimiert...
Das könnte man am RTL-Schaltplan kontrollieren.

von Alfred (Gast)


Lesenswert?

Duke Scarring schrieb:
> Vielleicht optimiert die Synthese da was weg?

Man kann diese Optimierungen ja ausstellen, allerdings weiß ich nicht 
wirklich, wie das bei der ISE (V.14.6) funktioniert.
Kann mir da jemand einen Tipp geben ?^^

Das RTL-Schematic schaue ich mir morgen sofort mal an, ob es dort 
wegoptimiert wird.

Danke schonmal für die Tipps

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


Lesenswert?

Alfred schrieb:
> Kann mir da jemand einen Tipp geben ?
Es wird nur das wegoptimiert, was nicht gebraucht wird (weil z.B. 
keinerlei Verbindung zur Außenwelt besteht). Sieh dir mal die Reports zu 
den vermissten Signalen an.
Als kleiner Anhaltspunkt: ich musste die Optimierung erst ganz selten 
ausschalten. Und zwar dann, wenn ich spezielle Hardwaretricks wie z.B. 
einen Ringoszillator angestellt habe.

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.