Forum: FPGA, VHDL & Co. problem: Syntax error near "if"


von jihm (Gast)


Lesenswert?

hallo,

sorry für den schwammigen titel. ich vermute aber das der fehler eher in 
meinem verständnis für vhdl liegt.

ich habe 2 syntax fehler im code, Syntax error near "if" & Syntax error 
near "generate" - sind im code gekennzeichnet.

hat jmd hinweise für mich?

1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use common.all;
4
5
entity KoggeStoneAdder is
6
  port (  
7
    P: in std_logic_vector;
8
9
    G: in std_logic_vector;
10
    cin: in std_logic;
11
    cout: out std_logic
12
  );
13
end KoggeStoneAdder;
14
15
architecture Behavioral of KoggeStoneAdder is
16
  --variable dist: integer;
17
18
19
  signal len: natural := log2(P'length + 1);
20
  signal dist: integer;
21
  
22
  type tmpArr is array(len - 1 to 0) of std_logic_vector((P'high - P'low + 1) downto 0);
23
  signal tP: tmpArr;
24
  signal tG: tmpArr;
25
  
26
begin
27
        --P, G, Cin in tmp Feld laden
28
        tG(0)(0) <= cin;
29
        tP(0)(0) <= '1';
30
forGen:    for i in tG'high to 1 generate
31
          tG(0)(i) <= G(i + G'low);
32
          tP(0)(i) <= P(i + P'low);
33
        end generate;
34
35
36
37
stGen0:    for i in 1 to (len - 1) generate
38
stGen1:      for j in 0 to tG'high generate
39
  
40
            --dist <= j - i ** 2;
41
            
42
            if (j < 2 ** i) then --Line 41: Syntax error near "if".
43
              tG(i)(j) <= tG(i - 1)(j);
44
              tP(i)(j) <= tP(i - 1)(j);
45
            end if;      
46
            
47
            
48
ifGen:        if (j >= 2 ** i) generate
49
prfxInst:        Prefix port map(tG(i - 1)(j), tP(i - 1)(j),  
50
                              tG(i - 1)(j - dist), tP(i - 1)(j - dist),
51
                               tG(i)(j), tP(i)(j));  
52
            end generate;
53
                      
54
          end generate;
55
        end generate; --Line 54: Syntax error near "generate".
56
  
57
58
59
end Behavioral;

von Jan M. (mueschel)


Lesenswert?

If ist nur innerhalb von Prozessen erlaubt, nicht direkt in the 
architecture. Das sollte dir aber das VHDL-Tutorial / Buch deiner Wahl 
erklären können.

von Duke Scarring (Gast)


Lesenswert?

jihm schrieb:
> stGen0:    for i in 1 to (len - 1) generate
Dir ist hoffentlich bewußt, daß durch die for-Schleife parallele 
Hardware beschrieben wird. Meinjanur, ist ein beliebter Anfängerirrtum..

Duke

von Andreas B. (andreas_b77)


Lesenswert?

Statt if … then ein if … generate, genau wie ein paar Zeilen weiter 
unten, würde ich sagen.

von jihm (Gast)


Lesenswert?

ja, if .. generate war die lösung.
das "generate" parallele hw beschreibt, ist mir hoffentlich bewusst. ob 
ichs dadurch richtig einsetzte, ist dann noch was andres.

jedenfalls läuft der code jetzt zumindest ohne fehler durch, das 
ergebnis ist aber noch net das was ich möchte.

es scheint so, als ob die beiden for generate schleifen nicht bearbeitet 
werden, in der simulations seh ich für tG(1) .. tG(len - 1) nur 'U's

hat jmd dazu noch nen hinweis für mich?
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use work.common.all;
4
5
entity KoggeStoneAdder is
6
  port (  
7
    P: in std_logic_vector;
8
9
    G: in std_logic_vector;
10
    cin: in std_logic;
11
    sum: out std_logic_vector;
12
    cout: out std_logic
13
  );
14
end KoggeStoneAdder;
15
16
architecture Behavioral of KoggeStoneAdder is
17
  signal len: natural := log2(P'length + 1);
18
  --signal dist: integer;
19
  
20
  type tmpArr is array(len - 1 downto 0) of std_logic_vector((P'high - P'low + 1) downto 0);
21
  signal tP: tmpArr;
22
  signal tG: tmpArr;
23
  
24
begin
25
        --P, G, Cin in tmp Feld laden
26
        tG(0)(0) <= cin;
27
        tP(0)(0) <= '1';
28
        
29
        tG(0)(G'Length downto 1) <= G;
30
        tP(0)(G'Length downto 1) <= P;
31
32
33
stGen0:    for i in 1 to (len - 1) generate
34
stGen1:      for j in 0 to G'Length generate
35
  
36
          
37
g1:          if (j < 2 ** i) generate
38
              tG(i)(j) <= tG(i - 1)(j);
39
              tP(i)(j) <= tP(i - 1)(j);
40
            end generate;      
41
            
42
            
43
ifGen:        if (j >= 2 ** i) generate
44
prfxInst:        Prefix port map(tG(i - 1)(j), tP(i - 1)(j),  
45
                              tG(i - 1)(j - 2 ** i), tP(i - 1)(j - 2 ** i),
46
                               tG(i)(j), tP(i)(j));  
47
            end generate;
48
                      
49
          end generate;
50
        end generate;
51
        
52
        sum <= tG(0)(G'Length - 1 downto 0);
53
        cout <= tG(0)(G'Length);
54
55
56
end Behavioral;

von jihm (Gast)


Lesenswert?

keiner ne idee?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

jihm schrieb:
> keiner ne idee?
Ich würde mal die Synthese drüber laufen lassen, evtl. spuckt die eine 
Meldung aus.

Insgesamt schaut mir das Ganze unwahrscheinlich theoretisch und 
umständlich aus...  :-/

von jihm (Gast)


Lesenswert?

signal len: natural := log2(P'length + 1);

das sollte

 constant len: natural := log2(P'length + 1);

sein. dann wirds schon besser.

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.