Forum: FPGA, VHDL & Co. Quartus - nicht konstante RANGE wie umgehen


von Holger (Gast)


Lesenswert?

Hallo zusammen,

ich habe mit folgender Funktion ein Problem im Quartus:
1
FUNCTION summe(
2
    zahl1    : STD_LOGIC_VECTOR;
3
    zahl2    : STD_LOGIC_VECTOR;
4
    index    : NATURAL
5
  ) RETURN STD_LOGIC_VECTOR IS
6
        VARIABLE v_summe      : STD_LOGIC_VECTOR(11 downto 0);
7
        VARIABLE v_tmp_summe  : STD_LOGIC_VECTOR(11 downto 0);
8
9
BEGIN
10
   v_tmp_sum := (OTHERS => '0');
11
12
   FOR i IN 0 TO 2 LOOP
13
     IF index < 8 THEN
14
       v_tmp_summe(zahl1'HIGH+index+i downto index+i) := zahl1;
15
       v_summe := v_summe + v_tmp_summe;
16
     ELSE
17
       EXIT;
18
     END IF;
19
20
   END LOOP;
21
22
   RETURN v_summe;
23
END;
Dabei wird mir angemeckert, dass die "left bound" und "right bound" in 
dieser Zeile nicht konstant sind.
1
v_tmp_summe(zahl1'HIGH+index downto index) := zahl1;
Sollen sie ja auch nicht sein, da ich in einem Takt mehrere Additionen 
ausführen will.

Die Funktion wurde erfolgreich mit Modelsim simuliert, nur Quartus stört 
sich an dieser Zeile bzw. dem Hochzählen des Index.
Wie kann ich diese Fehlermeldung umgehen und dennoch meine Funktion nach 
aktuellem Stand umsetzen?

Möchte nach der ganzen Simulation meines Projektes jetzt nur ungern 
alles noch einmal umbauen bzw. eine andere Art der Umsetzung wählen, nur 
weil Quartus nicht versteht, was ich von ihm möchte :)

Vielen Dank!
Holger

PS: Was die Gatterlaufzeiten bei mehreren Additionen pro Takt betrifft, 
bin ich mir bewusst, dass das ein Problem werden könnte. Die Taktraten 
sind aber niedrig genug!

von Holger (Gast)


Lesenswert?

Hallo,

ich habe inzwischen rausgefunden, dass eine Variable in der RANGE Angabe 
nicht VHDL-conform ist. Nur frage ich mich, wieso es dann Modelsinm 
nicht anmeckert.

Nun stehe ich da, freue mich über meine gute Idee mit der Funktion und 
das alles super mit der Simulation geklappt hat, ich es aber nun nicht 
im Quartus übersetzen kann.

Hat jemand eine andere Idee, wie ich in einem Takt mehrere Operationen 
ausführen kann und somit diese Index-Sache umgehen kann?

Vielen Dank!
Holger

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


Lesenswert?

Holger schrieb:
> ich habe inzwischen rausgefunden, dass eine Variable in der RANGE Angabe
> nicht VHDL-conform ist.
Wo steht das?
Und zudem hast du keine Variable in der Bereichsangabe...  :-o
> Hat jemand eine andere Idee, wie ich in einem Takt mehrere Operationen
> ausführen kann und somit diese Index-Sache umgehen kann?
Kannst du die Schleife nicht einfach entrollen?
Wie oft wird diese summe() aufgerufen?
Brauchst du unbedingt eine Funktion?
Falls nein: schreib das Zeug doch Concurrent oder als Prozess hin...

Ich kapier sowieso nicht (ganz), was du da machst:
zahl2 wird gar nicht verwendet.
Soll v_summe speichernd sein?
Ist index variabel?
Warum rechnest du mit std_logic vektoren?

Was macht diese Funktion überhaupt? Was ist das für eine Summe?

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.