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...
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;
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'eventandClk='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_ _SPARTAN3funktionierts bei anderen FPGAs weiss ich's nicht.
mfg GagoSoft
----------------------------------
wer Rechtschreibfehler findet, darf sie behalten, Inhaltliche Fehler
nehme ich gerne zurück
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"??
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
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 ;)
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
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.
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.
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
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.
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
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....??
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).
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.
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?
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...
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
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.
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.
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.
> 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.