Quartus - nicht konstante RANGE wie umgehen

Gast #2619030
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!
Gast #2619853
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
Moderator (Firma: Titel) Persönliche Seite #2619882
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren