Forum: FPGA, VHDL & Co. Constant Deklaration


von jojansen (Gast)


Lesenswert?

Moin,
ich bin gerade bei meinem ersten VHDL Projekt und komme mit der 
'constant' deklaration nicht weiter.

constant verzögerungszeit : std_logic_vector (16 downto 0) := '96000';
Die Fehlermeldung ist: Syntax error near "'"

Wenn ich den Wert in Anführungszeichen setze (:="96000") oder ihn ohne 
was verwende (:= 96000), hagelt es auch in den anderen Teilen einen 
Haufen 'Syntax error'.
Die 96000 sollten eigentlich in die zugewiesenen 17bit reinpassen.
Mache ich da vielleicht einen grundlegenderen Fehler?
:-) Josh

von P. K. (pek)


Lesenswert?

Versuch's mal so:
1
  constant C_VERZ: unsigned(16 downto 0) := to_unsigned(96000,17);

(std_logic_vector würde ich gar nicht benutzen, das erübrigt Dir die 
Casterei, wenn Du unsigned irgendwo brauchst, eg. Counters etc.)

von jojansen (Gast)


Lesenswert?

Also in meinen Fall übersetzt dann so?:
constant verzögerungszeit: unsigned(16 downto 0) := 
to_unsigned(96000,17);

von jojansen (Gast)


Lesenswert?

Damit bekomme ich wieder einen Haufen 'Syntax error'. Meckern tut er 
jetzt bei 'end process reset' und allen anderen 'process - end pocess' 
Blöcken.
1
reset: process (rst, rsti, i32khz, zähler)  --internes reset mit 3sek delay weitergeben
2
    constant verzögerungszeit: unsigned(16 downto 0) := to_unsigned(96000,17);
3
    --constant verzögerungszeit : std_logic_vector (16 downto 0) := '96000';
4
    begin 
5
    if i32khz'event and i32khz = '1' then  --synchron mit clk wird reset betrachtet
6
      if rst = 0 then  --solange reset low ist, passiert nichts
7
        zähler := '0';
8
        zählflag := '0';
9
      end if;
10
      
11
      if rst = '1' and zählflag = '0' then --reset passierte aber zähler noch nicht abgelaufen
12
        zähler <= zähler +1;  --zähler für delay inkrementieren
13
        
14
        if zähler > verzögerungszeit then  --auf ablauf vom delay prüfen
15
          zählflag <= '1';  --zeit erreicht, flag setzen
16
        end if;
17
      end if;
18
      
19
      if rst = '1' and zählflag = '1' then  --wenn ext. reset ok und timer abgelaufen, dann internes reset auf ok
20
        rsti <= '1';
21
      end if;
22
  end process reset;

von P. K. (pek)


Lesenswert?

Kann Dein Tool mit Umlauten umgehen? Würde ich eher vermeiden.

von icke (Gast)


Lesenswert?

Ich würde "ö" durch "oe" ersetzen.

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


Lesenswert?

jojansen schrieb:
> Die 96000 sollten eigentlich in die zugewiesenen 17bit reinpassen.
> Mache ich da vielleicht einen grundlegenderen Fehler?
Ja. Einen sehr grundlegenden Fehler sogar!
In VHDL können Signale nur dann zugewiesen werden, wenn sie den gleichen 
Typ haben. In Verilog und C und den meisten anderen Programmiersprachen 
wird das eher relaxt gehandhabt und man verlässt sich auf implizites 
Hintergrundwissen (wie wird eine Zahl in ein Bitmuster umgewandelt)...

Hierzu was:
1
reset: process (rst, rsti, i32khz, zähler)  --internes reset mit 3sek delay weitergeben
Die Sensitivliste ist überdefiniert, denn dieser Prozess ist 
ausschließlich auf den i32khz sensitiv!

> i32khz
Wieviele Takte hast du denn in deinem Design?

jojansen schrieb:
> Damit bekomme ich wieder einen Haufen 'Syntax error'. Meckern tut er
> jetzt bei 'end process reset' und allen anderen 'process - end pocess'
> Blöcken.
Dann poste doch einfach mal deinen ganzen VHDL Code (als Anhang mit 
*.vhdl Dateiendung). Und dann noch die Fehlermeldungen. Und dann sag 
noch was zur Toolchain und zum FPGA. So ist das nur ein Ratespiel.

von jojansen (Gast)


Lesenswert?

Die Umlaute entfernen hat nichts gebracht. Ich hänge mal den 
wesentlichen Teil von mein Projekt dran.
Es wird halt eben immer bei
1
 
2
name: process (signalliste)
3
begin
4
end process name;
über die Syntax gemeckert, die Sachen dazwischen scheinen OK zu sein.
Die IDE ist die Xilinx ISE 14.4
1
entity IOrouting is
2
Port (
3
      portdeklarationen;
4
      );
5
end IOrouting;
6
7
architecture Behavioral of IOrouting is
8
signal  zaehler : std_logic_vector (16 downto 0);  --zähler für reset-delay
9
signal  zaehlflag : std_logic;    --flag wenn resetzähler angekommen ist
10
signal fehler : std_logic; --: '0';  --generelles fehlerbit
11
signal i16khz : std_logic;      --16KHz Takt zur Überwachung der PRR
12
signal zaehler16 : std_logic_vector (1downto 0); --: '0';    --zähler für 16KHz
13
signal prrcounter : std_logic_vector (3 downto 0); -- : '0';  --hilfszähler zur PRR überwachung
14
signal enprr : std_logic;
15
16
begin
17
18
--externes power-on reset wird mit 3sek zum internen reset umgebaut
19
  reset: process (rst, rsti, i32khz, zaehler)  --internes reset mit 3sek delay weitergeben
20
    constant verzoegerungszeit: unsigned(16 downto 0) := to_unsigned(96000,17);
21
    --constant verzögerungszeit : std_logic_vector (16 downto 0) := '96000';
22
    begin 
23
    if i32khz'event and i32khz = '1' then  --synchron mit clk wird reset betrachtet
24
      if rst = 0 then  --solange reset low ist, passiert nichts
25
        zaehler := '0';
26
        zaehlflag := '0';
27
      end if;
28
      
29
      if rst = '1' and zaehlflag = '0' then --reset passierte aber zähler noch nicht abgelaufen
30
        zaehler <= zaehler +1;  --zähler für delay inkrementieren
31
        
32
        if zaehler > verzoegerungszeit then  --auf ablauf vom delay prüfen
33
          zaehlflag <= '1';  --zeit erreicht, flag setzen
34
        end if;
35
      end if;
36
      
37
      if rst = '1' and zaehlflag = '1' then  --wenn ext. reset ok und timer abgelaufen, dann internes reset auf ok
38
        rsti <= '1';
39
      end if;
40
  end process reset;
41
  
42
--Auswerten der Fehlerbits  
43
  Alarmstatus: process (rsti, i32khz, estatus1, estatus2)  
44
  
45
  begin
46
  if i32khz'event and i32khz = '1' then  --synchron mit clk werden die Fehlerbits betrachtet
47
    if rsti = '1' then  --geht nur weiter, wenn reset ok ist
48
      blahblah
49
    end if;
50
  end if;
51
  end process Alarmstatus;
52
  
53
--erzeugung von 16KHz für die Überwachung der PRR  
54
  16khz: process (i32khz)
55
  
56
  begin
57
  if i32khz'event and i32khz = '1' then  --bei rising edge triggern
58
    if zaehler16 <'1' then
59
      zaehler16 <= zaehler16 +1;
60
    else 
61
      zaehler16 <= '0';
62
      i16khz <= not i16khz;  --signal wird mit halber frequenz getoggelt
63
    end if;
64
  end if;
65
  end process 16khz;
66
      
67
--Überwachung der PRR PROCESS1
68
  prr1: process (i16khz, prrcounter)
69
  begin
70
  if i16khz'event and i16khz = '1' then'  --triggern auf 16khz, < niedrigste PRR
71
    if prrcounter > '0' then  --wenn PRR > 16khz, dann ist alles gut
72
      prrcounter <= '0';
73
      enprr <= '0';
74
    else
75
      enprr <= '1';        --PRR kommt nicht, flag zur freigab der 32khz setzen
76
    end if;
77
  end if;
78
  end process prr1;
79
  
80
  
81
--Überwachung der PRR Process2
82
  prr2: process (ilasermod1)
83
  
84
  begin
85
  if ilasermod1'event and ilasermod1 = '1' then  --triggern auf die steigende flanke der PRR vom LEC
86
    prrcounter <= prrcounter + 1;
87
    if prrcounter = '7' then
88
      prrcounter <= 1;
89
    end if;
90
  end if;
91
  end process prr2;  
92
end Behavioral;

von jojansen (Gast)


Lesenswert?

der Baustein ist ein XC95144xl.
Die Fehlermeldungen sind alle bei Process, begin und end process.
:-)

von P. K. (pek)


Lesenswert?

Lothar Miller schrieb:
> Und dann noch die Fehlermeldungen.

...zumindest die erste, oder die ersten drei. Der Hinweis "Syntax error" 
alleine sagt wenig.

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


Lesenswert?

jojansen schrieb:
> entity
VHDL-Beschreibungen beginnen immer schon ein paar Zeilen VOR dem 
Keyword entity.

> Die Fehlermeldungen
WELCHE Fehlermeldungen denn?

> if prrcounter = '7' then
Ähm, ja, wie war das nochmal mit den Datentypen in VHDL?

Blöderweise kann man mit dem obigen Codeschnipsel so gar nichts 
anfangen. Ich empfehle noch immmer, was ich schon empfohlen hatte:
>>> Dann poste doch einfach mal deinen ganzen VHDL Code
>>> (als Anhang mit *.vhdl Dateiendung).
Es reicht natürlich die eine Datei, die die Fehler mit sich bringt.

von jojansen (Gast)


Angehängte Dateien:

Lesenswert?

erst einmal Supervielen Dank für eure Zeit/Mühe/Hilfe :-)
Ich habe mal den Code drangehängt und ds sind die Fehlermeldungen:

INFO:HDLCompiler:1061 - Parsing VHDL file 
"N:/xilinx/multiboard_1/IOrouting.vhd" into library work
ERROR:HDLCompiler:806 - "N:/xilinx/multiboard_1/IOrouting.vhd" Line 145: 
Syntax error near "process".
ERROR:HDLCompiler:806 - "N:/xilinx/multiboard_1/IOrouting.vhd" Line 148: 
Syntax error near "process".
ERROR:HDLCompiler:806 - "N:/xilinx/multiboard_1/IOrouting.vhd" Line 150: 
Syntax error near "begin".
ERROR:HDLCompiler:806 - "N:/xilinx/multiboard_1/IOrouting.vhd" Line 190: 
Syntax error near "process".
ERROR:HDLCompiler:806 - "N:/xilinx/multiboard_1/IOrouting.vhd" Line 195: 
Syntax error near "begin".
ERROR:HDLCompiler:806 - "N:/xilinx/multiboard_1/IOrouting.vhd" Line 204: 
Syntax error near "process".
ERROR:HDLCompiler:806 - "N:/xilinx/multiboard_1/IOrouting.vhd" Line 207: 
Syntax error near "process".
ERROR:HDLCompiler:806 - "N:/xilinx/multiboard_1/IOrouting.vhd" Line 208: 
Syntax error near "begin".
ERROR:HDLCompiler:806 - "N:/xilinx/multiboard_1/IOrouting.vhd" Line 217: 
Syntax error near "process".
ERROR:HDLCompiler:806 - "N:/xilinx/multiboard_1/IOrouting.vhd" Line 221: 
Syntax error near "process".
ERROR:HDLCompiler:806 - "N:/xilinx/multiboard_1/IOrouting.vhd" Line 223: 
Syntax error near "begin".
ERROR:HDLCompiler:806 - "N:/xilinx/multiboard_1/IOrouting.vhd" Line 230: 
Syntax error near "process".
ERROR:HDLCompiler:806 - "N:/xilinx/multiboard_1/IOrouting.vhd" Line 231: 
Syntax error near "Behavioral".
ERROR:ProjectMgmt - 13 error(s) found while parsing design hierarchy.

:-)

von jochen (Gast)


Lesenswert?

In Zeile 145 fehlt ein end if;

von jojansen (Gast)


Lesenswert?

Oh merde imbodenversink.
Komischerweise habe ich jetzt viel weniger Fehler.....

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


Lesenswert?

jochen schrieb:
> In Zeile 145 fehlt ein end if;
Ich meine es ist Zeile 126:
1
  reset: process (rst, rsti, i32khz, zaehler)  --internes reset mit 3sek delay weitergeben
2
    constant verzoegerungszeit: unsigned(16 downto 0) := to_unsigned(96000,17);
3
    --constant verzögerungszeit : std_logic_vector (16 downto 0) := '96000';
4
    begin 
5
    if i32khz'event and i32khz = '1' then  --synchron mit clk wird reset betrachtet
6
      :
7
      :
8
      if rst = '1' and zaehlflag = '1' then  --wenn ext. reset ok und timer abgelaufen, dann internes reset auf ok
9
        rsti <= '1';
10
      end if;
11
    end if;  --- *********************  das hier fehlt!
12
  end process reset;

Dann kommt der hier:
>  16khz: process (i32khz)
> Syntax error near "16".
Naja, da darf keine Zahl am Anfang des Bezeichners kommen.
Ein heisser Tipp: du kannst die Labels am Prozess auch weglassen... ;-)

Wie auch immer: hättest du den Code gleich angehängt, hätte es nicht so 
lang gedauert...

von jochen (Gast)


Lesenswert?

Lothar Miller schrieb:
> jochen schrieb:
>> In Zeile 145 fehlt ein end if;
> Ich meine es ist Zeile 126:

Ich glaube wir zählen unterschiedlich;)

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


Angehängte Dateien:

Lesenswert?

jochen schrieb:
> Ich glaube wir zählen unterschiedlich;)
Ich glaube, die ISE tut das...   :-(

von jojansen (Gast)


Lesenswert?

Also, das fehlende End IF und die führende Ziffer im Process Namen waren 
es.
Anfängerfehler eben.
Nun bekomme ich keine Fehler mehr (vorerst ;-) ).
ICH DANKE EUCH!!!!!!!
:-) Josh

von Duke Scarring (Gast)


Lesenswert?

jojansen schrieb:
> Nun bekomme ich keine Fehler mehr (vorerst ;-) ).
Fein.
Dann nimmst Du als nächstes den Simulator und eine Testbench und schaust 
nach, ob Dein Design funktionell funktioniert.
Erst wenn das sichergestellt ist, kannst Du eine weitere Synthese machen 
und das Design in Hardware ausprobieren.

Duke

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.