Hallo,
ich baue mir gerade einen Prozess, womit ich einen
Initialisierungsvorgang realisieren moechte.
Nun weiss ich nicht, wie ich den Prozess kontrolliert starten kann. Ich
moechte, dass er bei einer Flanke anlaeuft und einmal durchlaeft und
dann stehen bleibt. Ich frage mich ob ich das in dem Prozess realisieren
kann, oder ob ich eine externe Schalung benoetige, die mir aus eine
Flanke ein Dauersignal generiert und das dann als Enable verwendet wird.
Was passieren soll wenn die Flanke waerend des Prozesses kommt, ist
erstmal egal, kann neu anlaufen oder auch ignoriert werden waerend der
Laufzeit des Prozesses.
Mark W. schrieb:> Nun weiss ich nicht, wie ich den Prozess kontrolliert starten kann. Ich> moechte, dass er bei einer Flanke anlaeuft und einmal durchlaeft und> dann stehen bleibt.
Du denkst zu sehr wie ein "Softwareprogrammierer" (auch die Beschreibung
in diesem Prozess sieht ganz danach aus...)
Ein "Prozess" in VHDL beschreibt eine Hardware, die in LUTs und
Flipflops realisiert wird und immer da ist. Die FSM, die deine
Beschreibung darstellt, wird nach dem Laden des FPGAs, bei dem der
Zähler sowie wahrscheinlich auch X und Y mit 0 initialisert werden (das
darf der Synthesizer laut deiner Beschreibung aber handhaben wie er
will, denn du definierst X und Y erst ab dem 11. Takt). Dann zählt der
Zähler mit jedem Takt eins hoch und die Vergleicher lösen bei
bestimmten Zählerständen bestimmte Aktionen aus. Ab dem 31. Takt bleiben
X und Y dann auf '1' stehen.
> waerend der Laufzeit des Prozesses.
Die "Laufzeit" eines Prozesses (also ab Aktivierung durch eine
Signaländerung in der Sensitivliste) ist theoretisch 0. In der Praxis
kommt der Takt, dann herrscht Hektik in der Logik, die rechtzeitig vor
dem nächsten Tkat beendet sein muss.
> Was passieren soll wenn die Flanke waerend des Prozesses kommt
Weil die Laufzeit des Prozesses 0 ist (die simulationszeit bleibt
einfach stehen), kann keine zweite Flanke während der Berechnung des
Prozesses auftreten...
BTW: was hat die gepostete Code Beschreibung eigentlich mit deiner
Aufgabe zu tun?
Lothar M. schrieb:>> BTW: was hat die gepostete Code Beschreibung eigentlich mit deiner> Aufgabe zu tun?
Das ist ein Prototyp meiner Ablaufsteuerung. :-)
Funktioniert auch schon halbwegs. Ich moechte verschiedene Signale
setzen um andere Hardware zu initialisieren.
Also:
Enable Signale setzen
Reset Signale setzen
Addressdaten setzen
usw.
Und das in einer bestimmten zeitlichen Abfolge. Deswegen der
Zaehlprozess. Es genuegt wenn ich die Zahlstufen als Taktzyklen
bestimme, denn ich weiss immer wan ich welche Signale setzen muss. Das
muss einmal bei einem Tastendruck durchlaufen und stehen bleiben.
Mark W. schrieb:> Und das in einer bestimmten zeitlichen Abfolge.
Ich würde das anders machen. Mit einer FSM und einem Zähler/Timer, der
für den jeweils nächsten Zustand neu geladen wird. Den Zuständen in der
FSM kann man sprechende Namen geben und muss nicht mit "Magic Numbers"
herumhantieren.
Denn dann könnte ich neben dem stupiden geradlinigen zeitlichen Ablauf
auch leicht eine Reaktion auf ein anderes z.B. von aussen kommendes
Signal (z.B. ein Endschalter) in diese FSM einbauen. So könnte ich ganz
leicht in den Ablauf des Kaffeeautomaten mit der Beschreibung FSM0b aus
dem Beitrag "Re: Hilfe für Code - VHDL" eine Wartezeit
einbauen.
Oder ich kann mit dieser FSM ganz einfach eine Zeit mittendrin um 5
Takte verlängern, ohne alle nachfolgenden Zeiten entsprechend anpassen
zu müssen...
Mark W. schrieb:> Also:> Enable Signale setzen> Reset Signale setzen> Addressdaten setzen> usw.>
Warum tut man sich das an, das mit Logik machen zu wollen? Zeitkritisch,
sehr schnell oder was fuer Gruende sprechen dafuer?
wendelsberg
wendelsberg schrieb:> Mark W. schrieb:>>> Also:>> Enable Signale setzen>> Reset Signale setzen>> Addressdaten setzen>> usw.>>> Warum tut man sich das an, das mit Logik machen zu wollen? Zeitkritisch,> sehr schnell oder was fuer Gruende sprechen dafuer?
Naja, ich habe mir erst ueberlegt eine CPU oder sowas zu nehemn, aber
das habe ich dann schnell aufgegeben, ist vermutlich ovekill.
Dann habe ich es mit einer FSM gemacht, hat auch funktioniert.
Dann habe ich mir gedacht, man kann die "case when" ja auch rausnehemn
um die Sache zu vereinfachen.
Jetzt will ich nur noch den Startimpuls einbauen und nach einmaligem
Durchlaufen zuruecksetzen.
Wenn das nicht klappt, gehe ich wieder zurueck zur FSM.
Mark W. schrieb:> Nun weiss ich nicht, wie ich den Prozess kontrolliert starten kann. Ich> moechte, dass er bei einer Flanke anlaeuft und einmal durchlaeft und> dann stehen bleibt.
1
-- läuft einmal, bleibt dann stehen
2
process(clk)
3
variablestate:integerrange0to2:=0;-- default 0
4
begin
5
ifrising_edge(clk)then
6
ifreset='1'then
7
-- irgendwas resetten falls notwendig
8
state:=0;
9
else
10
casestateis
11
when0=>
12
iftrigger='1'then
13
state:=1;
14
endif;
15
when1=>
16
-- einmalig irgendwas machen
17
state:=2;
18
when2=>
19
-- bleibt für immer in 2
20
whenothers=>
21
state:=0;
22
endcase;
23
endif;
24
endif;
25
endif;
oder sowas:
1
-- läuft einmal, bleibt dann stehen
2
process(clk)
3
variableflag:std_logic:='0';
4
begin
5
ifrising_edge(clk)then
6
ifreset='1'then
7
-- irgendwas resetten falls notwendig
8
flag:='0';
9
else
10
iftrigger='1'andflag='0'then
11
-- einmalig irgendwas machen
12
flag:='1';
13
endif;
14
endif;
15
endif;
16
endif;
Die erste Version ist halt eine Statemachine - muss man entscheiden,
welche Variante man eher braucht.
du kannst statt Variablen auch Signale verwendet - Variablen werden ja
von Leuten, die damit nicht umgehen können, verteufelt ;-)
Mampf F. schrieb:> Variablen werden ja von Leuten, die damit nicht umgehen können,> verteufelt ;-)
Ich nehme gerne Variablen. Nur Anfänger fallen damit gern auf die Nase,
weil sich diese Variable eben wie eine VHDL-Variable, und somit nicht
wie von ihnen erwartet verhält... ?
Ich habe jetzt eine SM genommen und bin jetzt soweit, dass es
funktioniert wie ich mir das vorgestellt habe. Jedenfalls in der
Simulation erstmal.
Alles States werden durchlaufen und in der letzten State wird auf das
Startsignal gewartet.
Wenn das kommt, geht es wieder von vorne los.
Lothar M. schrieb:> Mampf F. schrieb:>> Variablen werden ja von Leuten, die damit nicht umgehen können,>> verteufelt ;-)> Ich nehme gerne Variablen. Nur Anfänger fallen damit gern auf die Nase,> weil sich diese Variable eben wie eine VHDL-Variable, und somit nicht> wie von ihnen erwartet verhält... ?
Ach und weil man sich - bei suboptimaler Verwendung - recht schnell das
Timing kaputt machen kann, weil man zuviel in einen Clock-Cycle packen
kann^^ :)
Mampf F. schrieb:> Lothar M. schrieb:>> Mampf F. schrieb:>>> Variablen werden ja von Leuten, die damit nicht umgehen können,>>> verteufelt ;-)>> Ich nehme gerne Variablen. Nur Anfänger fallen damit gern auf die Nase,>> weil sich diese Variable eben wie eine VHDL-Variable, und somit nicht>> wie von ihnen erwartet verhält... ?>> Ach und weil man sich - bei suboptimaler Verwendung - recht schnell das> Timing kaputt machen kann, weil man zuviel in einen Clock-Cycle packen> kann^^ :)
Danke fuer Eure Tips, werde mit Variablen vorsichtig umgehen. :-)
VHDL soll ja eine Sprache fuer Hardware sein, dafuer sind die Elemente
aber sehr an Software angelehnt.
Beispiel: Process
Ein Prozess ist ja gerade etwas, was T>0 braucht, sonst waere es ja kein
Prozess. Man haette vielleicht unit oder design unit fuer parallele
Ausfuehrung nehmen koennen und process fuer zeitliche Abfolgen.
Mark W. schrieb:> dass es funktioniert wie ich mir das vorgestellt habe.
Mir erscheint das Handling des Zählers jetzt unnötig umständlich. Warum
muss der immer mal wieder zwischendurch anhalten, wenn der Zustand
weitergeschaltet wird? Damit hast du wieder blitzartig so einen
"Off-Bay-One" Effekt an der Backe (die Zustände werden jetzt jeweils für
11 Takte gehalten, obwohl die Zahlen 10,20,30 etwas anderes vermuten
lassen...).
Mein Ansatz wäre so:
1
:
2
:
3
signalc:integerrange0to9:=9;
4
typestate_typeis(Idle,S1,S2,S3);
5
signalstate:state_type:=S1;
6
7
begin
8
9
process(CLK)-- nur CLK relevant
10
begin
11
ifrising_edge(CLK)then
12
ifc>0then
13
c<=c-1;
14
endif;
15
casenext_stateis
16
whenIdle=>
17
ifc=0andST='1'then
18
next_state<=S1;
19
Y<='0';
20
Z<='0';
21
c<=9;
22
endif;
23
whenS1=>
24
ifc=0then
25
next_state<=S2;
26
Y<='0';
27
Z<='1';
28
c<=9;
29
endif;
30
whenS2=>
31
ifc=0then
32
next_state<=S3;
33
Y<='1';
34
Z<='0';
35
c<=9;
36
endif;
37
whenS3=>
38
ifc=0then
39
next_state<=Idle;
40
Y<='1';
41
Z<='1';
42
c<=9;
43
endif;
44
endcase;
45
endif;
46
endprocess;
47
:
48
:
Und dann gäbe es noch die von mir bevorzugte Variante, die einfach einen
Zähler hochzählt und über den Index die Werte abbildet:
1
:
2
:
3
signalc:integerrange0to9:=9;-- bei Integern immer den Bereich angeben, sonst kann der Simulator bei einem Überlauf nicht meckern
Mark W. schrieb:> VHDL soll ja eine Sprache fuer Hardware seinVHDL ist eine Hardware-Beschreibungs-Sprache.
> dafuer sind die Elemente aber sehr an Software angelehnt.
Nur für den, der vorher Software gemacht hat.
> Beispiel: Process> Ein Prozess ist ja gerade etwas, was T>0 braucht, sonst waere es ja kein> Prozess.
??? Mir erschließt sich die Logik nicht...
Die Anweisungen in einem Prozess werden vom simulator per Definition
in der Zeit 0 berechnet. Denn das Hauptproblem von
Softwareprogrammierern ist, zu meinen, ein Prozess würde wie ein
Programm Schritt für Schritt "durchlaufen" und "abgearbeitet". Dem ist
aber nicht so.
> Man haette vielleicht unit oder design unit fuer parallele> Ausfuehrung nehmen koennen und process fuer zeitliche Abfolgen.
Es gibt keine zeitlichen Abfolgen. Jeder zeitliche Ablauf muss in einen
Zustandsautomaten gepackt werden. Und dann gibt es einen Takt, der dafür
sorgt, dass der Zustandsautomat weitergeschaltet wird (auch ein simpler
Zähler für ein Delay ist ein Zustandsautomat).
Und jeder Zustand des Prozesses samt nachgeschalteter Logik ist
"parallel" auf dem FPGA vorhanden. Nur eben ggfs. nicht aktiv. Insofern
ist diese Unterscheidung "parallele Hardware" und "zeitlicher Ablauf"
nur in deinem Kopf. Im FPGA sind das alles nur LUTs und Flipflops. Mehr
"Bauteile" hast du für deine Hardware-Beschreibung nicht zur
Verfügung...
Lothar M. schrieb:
...
Die Zahlen 10, 20, 30 sind nur beispielhaft, genau wie die Ausgaenge Y
und Z, um die Sache gering und einfach zu halten. Sie sollten aber
variabel einstellbar sein.
Danke fuer das Beispiel, ich werde es mir mal ansehen und ausprobieren.
Lothar M. schrieb:>> Beispiel: Process>> Ein Prozess ist ja gerade etwas, was T>0 braucht, sonst waere es ja kein>> Prozess.> ??? Mir erschließt sich die Logik nicht...
Meinem Verstaendniss nach ist eine Prozess eine zeitliche Abfolge von
Schritten. Ich brauchte einen Prozess, eine Art Ablaufsteuerung,
aehnlich wie bei einer SPS oder Aehnlichem.
Also genau das was eine FSM macht mit Hilfe des Taktes und Bedingungen.
Zuerst tue dies, dann jenes und zum Schluss warte...
So langsam erschliesst es sich mir, aber nur sehr langsam. :-)
Mark W. schrieb:> Meinem Verstaendniss nach ist eine Prozess eine zeitliche Abfolge von> Schritten. Ich brauchte einen Prozess, eine Art Ablaufsteuerung,> aehnlich wie bei einer SPS oder Aehnlichem.
Du darfst nicht versuchen, allgemeine Begriffe aus irgendwelchen anderen
Welten (SPS oder ähmlichen) auf ein völlig neues Tätigkeitsfeld
(Hardwarebeschreibung) zu übertragen.
Mark W. schrieb:> Ich brauchte einen Prozess, eine Art Ablaufsteuerung, aehnlich wie bei> einer SPS oder Aehnlichem.
Abläufe werden mit FSM gesteuert. Auch in der SPS. Nur heißen die dort
"Schrittketten", die Zustände werden mit "Merkern" abgebildet usw. usf.
Mark W. schrieb:> Meinem Verstaendniss nach ist eine Prozess eine zeitliche Abfolge von> Schritten. Ich brauchte einen Prozess, eine Art Ablaufsteuerung,> aehnlich wie bei einer SPS oder Aehnlichem.> Also genau das was eine FSM macht mit Hilfe des Taktes und Bedingungen.> Zuerst tue dies, dann jenes und zum Schluss warte...> So langsam erschliesst es sich mir, aber nur sehr langsam. :-)
Nope ...
Es gibt auch kombinatorische Prozesse:
1
process(a,b)
2
begin
3
c<=aandb;
4
endprocess;
das wird einfach in eine und-Verknüpfung umgesetzt.
genauso ginge auch
1
c<=aandb;
Prozesse können eine andere Syntax nutzen, aber die gleiche Hardware
erzeugen.
Beispiel:
1
-- klar, ist ein trivial-beispiel^^
2
c<='1'whena='0'else'0';
3
4
process(a)
5
begin
6
ifa='0'then
7
c<='1';
8
else
9
c<='0';
10
endif;
11
endprocess;
if-then-else oder case funktionieren nur in Prozessen zB.
zu 99% verwende ich Prozesse nur für getaktete Logik ´ala
1
process(clk)
2
begin
3
ifrising_edge(clk)then
4
ifreset='1'then
5
...
6
else
7
...
8
endif;
9
endif;
10
endprocess;
und zu 99.99999999% nur 'clk' in der Sensitivity-List der Prozesse (löst
schonmal viele Probleme^^).
Kombinatorisches Zeugs ohne Prozess - außer die anderen
Syntax-Möglichkeiten bringen mir Vorteile. Das ist aber eher selten der
Fall.
Beispiel hier:
Da ist ein Prozess für das 'for-loop' schön ... Ginge mit 'generate'
auch ohne ... aber mei, Geschmackssache^^
Das ist eigentlich so der Brain-F**k, den man bei VHDL nie so wirklich
los bekommt ... welche Syntax sind innerhalb Prozesse erlaubt, welche
Außerhalb xD