Hallo,
ich hatte schon einmal eine Frage zu diesem Problem, hatte mich aber
sehr unglücklich ausgedrückt und den Code ungeschickt vereinfacht, so
dass das eigentliche Problem nicht klar heraus gestellt wurde.
Es geht um folgende Funktion, die in einem seriellen Multiplizierer
verwendet wird.
1 | FUNCTION calc(
|
2 | factor1 : STD_LOGIC_VECTOR; --(11 downto 0)
|
3 | factor2 : STD_LOGIC_VECTOR; --(11 downto 0)
|
4 | index : NATURAL;
|
5 | schritte : NATURAL;
|
6 | result : STD_LOGIC_VECTOR --(23 downto 0)
|
7 | ) RETURN STD_LOGIC_VECTOR IS
|
8 |
|
9 | VARIABLE v_factor1 : STD_LOGIC_VECTOR(result'RANGE); --(23 downto 0)
|
10 | VARIABLE v_summe : STD_LOGIC_VECTOR(result'RANGE);--(23 downto 0)
|
11 | VARIABLE v_temp : STD_LOGIC_VECTOR(v_summe'RANGE);--(23 downto 0)
|
12 |
|
13 | BEGIN
|
14 | v_summe := result;
|
15 | v_temp := (OTHERS => '0');
|
16 | FOR i IN 0 TO schritte - 1 LOOP
|
17 | IF (i <= schritte - 1)) THEN
|
18 | IF (factor2(index + i) = '1') THEN
|
19 | v_temp(factor1'HIGH+index+i downto index+i) := factor1;
|
20 | ELSE
|
21 | v_temp := (others => '0');
|
22 | END IF;
|
23 | v_summe := v_summe + v_temp;
|
24 | ELSE
|
25 | EXIT;
|
26 | END IF;
|
27 | END LOOP;
|
28 | RETURN v_summe;
|
29 | END;
|
Diese rufe ich auf, um die Bits von Faktor 2 zu untersuchen um dann
entsprechend zu dem Ergebnis der Multiplikation aufzuaddieren.
Diese Additionen sollen in einem Takt durchführbar sein. Wieviele Bits
in einem Takt untersucht werden, legt "schritte" fest, womit dann die
LOOP erstellt und durchlaufen wird.
Nun meckert mir Quartus an, dass die RANGE in dieser Zeile
1 | v_temp(factor1'HIGH+index+i downto index+i) := factor1;
|
nicht konstant ist und damit ist die Sache nicht synthetisierbar.
Modelsim hingegen simuliert es anstandslos.
Nun fehlt mir die zündende Idee, wie ich das umschreiben kann, um
dennoch die Shiftoperationen beizubehalten.
Könnte mir jemand einen Gedankenanstoß geben?
Vielen Dank!