VHDL Anfänger: Wait Statement bei Xilinx ISE??

Gast #806023
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...
Gast #806025
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;
#806043
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
Gast #806092
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"??
Gast #806144
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;
Gast #806323
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 ;)
#806389
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
#806409
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.
Gast #806430
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.
Gast #806910
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.
Gast #807194
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....??
Gast #807467
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?
Gast #807514
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.
#807538
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.
Gast #807554
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.
Gast #807562
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren