Forum: FPGA, VHDL & Co. WAIT FOR not supported


von Martin (Gast)


Lesenswert?

Hallo Leute!

Ich möchte nun in der FPGA-Welt (VHDL) Fuß fassen.
Dazu habe ich eine kleine Doku, die mir die Syntax etwas näher bringen
soll.
Da ich mich auch ein Bißchen mit Mikrocontrollern auskenne, gehe ich
immer von diesem Wissen aus und muss deshalb umdenken.

Ich benutze das XilinX ISE 7.1I-Tool für meine ersten Versuche.
Hierzu habe ich ein Board mit einem XC4VFX12.

Um mal ein Signal in einem bestimmten Takt ausgeben zu können, möchte
ich die WAIT FOR - Anweisung benutzen, die in der genannten
Beschreibung vorkommt.

Aber der lustige XILINX-Compiler hustet mir was, da er meint, dass
dieser WAIT FOR - Befehl nicht supported wird.
Ein WAIT; funktioniert, aber das brauch ich zur Zeit nicht.

Wie kann ich das Problem umgehen oder warum wird dieser Befehl nicht
unterstützt, wenn er sogar auf der XILINX-Homepage dokumentiert wird?
Ist XILINX doch keine so gute Wahl gewesen?

Danke für eure Hilfe.

Tschüss

Martin

von Michael (Gast)


Lesenswert?

Hallo

Wait-for gibt es in VHDL nicht - was soll das sein? Was willst du
machen? Du mußt Dir immer im Klaren sein, daß VHDL eine Hardware -
Beschreibungssprache und keine Programmiersprache im herkömmlichen Sinn
ist!
Alles läuft parallel ab. Wenn Du Takte erzeugen willst, mußt Du das mit
Countern, also Flipflops machen.

Lies dich am Besten mal in die Xilinx XST User Manual ein

von Martin (Gast)


Lesenswert?

Hallo!

Ich habe von einem Bekannten ein kleines Beispiel erhalten, welches ich
mir gerade anschaue.

architecture Behavioral of main is
shared variable a: integer;
shared variable b: integer;
shared variable y: integer;
begin

process
begin a:=10;
b:=15;
WAIT FOR 2ns;
a:=9;
b:=7;
wait;
end process;

process begin wait for 1 ns;
y:=a*b;
wait for 1 ns;
end process;

Ich habe eine Doku, die besagt, dass es 3 verschiedene Wait-Anweisungen
gibt.
wait ON signal_name
wait until condition
wait for time_expression

Leider bin ich es gewohnt sequenziell zu denken und darum bin ich
gerade dabei, mich in diese für mich ungewohnte Denkweise
einzuarbeiten. Ich möchte für den Anfang einfach nur ein Programm, mit
dem ich ein Led blinken lassen kann.
Ich weiß, dass im obigen Beispiel keine Outputs definiert sind, aber
das kommt noch. Zur Zeit stehe ich bei (wait for) an.

Wenn ich jetzt eine SPI-Schnittstelle nachbilden möchte, dann muss ich
z.B. ein Clock-Signal generieren, welches die Geschwindigkeit für die
SPI vorgibt. Aus diesem Grund benötige ich hier Wartezeiten, um eine
bestimmte Frequenz zu erhalten.

Tschüss

Martin

von FPGA-User (Gast)


Lesenswert?

WAIT FOR gibt es sehr wohl, es ist nur nicht synthese-fähig,
d.h. man kann es nur für die Simulation verwenden.
Man versetze sich in die Lage des Synthese-Tools:
wie soll man "wait for 2ns" realisieren ? Nich ganz so einfach.

Wenn eine LED blinken soll, dann nimm einfach einen großen
Zähler, z.B. 24 bit und leg die LED auf das MSB des Zählers.

Die WAIT-Anweisungen kann das Synthese-Tool wie gesagt nicht
in Hardware umsetzen.
Du musst versuchen, komplett umzudenken. Vielleicht hilft es Dir,
wenn Du zuerst überlegst, wie man die Funktion aus einzelnen
Logik-ICs aufbauen würde.

von FPGA-User (Gast)


Lesenswert?

wenn Du das folgende Beispiel verstehst und weisst, was
die Synthese daraus machst, hast Du schon einen wichtigen
Unterschied zwischen Mikrocontroller und FPGA verstanden:

process(clk)
begin
   if rising_edge(clk) then

      for i in 15 downto 1 loop
         data(i) <= data(i-1);
      end loop;

      data(0) <= din;
   end if;
end process;

von Schlaubi (Gast)


Lesenswert?

Schieberegister !

von FPGA-User (Gast)


Lesenswert?

Hey Du Schlaubi, nich alles verraten, der Martin wollte dich
selber draufkommen - oder? ;-)

von Schlaubi (Gast)


Lesenswert?

Sorry ! Aber die Antwort brannte mir unter den Fingernägeln. Ich konnte
nicht anders.

von Martin (Gast)


Lesenswert?

Ich glaube ich muss noch viel lernen.
Aber ich verstehe nicht, warum es einen Befehl gibt, den es eigentlich
nicht gibt z.B. WAIT FOR.

Meine Überlegung ist so, wenn ich vorhabe einen bestimmten Befehl zu
benutzen, dann richte ich meine Programmarchitektur nach diesen
bestimmten Befehlen aus.
Ich verstehe nicht, warum es den Befehl gibt, wenn es nicht möglich
ist, diesen in der Hardware zu benutzen. Meiner Meinung nach wäre es
dann besser, wenn es den Befehl überhaupt nicht geben würde, weil dann
die Verwirrung nicht so groß wäre.

Ich habe einen Bekannten, der VHDL auf der Fachhochschule gelernt hat.
Auch die haben in ihren Programmbeispielen, welche sie vom Professor
erhielten, haufenweise das WAIT FOR ohne auch nur den Hinweis bekommen
zu haben, dass dieses Programm nun gar nicht lauffähig ist.

Was sagt ihr dazu?

Tschüss, Martin

von Sssssss (Gast)


Lesenswert?

Hi!

WAIT FOR hat schon seine Berechtigung.

Es ist wie oben geschrieben zwar nicht in Hardware implementierbar aber
durchaus nützlich:

Zum Beispiel hast du einen vhdl Code der irgendein Protokoll
implementiert.
Jetzt wilst du das ganze simulieren um es zu testen.

Das Protokoll gibt meinetwegen vor dass eine leitung 2ns low
sein muss wenn neue Daten anstehen.
Dann schreibst du eine testbench wo meinetwegen etwas wie:

NEW_DATA_OUT <= '0';
wait for 2ns;
NEW_DATA_OUT <= '1';
wait for 200ns;
...

drinsteht.

Du kannst wirklich das komplette "Programm" durchchecken ohne auch
nur
eine einzige Platine anzupacken.

Als ich letztens einen I2C Master geschrieben habe war ich echt
überrascht wie
einfach das debuggen war:
Eine Testbench geschrieben, simuliert und die einzelnen Pins mit dem
Wave Fenster betrachtet.

Ohne Simulation hätte ich einen Logicanalyzer gebraucht und endlos
rumexperimentieren müssen.
Durch den Simulator konnte ich direkt sehen dass ein STOP Command
fehlte.

Zum Thema wait for implementieren:
Wie willst du das in Harware umsetzen ?
Wenn ich schreibe wait for 31ps; welche Hardware soll das umsetzen ?

Aber es stimmt schon, in Univorlesungen wird darauf oft nicht
eingegangen.
Ich war auch erstmal überrascht als mein Code mit wait for ... und
output <= '1' after 2ns; nicht funktionierte g

von Martin (Gast)


Lesenswert?

Danke erstmal für deine Antwort.

Ich habe bitte noch eine Frage:
Also du hast hier das I2C-System simulieren können.
Aber wie schaffst du es dann das Programm auf dem FPGA zum Laufen zu
bringen, wenn diese Befehle danach nicht mehr benutzt werden?
Du benötigst ja trotzdem ensprechende Wartezeiten, um dem Signal
bestimmte Frequenzeigenschaften geben zu können. Wie werden diese
entsprechenden Wartezeiten jetzt realisiert?

Kann man diese Eigenschaften nur durch einen Zähler erreichen?

Tschüss, Martin

von Xenu (Gast)


Lesenswert?

>Wie werden diese entsprechenden Wartezeiten jetzt realisiert?

Takte zählen. Wie beim Mikrocontroller auch.
Je größer die Taktfrequenz desto "feiner" die Zeitauflösung.

von Sssssss (Gast)


Lesenswert?

Hi!


>Ich habe bitte noch eine Frage:
>Also du hast hier das I2C-System simulieren können.
>Aber wie schaffst du es dann das Programm auf dem FPGA zum Laufen zu
>bringen, wenn diese Befehle danach nicht mehr benutzt werden?
Ich habe zwei dateien:
i2c_controller.vhd
i2c_testbench.vhd

i2c_controller.vhd ist mein controller, dort verwende ich nur die
Syntax die man synthetisieren kann.
Dort werden wartezeiten einfahc durch timer behandelt.
Also zb um aus 25mhz input takt ein 100khz clock enable signal zu
machen zähle ich einfach so:

signal count : natural;
signal clk100_en : std_logic;
process(clk)
 begin
  if rising_edge(clk)
   if (count = 250) then
    count <= 0;
    clk100_en <= '1';
   else
    count <= count +1;
    clk100_en <= '0';
   end if;
  end if;
 end process;
(den reset/initkram habe ich weggelassen hier im beispiel)

Die vhdl testbench benutzt dann wait for anweisungen etc um den ganzen
kram zu simulieren.
Dort ist mein Controller einfach eingebunden und die IOs als signals
gemappt.

von FPGA-User (Gast)


Lesenswert?

Hallo Martin,

bei der Entwicklung von VHDL hat man sich eben auch überlegt,
welche Befehle für eine Simulation wichtig sein könnten.
Es reicht ja nicht, Deine Digitalschaltung in VHDL zu beschreiben,
Du musst die Funktion auch per Simulation überprüfen können.

Die Simulation / Verifikation eines VHDL-Designs ist inzwischen
die größte Bremse bei der Entwicklung, das können schon mal 70
Prozent des Gesamtzeitaufwandes sein.

Umso wichtiger, dass die Sprache ausreichend Elemente für eine
effektive Simulation bietet und da gehören die "Zeitbefehle"
wie WAIT... AFTER.... und z.B. Assertions (assert a = b report
"blabla") eben mit dazu, auch wenn man das nicht in Hardware
realisieren kann.

An der UNI kann man nicht erwarten, dass man praxisbezogenes
VHDL lernt, da wird zuviel auf Theorie rumgeritten, die bei
den meisten, einfachen Designs überhaupt nicht benötigt wird.
Viel wichtiger sind m.E. Grundkenntnisse in digitaler Schaltungs-
technik. Wenn man die nicht hat, sollte man damit beim VHDL-
lernen anfangen.

von Henrik (Gast)


Lesenswert?

Das man sich aber nicht immer auf eine Simulation verlassen sollte, habe
ich gestern gemerkt. Bei uns ander Uni gibt es ein FPGA-Praktikum, das
wirklich gut und umfangreich ist.
Gestern haben wir ein einfaches Uhrwerk mit Sek, Min, St, Tag, Woche,
Monat, Jahr programmiert. In der Simulation (Quartus) funktionierte
aber nur die Sekundenanzeige. Der Rest lieferte Müll. Als wir den
Fehler nicht finden konnten, haben wir das Design einfach indas
FPGA-Board geladen, die Taktung beschleunigt, und siehe da, es
funktionierte alles! Dann nochmal das Ganze in Modelsim simuliert und
es kam auch das raus, was wir erwartet haben: ein funktionierendes
Uhrwerk.
Ist der Simulator von Quartus so viel schlechter als Modelsim (ist
beides die kostenlose Version)?

Henrik

von Stephan Walter (Gast)


Lesenswert?

Man sollte immer bedenken, dass VHDL ursprünglich eine Sprache zur
Beschreibung von digitlalen Schaltungen war. Also sowas, was man in
einer Spezifikation lesen kann, bloß in formaler Form. Damals hat noch
niemand daran gedacht, dass man irgendwann VHDL nutzen würde, um das
Design daraus zu synthetisieren.
In einer Verhaltensbeschreibung sind Sprachelemente wie WAIT FOR oder
AFTER sehr wichtig. Zum Beispiel um anzugeben, wie lange vor der
Taktflanke die Daten stabil am Bus liegen müssen, damit sie gültig
sind.
Der Funktion ist das egal. Aus der funtionellen oder RTL Sicht geht man
davon aus, das die Daten gültig sind, wenn der Takt kommt. Aber die
Schaltung, die man daraus synthetisiert ist wieder den physikalischen
Grenzen unterlegen. Und das Model, das man vom Timing Analyzer bekommt
ist dann wieder ein Verhaltensmodel, in das die angenommen
Verzögerungszeiten, Setup und Hold Time usw. einfließen.

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.