Guten Morgen liebes Forum,
ich bin gerade dabei, ein Desgin zu entwerfen, welches die Summe aus n
Elementen (12 Bit Std_logic_Vector) berechnet, wobei jedes n-te Element
mit dem Indexfaktor n multipliziert wird.
Formeltechnisch sieht das ganze so aus:
Die reine Addition, bzw. die Gesamtsumme aller Vektoren steht soweit.
Dies habe ich folgendermaßen realisiert:
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 | use ieee.numeric_std.all;
|
4 |
|
5 |
|
6 | entity summ is
|
7 | Port ( data_a : in STD_LOGIC_VECTOR (11 downto 0);
|
8 | data_b : in STD_LOGIC_VECTOR (11 downto 0);
|
9 | clk : in STD_LOGIC;
|
10 | sum_sub : out STD_LOGIC_VECTOR (23 downto 0)
|
11 | );
|
12 |
|
13 | end summ;
|
14 |
|
15 | architecture Behavioral of summe_index is
|
16 | signal sum : unsigned (23 downto 0):= (others => '0');
|
17 | signal count: unsigned (11 downto 0) := (others => '0');
|
18 | signal temp : unsigned (11 downto 0):= (others => '0');
|
19 |
|
20 |
|
21 | begin
|
22 |
|
23 | process(clk)
|
24 | begin
|
25 | if rising_edge(clk) then
|
26 | temp <= unsigned(data_a) + unsigned(data_b);
|
27 | sum_sub <= std_logic_vector(sum);
|
28 | end if;
|
29 |
|
30 | if falling_edge(clk) then
|
31 | sum <= sum + temp;
|
32 | end if;
|
33 |
|
34 | end process;
|
35 | end Behavioral;
|
Dazu habe ich mir eine Testbench geschrieben, die data_a und data_b
eine gewissen Anzahl von Signalen in Abhängigkeit des Taktes zuweisen.
Das Ergebnis geht auf.
Um nun jedes Element mit einem Faktor zu belegen, habe ich mir erst
einmal Zähler gebaut:
1 | process(clk)
|
2 | begin
|
3 | if rising_edge(clk) then
|
4 | count <= count + 1;
|
5 | end if;
|
6 | end process;
|
Nun wollte ich das Ganze so lösen:
1 | process(clk)
|
2 | begin
|
3 | if rising_edge(clk) then
|
4 | temp <= unsigned(data_a) * unsigned(count sll 1) + unsigned(data_b) * unsiged ((count sll 1) + 1);
|
5 | sum_sub <= std_logic_vector(sum);
|
6 | end if;
|
7 |
|
8 | if falling_edge(clk) then
|
9 | sum <= sum + temp;
|
10 | end if;
|
11 |
|
12 | end process;
|
13 | end Behavioral;
|
Nun muss ich natürlich den Wertebereich meiner sum und sum_sub
erweitern, ich meine es waren dann 36 Bit. Dieses Vorhaben geht jedoch
leider nicht mehr auf. Es wird zwar ohne Fehler synthetisiert, jedoch
sehe ich im ISIM nur UNITIALIZED bei sum_sub. Kann es sein, dass es mit
den Takten nicht ganz hin haut, da ich in der aufsteigender Flanke
addieren UND multiplizieren möchte?
Wäre über jeden Rat sehr dankbar, wie ich das Problem lösen kann.
Schönen Sonntag,
Hans