Forum: FPGA, VHDL & Co. Array Dynamisch erzeugen


von Michael T. (elr0n)


Lesenswert?

Hallo,

ich such nach einer Möglichkeit folgendes Array mit VHDL zu erzeugen.

Es handelt um ein Array das weitere Arrays enthält.

Die Anzahl der Plätze der inneren Arrays soll sich dabei immer 
halbieren.

Beispiel:

Ich erzeuge ein Array der größe 3.

Array[0] soll dann ein array der größe 6 enthalten. Array[1] ein Array 
mit größe 3 und so weiter.

Das ganze soll dynamisch erzeugt werden. Ich gebe also die größe für das 
äußere Array und das erste innere Array an und daraus soll dann der rest 
erzeugt werden.

von Pako (Gast)


Lesenswert?

for loop?

von Michael T. (elr0n)


Lesenswert?

Fest programmiert sieht das ganze z.B. so aus:
1
 constant array_aussen        : natural := 9;
2
  
3
 type array_def1 is array (0 to (array_aussen-1)/2) of unsigned(9 downto 0);
4
 type array_def2 is array (0 to (array_aussen-1)/4) of unsigned(9 downto 0);
5
 type array_def3 is array (0 to (array_aussen-1)/8) of unsigned(9 downto 0);
6
  
7
 type array_record is
8
  record
9
     a : array_def1;
10
     b : array_def2;
11
     c : array_def3;
12
     d : unsigned(0 downto 9);
13
   
14
  end record;


Kann man eine for loop überhaupt zum erzeugen von typen verwenden?

von Stachele (Gast)


Lesenswert?

Nein.


Wozu brauchst du das?

von Stachele (Gast)


Lesenswert?

>d : unsigned(0 downto 9);

0 to 9

von Michael T. (elr0n)


Lesenswert?

Die Idee war einen Tree-Adder, der nur für eine feste Anzahl an 
Eingangswerten funktioniert, so für eine variable Anzahl an 
Eingangswerten umzuschreiben.

von Stachele (Gast)


Lesenswert?

Kannst du den Tree-Adder für eine feste Anzahl an Eingängen mal zeigen?

von Michael T. (elr0n)


Lesenswert?

Hier für 9 Eingangswerte:
1
  type arr_add1_result is array (0 to (ArrayElements-1)/2) of unsigned(31 downto 0);
2
  type arr_add2_result is array (0 to (ArrayElements-1)/4) of unsigned(31 downto 0);
3
  type arr_add3_result is array (0 to (ArrayElements-1)/8) of unsigned(31 downto 0);
4
    
5
6
    
7
  signal add1_result     : arr_add1_result := ((others => (others => '0')));
8
  signal add2_result     : arr_add2_result := ((others => (others => '0')));
9
  signal add3_result     : arr_add3_result := ((others => (others => '0')));
10
  signal add4_result     : unsigned(31 downto 0) :=(others => '0');
11
12
13
      for i in 0 to (ArrayElements-1)/2-1 loop
14
        add1_result(i) <= array_in(i*2) + array_in((i*2)+1);
15
      end loop;
16
      add1_result((ArrayElements-1)/4) <= add1_result((FilterMaskElements-1)/2);
17
      
18
      for i in 0 to (ArrayElements-1)/4-1 loop
19
        add2_result(i) <= add1_result(i*2) + add1_result((i*2)+1);
20
      end loop;
21
      add2_result((ArrayElements-1)/4) <= add1_result((FilterMaskElements-1)/2);
22
      
23
      
24
      for i in 0 to (ArrayElements-1)/8-1 loop
25
        add3_result(i) <= add2_result(i*2) + add2_result((i*2)+1);
26
      end loop;
27
      add3_result((ArrayElements-1)/8) <= add2_result((FilterMaskElements-1)/4);
28
        
29
      add4_result <= add3_result(0) + add3_result(1);
30
        
31
      add4_result <= add3_result(0) + add3_result(1);


Im array_in sind 9 Werte(ArrayElements) die paarweise addiert werden 
sollen.
In add4_result ist dann das Ergebnis.

Um es dynamisch zu machen habe ich  add1_result-addX_result zu einem 
array gemacht. Das ganze funktioniert auch nur hab ich jetzt halt in 
allen arrays die gleiche Anzahl an Plätzen, obwohl von Stufe zu Stufe ja 
immer weniger benötigt werden. Das möchte ich halt eleganter und 
resourcenschonender lösen.

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.