Forum: FPGA, VHDL & Co. VHDL Anfänger: Wait Statement bei Xilinx ISE??


von Florian Scherb (Gast)


Lesenswert?

Hallo

Ich bin noch Anfänger und habe ein Problem mit Wait-Statements.

Ich bring es nicht fertig einen Process mit Wait-Statement in XILINX ISE 
Version 9.2 umzusetzten. Ständig kommt als Error "Wait Statements not 
supported".

Das kann doch nicht sein? Ich dachte VHDL hätte eine genormte Syntax, da 
kann man doch nicht einfach irgendwas weglassen wie es einem gerade 
passt?

Klar, ich könnte die Prozesse auch mit ´ner Sensitivity-List schreiben 
aber oft wäre es so einfacher...

von Florian Scherb (Gast)


Lesenswert?

Wieder die Hälfte vergessen...


Sorry ich meinte Wait for Statements, also sowas hier:

architecture Behavioral of TESTBENCH is
begin

CLOCKGEN: process is
begin
  q <= '1' after 5 ns, '0' after 10 ns;
  wait for 20 ms;
end process CLOCKGEN;
end Behavioral;

von Gabriel W. (gagosoft)


Lesenswert?

Ein wichtiger Aspekt von VHDL ist der Unterschied zwischen Simulation 
und Synthese.

Für simulationszwecke können alle möglichen schmutzigen Tricks 
eingestzt werden. Für die Synthese (also zum in den FPGA schiessen) ist 
eine Untermenge der Statements zulässig.
...und die Testbench willst Du ja wohl nicht synthetisieren, die soll ja 
nicht in den FPGA rein...

Wieso ist das so?
ganz einfach: Um ein Produktionsmodell zu testen muss eine Testbench 
her. Wenn man die Testbench in rein synthetisierbarem Code schreibt, ist 
das viel auswendiger, als wenn man zB Wait-Statements, textio ... 
verwenden kann.

Eine synthesefähige Verzögerung erreichst Du am besten mit einem 
Counter, den Du setzt und mit jedem
1
Clk'event and Clk = '1'
 dekrementierst.

Als Clk-Signal musst Du einen externen Quartzoszillator verwenden. Aber 
bitte nur mit einem 3V3 oder 2V5 Signal in den FPGA, mit 5V direkt 
reingefahren und schon ist der Port hin.
Einen Trick gibts noch: Wenn Du nur Oszillatoren mit 5V hast, kannst Du 
das Ausgangssignal mit einem Widerstand (220-300Ohm) strombegrenzen, den 
Rest erledigen die Überspannungsschutzdioden beim_ _SPARTAN3 
funktionierts bei anderen FPGAs weiss ich's nicht.

mfg GagoSoft
----------------------------------
wer Rechtschreibfehler findet, darf sie behalten, Inhaltliche Fehler
nehme ich gerne zurück

von Florian Scherb (Gast)


Lesenswert?

Hallo

Dass bestimmter Code nicht synthetisierbar ist weis ich, aber ich kann 
den Code nichtmal simulieren :( Da geht gar nichts. Die Warnung kommt 
überall, auch schon beim reinen Syntax-Check.

Normal steht da ja wenn es nicht synthetisierbar ist "...cannot be 
synthesized" oder sowas, aber "....not supported"??

von T.M. (Gast)


Lesenswert?

Ich nehme mal an, dass diese Verzögerung mit "after" nur ausserhalb 
eines Prozesses geht (bin mir aber nicht sicher, da mein schlaues Buch 
nicht griffbereit liegt). Das würde heissen, dass du
1
CLOCKGEN: process is
2
begin
3
  q <= '1' after 5 ns, '0' after 10 ns;
4
  wait for 20 ms;
5
end process CLOCKGEN;
6
end Behavioral;
umwandeln musst in
1
CLOCKGEN: process is
2
begin
3
  wait for 5 ns;
4
  q <= '1'
5
  wait for 10 ns;'
6
  q <= '0';
7
  wait for 20 ms;
8
end process CLOCKGEN;
9
end Behavioral;

von Florian Scherb (Gast)


Lesenswert?

Ich habe das Beispiel aus einem VHDL Buch raus (The Designers Guide to 
VHDL). Das MUSS also eigentlich funktionieren...


Das "after" hat keine Auswirkungen, das funktioniert problemlos in 
Prozessen um eine verzögerte Signalzuweisung zu machen.

Aber wie gesagt, das "Wait for" eben...da hilft es auch nichts ob ich 
das nun einmal am Ende schreibe oder wie du 3x im Text ;)

von Jan M. (mueschel)


Lesenswert?

Poste bitte mal ein komplettes Beispiel, das bei dir nicht funktioniert. 
Der CLOCKGEN: process von oben läuft bei mir einwandfrei...

von Gabriel W. (gagosoft)


Lesenswert?

hmmmm ich verwende ISE 8.1i und das Tool ist nur zum synthetisieren 
geeignet. Keine Ahnung wie das mit 9.2 ist...
Zum Simulieren verwende ich ModelSim 6.1c das frisst mir ALLES was ich 
an VHDL verwenden wollte.

mfg GagoSoft
----------------------------------
wer Rechtschreibfehler findet, darf sie behalten, Inhaltliche Fehler
nehme ich gerne zurück

von Jan M. (mueschel)


Lesenswert?

Ich verwende hier auch 8.1 unter Linux sowie 9.2 unter Windows und Linux 
- ich habe mit keinem das beschriebene Problem. Klar, der 
waveform-viewer von 8.1 ist alles andere als komfortabel (9.2 ist da ein 
klein wenig besser), aber bis auf Abstürze bei bestimmten 
Code-Konstellationen und fehlenden Fehlermeldungen habe ich damit keine 
größeren Probleme, wenn ich ihn denn mal benutze.

von Florian Scherb (Gast)


Lesenswert?

Hallo

Das ist an sich schon das gesamte Programm. Viel mehr ist da nicht.
Lediglich noch eine Entity hinzugefügt, die aber kaum das Problem sein 
kann:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
entity TESTBENCH is
7
    Port ( q : out STD_LOGIC);
8
end TESTBENCH;
9
10
architecture Behavioral of TESTBENCH is
11
begin
12
13
CLOCKGEN: process is
14
begin
15
  q <= '1' after 5 ns, '0' after 10 ns;
16
  wait for 20 ms;
17
end process CLOCKGEN;
18
end Behavioral;


Woran es aber liegen könnte ist, dass ich die Codes immer mit dem ISE 
Simulator teste. Ich werde das mal mit dem Modelsim testen. Jetzt muss 
ich aber noch dringend weg, ich poste heute Abend mal das Ergebnis.

von Jan M. (mueschel)


Lesenswert?

Dein Problem liegt sicher nicht in diesem Code. Läuft hier unter Ise9.2 
(Windows) mit dem internen Simulator einwandfrei.

von Klaus F. (kfalser)


Lesenswert?

Hast Du ISE auch mitgeteilt, dass Dein File eine Testbench ist?
Beim Anlegen des Files mit dem Source Wizard kann man unter anderem 
zwischen VHDL Testbench und VHDL Module auswählen.

Klaus

von Hannes Pauli (Gast)


Lesenswert?

Der FPGA kann kein "wait", liegt aber auch einfach an der Hardware 
begrenzung.

Bau einen Clock divider, also zähl einfach deine Clock ab, und trag das 
Signal dann in deine Prozess sensivity Liste ein. Oder verwende das DCM.

P.S.
Im Endeffekt kann das FPGA auch kein "after". Teste es einfach am 
Oszyloskopen.

von Florian Scherb (Gast)


Lesenswert?

Hallo

Vielen Dank für die Tipps!

Ich will mir nun (auch als gute Übung) ein Package machen, welches 
mehrere proceduren enthält um Wait-Anweisungen auszuführen.

Ich sitz nun schon eine gute Stunde hier dran aber komm absolut nicht 
drauf warum das nicht funktionieren kann.

Ich habe hier mal den Code einer Testumgebung. Ziel ist es, dass man der 
Procedure Waitns(Zeit, Clock) die zu wartende Zeit (hier in ns) sowie 
das zu verwendende Clock-Signal gibt. Die Procedure rödelt dann so lange 
rum bis die entsprechende Zeit abgelaufen ist.



Ausgelegt habe ich den Code für eine Clock von 50MHz (20ns 
Periodendauer) und sehr hohen Wartezeiten (1000ns und mehr):
1
entity Waitstatement is
2
  port( CLK: in STD_LOGIC;
3
        Q : out STD_LOGIC);
4
end Waitstatement;
5
6
architecture Behavioral of Waitstatement is
7
8
9
procedure Waitns (nanosek: in integer; signal CLK_int : in STD_LOGIC) is
10
variable count : integer := 0;               -- Zähler
11
variable cycle : integer := 20;              -- Ein einziger Clock cycle bei 50MHz ist 20ns
12
Variable clock_cycles : integer;             -- Hält später den Wert für die Anzahl an Clock cycles
13
begin
14
15
  clock_cycles := nanosek / cycle;          -- Anzahl der Clock cycles ermitteln
16
    if clock_cycles = 0 then               -- Wenn 0 dann auf 1 setzen und Warnung rausgeben
17
      clock_cycles := 1;
18
      report "Wait expression must be at least 20ns!" severity failure;
19
    end if;
20
  
21
  while count < clock_cycles loop           -- Schleife, die so lange zählt bis genug Takte verstrichen sind
22
    if rising_edge(CLK_int) then
23
      count := count + 1;
24
    end if;    
25
  end loop;
26
  
27
end procedure Waitns;
28
  
29
begin
30
31
TEST: process (CLK)
32
begin
33
  Q <= '0';
34
  Waitns(60, CLK);                          
35
  Q <= '1';                        -- Nach 60ns sollte Q auf 1 gehen. 
36
end process TEST;
37
38
end Behavioral;


Das Signal CLK wird ja nicht als eine Kopie sondern direkt der Procedure 
übergeben. Dann verstehe ich das Problem nicht. Denn wenn CLK vor sich 
hin taktet merkt dies ja dann auch die Procedure sofort....??

von Klaus F. (kfalser)


Lesenswert?

Die Funktion rising_edge() wartet nicht auf eine ansteigende Flanke, 
sondern detektiert sie nur.
Du musst schreiben :
wait until CLK_int = '1';

Du solltest vielleicht noch ein bischen über VHDL lesen, mir scheint Dir 
ist nicht ganz klar was man mit VHDL macht (oder machen kann).

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Es gibt bestimmte Prozessstrukturen die von der Synthese in bestimmte 
Hardwarestrukturen umgesetzt werden, aber du kannst nicht nach belieben 
VHDL-Statements verschachteln und dann erwarten dass das synthetisierbar 
ist. Halte dich an die VHDL Grundregeln.

von Florian Scherb (Gast)


Lesenswert?

Hallo

Ich lerne VHDL erst seit ca. 3 Wochen, mir ist vieles noch nicht klar 
und ich lese auch noch viel in Büchern. aber ich suche immer wieder 
kleine Aufgaben an denen ich mich versuchen kann.


...und vieles vergesse ich auch wieder ;) Zum Beispiel, dass rising_edge 
die Flanke ja nur detektiert, stimmt, das hatte ich total vergessen.

Was mir einfach noch große Rätsel aufwirft ist dieser Synthesizer in der 
ISE. Mit dem befinde ich mich bald im Krieg.

Ich habe gleich mal die Zeile "if rising_edge(CLK_int)...." gegen "wait 
until CLK_int = '1';" ersetzt. Da haut mir ISE gleich wieder eine 
Fehlermeldung an den Kopf:

" Wait statement in a procedure is not accepted."

Was soll das schon wieder? Ich hab in meinem schlauen Büchlein 
nachgeschlagen und das meint auch, dass "wait until" Statements in 
Prozeduren erlaubt seien.

Ich verstehs wirklich nicht mehr. VHDL Syntax vs. ISE?

von Philip K. (plip)


Lesenswert?

Was ist daran so schwer zu verstehen? Die Wait-Anweisung ist nicht 
synthetisierbar, wie bereits erwähnt wurde. Mir ist ein Rätsel, warum Du 
das ignorierst und weiter auf der Schiene fahren willst. Mach es doch 
einfach so, wie es funktioniert...

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Die wait-Anweisung ist synthetisierbar, aber nur in einem speziellen 
Fall. Das Verständnisproblem scheint der Unterschied zwischen VHDL als 
Programmiersprache und VHDL als Hardwarebeschreibungssprache zu sein. 
Ich hab das mal versucht im Artikel zu erklären: 
VHDL: VHDL als Hardwarebeschreibungssprache

von Florian Scherb (Gast)


Lesenswert?

Ja die Frage ist ja momentan: Wie funktioniert es?

Ich habe das Ganze ohne Wait Statements wie oben zu sehen entworfen, als 
das nicht funktionierte wurde mir von Klaus Falser vorgeschlagen es mit 
Wait until zu lösen, was nun wieder nicht synthetisierbar ist und daher 
nichts bringt. Ziemlich paradox.

Das Buch welches ich habe macht leider keine unterschiede zwischen 
Simulation und Synthese, es behandelt nur die VHDL Syntax. Deswegen weis 
ich momentan auch nicht wie ich nicht synthesierbare Codes (z.B. das 
Wait until) zu synthetisierbarem Code umschreiben soll.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Lies dir http://www.vhdl-online.de/ ab Kapitel "RTL Style" durch, da ist 
alles erklärt.

von Klaus F. (kfalser)


Lesenswert?

Das kommt daher, dass Du noch nicht begriffen hast, was synthetisierbar 
heißt.

Du solltest Dir ModelSim oder einen anderen VHDL Simulator 
herunterladen, und dort deine Beispielprogramme testen. Das wird 
klappen, weil man im Simulator die volle VHDL Sprache verwenden kann.

Du versuchst Deine Beispiele in ISE zu kompilieren. Das ist ein Programm 
welches VHDL Code in Hardware für ein FPGA umsetzen will.
Dabei wird NICHT die volle VHDL Sprache unterstützt.

Ich weis, dass es nicht einfach ist als Anfänger die Prinzipien von VHDL 
und programmierbarer Logik zu verstehen, aber Du solltest wirklich 
zuerst die Grundlagen lernen. Bei Fragen dazu sind Dir sicher alle gerne 
behilflich, aber es hat keinen Sinn wenn Du mit irgendwelchen 
ausgefallenen Beispielen kommst und nicht verstehst, warum sie nicht 
funktionieren.

von Florian Scherb (Gast)


Lesenswert?

Vielen Dank
Ja ihr habt recht. Habe mir eben die Infoseite "VHDL: VHDL als 
Hardwarebeschreibungssprache" durchgeschaut und zumindest die Grundzüge 
nachvollzogen. Das werde ich noch weiter vertiefen müssen.

Ich wollte den Code bewusst synthetisieren, weil ich ihn auf einem FPGA 
testen wollte. Aber jetzt werde ich erstmal ausführlich noch die 
Syntheseregeln lesen bevor ich mich da dran mache ;)

Danke soweit.

von Morin (Gast)


Lesenswert?

> Was mir einfach noch große Rätsel aufwirft ist dieser Synthesizer in der
> ISE. Mit dem befinde ich mich bald im Krieg.

Im Synthesizer ist vieles nicht erlaubt was in der Simulation geht. Wenn 
du synthetisieren willst, solltest du wait-Statements gleich vergessen 
und mit Clocksynchronen Prozessen arbeiten:
1
process (clk)
2
begin
3
  if resing_edge(clk) then
4
    ...
5
  end if;
6
end process;

Dito solltest du Variablen weglassen, da deren Verhalten eher den Blick 
darauf versperrt, wie die Hardware wirklich funktioniert.

Und die Verzögerungszeiten wie "60 ns" werden vom Synthesizer eh 
ignoriert und durch Zeiten ersetzt die dem grad in den Kram passen.

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.