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


von Philip (Gast)


Lesenswert?

Hallo,

ich habe ein kleines Modul geschrieben, dass eine generische Anzahl von 
Modulo Countern erzeugen soll:
1
ENTITY counter_block IS
2
  GENERIC(
3
    g_num_counters : INTEGER);
4
  PORT(
5
    clk              : IN  STD_LOGIC;
6
    rst_n            : IN  STD_LOGIC;
7
    -- counter settings
8
    i_counter_max    : IN STD_LOGIC_VECTOR(g_num_counters*32-1 DOWNTO 0);
9
    -- counter control
10
    i_counter_enable : IN  STD_LOGIC_VECTOR(g_num_counters-1 DOWNTO 0);
11
    i_counter_reset  : IN  STD_LOGIC_VECTOR(g_num_counters-1 DOWNTO 0);
12
    -- counter output
13
    o_counters       : OUT STD_LOGIC_VECTOR(g_num_counters*32-1 DOWNTO 0)
14
    );
15
END ENTITY counter_block;
16
17
ARCHITECTURE rtl OF counter_block IS
18
19
  SIGNAL s_counters : STD_LOGIC_VECTOR(g_num_counters*32-1 DOWNTO 0);
20
21
BEGIN
22
23
  o_counters <= s_counters;
24
25
  p_count : PROCESS (clk, rst_n)
26
  BEGIN  -- PROCESS p_cnount
27
    IF (rst_n = '0') THEN
28
      s_counters <= (OTHERS => '0');
29
    ELSIF (clk'EVENT AND clk = '1') THEN
30
31
      FOR i IN 0 TO g_num_counters-1 LOOP
32
33
        IF (i_counter_reset(i) = '1') THEN
34
          s_counters(i*32+31 DOWNTO i*32) <= (OTHERS => '0');
35
        ELSIF (i_counter_enable(i) = '1') THEN
36
          IF (s_counters(i*32+31 DOWNTO i*32) < i_counter_max(i*32+31 DOWNTO i*32)) THEN
37
            s_counters(i*32+31 DOWNTO i*32) <= s_counters(i*32+31 DOWNTO i*32) + 1;
38
          ELSE
39
            s_counters(i*32+31 DOWNTO i*32) <= (OTHERS => '0');
40
          END IF;
41
        END IF;
42
        
43
      END LOOP;  -- i
44
45
    END IF;
46
  END PROCESS p_count;
47
48
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?

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


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:
1
  ... 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.

von Philip (Gast)


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.

von Duke Scarring (Gast)


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

von Philip (Gast)


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.

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


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?

von Philip (Gast)


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!

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.