Forum: FPGA, VHDL & Co. Frage zu Prozessabläufen


von Martin (Gast)


Lesenswert?

Hallo Leute!

Ich benutze die XILINX-Umgebung 7.1i.

Ich habe eine Frage zu Prozessen, nämlich wann wie und warum Prozesse
zu Beginn weglaufen.

Bei folgendem Beispiel habe ich eine Empfindlichkeitsliste.
Der Prozess wird also ausgeführt, wenn sich eine Änderung von
clk oder dir ergibt.
Laut meinen Tests läuft nach dem Flashen der Prozess sofort los,
ohne zu warten bis sich das Signal ändert. Ist der Prozess
das erste Mal durchlaufen wartet er brav bis zum nächsten Mal.
Warum wird der Prozess nach einem Neustart durchlaufen?
p1: process(clk,dir)
begin
...
...
end process


Beim nächsten Beispiel habe ich einen Prozess ohne
Empfindlichkeitsliste realisiert.
p2: process
begin
 wait until clk='1';
...
...
end process

Wenn das Signal clk zu Beginn 0 ist, ist alles in Ordnung.
Der Prozess läuft wirklich erst dann ab, wenn das Signal 1 wird.
Das Problem ist aber, dass wenn das Signal zu Beginn 1 ist,
der Prozess auch nicht wegläuft. Erst dann, wenn das Signal
auf 0 schlägt und danach wieder zurück auf 1. Warum?

Danke für eure Hilfe.

Tschüss, Martin

von alex (Gast)


Lesenswert?

Mit jedem Prozess beschreibt du die Funktion eines digitalen
Schaltkreises, der, so wie du ihn beschrieben hast, mit logischen
Zellen (oder wie sie auch genannt werden) realisiert wird. Nun musst du
genau hinschauen und sich überlegen, ob die reale digitale Schaltung so
funktionieren wird, wie du sie dir vorgestellt hast und ob deine
Vorstellung mit dem übereinstimmt, was du in VHDL beschrieben hast.

von Martin (Gast)


Lesenswert?

Ja schon, aber im Buch steht, wenn man einen Prozess mit
Empfindlichkeitsliste erstellt, also:
p1: process(clk,dir)
..
..
end process p1;

,dann wird der Prozess erst dann ausgeführt, wenn sich entweder
clk oder dir ändert. Wenn jetzt aber während des Flashens und auch
während des Programmstarts, die Signale (clk und dir) permanent stabil
anliegen,
warum wird bei einem neustart des FPGA-Boards dieser Prozess
ausgeführt, obwohl keine Signaländerung besteht?

Gruß, Martin

von ope (Gast)


Lesenswert?

>dann wird der Prozess erst dann ausgeführt, wenn sich entweder
>clk oder dir ändert.

Das ist richtig. Die SIMU ist event basiert, d.h. zB nach clk'event.
Das liegt in der Natur der Simu Programme.
Das andere sind die Synthese Tools, umgangsprachlich compiler evtl.
Diese benötigen keine Sensitivity liste oder waits!

>während des Flashens und auch während des Programmstarts
...
>warum wird bei einem neustart des FPGA-Boards dieser Prozess
>ausgeführt, obwohl keine Signaländerung besteht?

Was macht Dich so sicher, das bei einem Neustart genau dies passiert?
Gemessen in Hardware/PCB oder aus der Simulation entnommen oder gar der
Synthese (prinzipiell nicht möglich)? Unterscheide streng zwischen
diesen 3 Dingen! Bei HDL wie Verilog/VHDL u.a. sind die Regeln andere
als bei PC/uC Programmierung. Nimm Dir mal weitere/andere Bücher zu
Gemüte und versuche erstmal das Prinzip zu verinnerlichen und den
Sprachgebrauch, damit alle von der gleichen Sache reden.

Viele Grüße
Olaf

von alex (Gast)


Lesenswert?

Wenn ich mich nicht täusche, gilt das nur für die Simulationsprogramme,
d. h. der Prozess wird nur dann ausgeführt, wenn sich irgendwas in der
Empfindlichkeitsliste ändert. In der Hardware hast du dann richtige
Signale und richtige Gatter. Also wenn du schreibst "if (clk = '1'
and clk'event)...", hast du in Hardware irgendwo einen getakteten
Eingang und wenn du an diesem Eingang positive Flanke hast, dann werden
z.B. die Daten übernommen. Schreibst du einfach "if (clk = '1')...",
wird höchstwahrscheinlich ein und-Gatter realisiert, und wann ein
und-Gatter aktiv wird und wann nicht, weisst du ja selber...

von alex (Gast)


Lesenswert?

oh, ope war schneller...
:)

von Xenu (Gast)


Lesenswert?

>Laut meinen Tests läuft nach dem Flashen der Prozess sofort los

In einem FPGA "läuft" überhaupt kein Prozess!

Ein "Prozess" ist in VHDL ein syntaktisches Mittel, um damit u.a.
sequentielle Logik zu beschreiben!
Ein Prozess ist kein Programm, dass auf Deinem FPGA "abläuft".

von Martin (Gast)


Lesenswert?

OK!
Im Buch steht, ein Prozess kann aktiviert werden.


Ich hab euch den Code reingestellt. Ich weiß, dass
die Ifs etwas umständlich sind, aber für mich geht es
am Anfang nur ums Verständnis.


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity ifx is
port(inx: in bit;
yout: out bit_vector(3 downto 0));
end ifx;

architecture Behavioral of ifx is
signal y2: bit_vector(3 downto 0):="0000";

begin

xx: process(inx)

begin
  if inx='1' then
  y2(0)<='0';
  else
  y2(0)<='1';
  end if;

  if inx='0' then
  y2(1)<='0';
  else
  y2(1)<='1';
  end if;

end process xx;

yout<=y2;
end Behavioral;


Wenn ich nun ein Programming-File generiere und dieses auf die
Zielhardware, also auf das FPGA-Board runterlade, dann wird
dieser Prozess gleich zu Beginn aktiviert, egal ob sich der
Eingangspin (inx) auf high oder low, aber im statischen Zustand
befinden.
Die Aktivierung des Prozesses kenne ich dadurch, dass
die Bits(y2(0) und y2(1)) sich verändern. Diese Bits
werden mit einer unbedingten Signalzuweisung auf das Ausgangssignal
kopiert.
Natürlich wurde von mir zu diesem Zweck auch ein Assign
der Package-Pins durchgeführt.

Ich habe auch ein Testbench-File geschrieben.
Auch im Simulator ist es so, dass gleich zu Beginn der Prozess
aktiviert wird.


Leute, bitte nicht böse sein, aber ich bin halt noch stark am Lernen
und bin froh, wenn ihr mir weiterhelft, da diese Denkweise
noch ziemlich ungewohnt ist. Dadurch kommt es vor, dass ich ab
und zu mal Begriffe durcheinanderschmeiße.

Danke, Tschüss

Martin

von Xenu (Gast)


Lesenswert?

>Auch im Simulator ist es so, dass gleich zu Beginn der Prozess
>aktiviert wird.

Stimmt und so steht es auch im VHDL-Standard.

Du hast einen Prozess mit Sensitivitätsliste mit dem Signal inx.
Das bedeutet, daß Du ein implizite wait-Anweisung im Prozess hast, und
zwar am Ende des Prozesses:

process(inx)
begin

  .....

  wait on inx;

end process;

Das heisst, das dein Prozess (im Simulator) genau einmal durchlaufen
wird, selbst wenn inx von Anfang an konstant ist und sich nicht
ändert.

Probier mal folgendes aus: Lösch die Sensitivitätsliste weg und
schreibe "wait on inx;" vor dem restlichen Code.
Ausserdem musst Du den Initialisierungswert von y2 weglöschen.
Wenn du dann simulierst, hat y2 den Wert "UUUU" ("unititialized",
nicht initialisiert).

Wenn Du Deinen Code synthetisierst, ist die Sache noch einfacher, denn

es gibt da den Wert 'U' überhaupt nicht. Ein Signal ist immer '0'
oder '1'. Oder evtl. hochohmig ('Z'), falls es ein Treiber ist.

Dein Prozess beschreibt ganz einfache kombinatorische Logik, und das
geht übrigens auch ausserhalb von Prozessen, z.B. so:

 y2 <= "0001" when (inx = '0') else "0010";

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.