mikrocontroller.net

Forum: FPGA, VHDL & Co. Synthese-Optimierungsproblem (ISE 10.3)


Autor: Philip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein kleines Modul geschrieben, dass eine generische Anzahl von 
Modulo Countern erzeugen soll:
ENTITY counter_block IS
  GENERIC(
    g_num_counters : INTEGER);
  PORT(
    clk              : IN  STD_LOGIC;
    rst_n            : IN  STD_LOGIC;
    -- counter settings
    i_counter_max    : IN STD_LOGIC_VECTOR(g_num_counters*32-1 DOWNTO 0);
    -- counter control
    i_counter_enable : IN  STD_LOGIC_VECTOR(g_num_counters-1 DOWNTO 0);
    i_counter_reset  : IN  STD_LOGIC_VECTOR(g_num_counters-1 DOWNTO 0);
    -- counter output
    o_counters       : OUT STD_LOGIC_VECTOR(g_num_counters*32-1 DOWNTO 0)
    );
END ENTITY counter_block;

ARCHITECTURE rtl OF counter_block IS

  SIGNAL s_counters : STD_LOGIC_VECTOR(g_num_counters*32-1 DOWNTO 0);

BEGIN

  o_counters <= s_counters;

  p_count : PROCESS (clk, rst_n)
  BEGIN  -- PROCESS p_cnount
    IF (rst_n = '0') THEN
      s_counters <= (OTHERS => '0');
    ELSIF (clk'EVENT AND clk = '1') THEN

      FOR i IN 0 TO g_num_counters-1 LOOP

        IF (i_counter_reset(i) = '1') THEN
          s_counters(i*32+31 DOWNTO i*32) <= (OTHERS => '0');
        ELSIF (i_counter_enable(i) = '1') THEN
          IF (s_counters(i*32+31 DOWNTO i*32) < i_counter_max(i*32+31 DOWNTO i*32)) THEN
            s_counters(i*32+31 DOWNTO i*32) <= s_counters(i*32+31 DOWNTO i*32) + 1;
          ELSE
            s_counters(i*32+31 DOWNTO i*32) <= (OTHERS => '0');
          END IF;
        END IF;
        
      END LOOP;  -- i

    END IF;
  END PROCESS p_count;

END ARCHITECTURE rtl;

Über den i_counter_max Eingang möchte ich jedem Counter einen eigen 
Maximalwert zuweisen. Mit i_counter_enable sollen die einzelnen Counter 
hochzählen.

Diesen Block verwende ich in meinem Design mit g_num_counters = 64. 
Dabei ist aber i_counter_enable(31 downto 7) konstant null, es sollen 
also nur 7 Counter verwendet werden. Für diese ist i_counter_max jeweils 
konstant auf X"0000ffff" gesetzt.
Eigentlich habe ich also erwartet erwartet dass im ISE nach der 
Optimierung 7 16 Bit Counter übrig bleiben, tatsächlich bekomme ich 
aber:

inferred 2048 D-type flip-flop(s).
inferred  64 Adder/Subtractor(s).
inferred  64 Comparator(s).

Wie code ich das ganze so, dass ISE das macht was ich will?

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

Bewertung
0 lesenswert
nicht lesenswert
> Dabei ist aber i_counter_enable(31 downto 7) konstant null
Woher soll denn der Synthesizer das wissen?
Bei der Analyse dieses Moduls kann er das nicht sehen.

Das selbe gilt für diese Aussage:
> Für diese ist i_counter_max jeweils konstant auf X"0000ffff" gesetzt.
Wenn du mir das nicht geschrieben hättest, wüsste ich das nicht. An der 
Beschreibung des Moduls kann ich es nicht erkennen.

> Wie code ich das ganze so, dass ISE das macht was ich will?
Indem du z.B. keine solchen Monstervektoren verwendest:
  ... STD_LOGIC_VECTOR(g_num_counters*32-1 DOWNTO 0);
Sondern einfach einzelne Zähler definierst und die generisch über den 
Port übergibst. Evtl. solltest du dir dafür einen passenden Record in 
einem Package definieren.

Autor: Philip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hast Du natürlich recht...

Trotzdem würde ich erwarten dass zu einem späteren Zeitpunkt erkannt 
wird, dass die enables konstant 0 sind und die entsprechenden Register 
wegoptimiert werden. Das ist aber nicht der Fall.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philip schrieb:
> ... die enables konstant 0 sind und die entsprechenden Register
> wegoptimiert werden. Das ist aber nicht der Fall.
Das macht XST normalerweise auch (kommt relativ weit hinten im
Synthesereport). Allerdings erst, wenn Du das Modul in der 
Hierarchieebne darüber synthetisierst.

Duke

Autor: Philip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Duke Scarring schrieb:
> Das macht XST normalerweise auch (kommt relativ weit hinten im
> Synthesereport). Allerdings erst, wenn Du das Modul in der
> Hierarchieebne darüber synthetisierst.

Das hab ich getan. In der "Module Level Utilization", also nach dem 
Mappen sehe ich aber immer noch 2048 FlipFlops.

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

Bewertung
0 lesenswert
nicht lesenswert
> dass die enables konstant 0 sind
Sind sie das wirklich? Oder sind das FFs, die im Reset auf '0' und 
später mal auf diesen "konstanten" Wert gesetzt werden?

Autor: Philip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
>> dass die enables konstant 0 sind
> Sind sie das wirklich? Oder sind das FFs, die im Reset auf '0' und
> später mal auf diesen "konstanten" Wert gesetzt werden?

Ja, sind fest auf 0 "verdrahtet". Aber ich werd mal Deinen Rat mit den 
einzelnen Countern ausprobieren, vielleicht ist das Ganze damit ja 
hinfällig. Erstmal besten Dank für die Antworten!

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.