Datum:
Hallo zusammen, ich habe mit folgender Funktion ein Problem im Quartus:
FUNCTION summe( zahl1 : STD_LOGIC_VECTOR; zahl2 : STD_LOGIC_VECTOR; index : NATURAL ) RETURN STD_LOGIC_VECTOR IS VARIABLE v_summe : STD_LOGIC_VECTOR(11 downto 0); VARIABLE v_tmp_summe : STD_LOGIC_VECTOR(11 downto 0); BEGIN v_tmp_sum := (OTHERS => '0'); FOR i IN 0 TO 2 LOOP IF index < 8 THEN v_tmp_summe(zahl1'HIGH+index+i downto index+i) := zahl1; v_summe := v_summe + v_tmp_summe; ELSE EXIT; END IF; END LOOP; RETURN v_summe; END; |
Dabei wird mir angemeckert, dass die "left bound" und "right bound" in dieser Zeile nicht konstant sind.
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!
Datum:
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
Datum:
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?
