Hallo zusammen,
ich habe folgend dargestellten Automat in VHDL beschrieben, welcher
soweit auch funktioniert. Allerdings ist es so, dass z.B. bei
Signalwechsel von "btnci" die Schritte zwischen 0 und 2 hin- und
hertoggeln. Ich hatte dies vorher mit einer SPS simuliert, wo dies
logischerweise genauso ist. Meine Idee nun: "btnci", "split" und "csz"
(allesamt Signale, die über Taster eingebunden werden) zu entprellen und
anschließend nur einen kurzen Impuls an die Bausteine der Halteglieder
zu übergeben. Ich habe schon mehrere Versuche unternommen, dies zu
realisieren, jedoch ohne Erfolg bisher (meinen letzten Versuch habe ich
mal auskommentiert stehen lassen). Vielleicht kann mir diesbezüglich
jemand helfen. Anbei der VHDL-Code des Automaten:
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
4
entityAutomatis
5
Port(clock:inSTD_LOGIC;--CPU-Clock
6
csz:inSTD_LOGIC;--Taster csz
7
btnci:inSTD_LOGIC;--Taster btnci
8
split:inSTD_LOGIC;--Taster Split
9
st0_out:outstd_logic;--Test-LED Zustand 0
10
st1_out:outstd_logic;--Test-LED Zustand 1
11
st2_out:outstd_logic;--Test-LED Zustand 2
12
st3_out:outstd_logic;--Test-LED Zustand 3
13
st4_out:outstd_logic);--Test-LED Zustand 4
14
endAutomat;
15
16
architectureBehavioralofAutomatis
17
18
signalhold1:std_logic:='0';--Halteglied H1
19
signalhold2:std_logic:='0';--Halteglied H2
20
signalhold3:std_logic:='0';--Halteglied H3
21
signalhold4:std_logic:='0';--Halteglied H4
22
signalst0:std_logic:='0';--Zustand 0
23
signalst1:std_logic:='0';--Zustand 1
24
signalst2:std_logic:='0';--Zustand 2
25
signalst3:std_logic:='0';--Zustand 3
26
signalst4:std_logic:='0';--Zustand 4
27
signalbtnci_var:std_logic:='0';--Variable btnci an Halteglieder
Also, wie ich das sehe, muss an die Sache gezielter herangegangen
werden. Ich habe das ganze eben nochmal mit Hilfe einer SPS simuliert
und an den Stellen, an denen "btnci" und "split" auf ein High-Signal
abgefragt werden, eine Abfrage für die steigende Flanke vorangeschaltet.
Ich denke, so müsste das auch auf das FPGA mit Hilfe von vhdl übertragen
werden. Die Tasten müssen wohl trotzdem entprellt werden.
Für Tipps und kurze Codebeispiele wäre ich sehr dankbar.
Gruß
Daniel
Daniel L. schrieb:> Also, wie ich das sehe, muss an die Sache gezielter herangegangen> werden.
vor allem sollte mal die Funktion getakteter Schaltungen verstanden
werden. So hat man einen Würfelautomaten.
@ Daniel
Die Frage ist für mich in mehrerlei Hinsicht sehr widersprüchlich.
Ich würde mir den Kontext zu wissen wünschen, ehe ich überhaupt anfange
zu überlegen Hilfe zu leisten. Dazu eine Darstellung der grundlegenden
Überlegungen zur Übertragung von SPS Programmen in VHDL und zu
synchronen und asynchronen Automaten.
P.S. Und vernünftig Einrücken wäre auch nett.
P.P.S. Wie viele Warnungen gibt eigentlich dieser Code?
P.P.P.S. Guck mal das STL-Schema an.
Danke erst einmal für die Antworten. Grund ist folgender: Ich möchte
eine Stoppuhr realisieren, die auf Grundlage des vorhandenen Automaten
ihre Funktionalität erhält. Jeder Zustand soll später mit Leben gefüllt
werden.
@Lothar: Deine Seite mit einigen Programmbeispielen habe ich schon
gefunden, aber anscheinend fehlt mir noch ein wenig das Verständnis für
die Abläufe in der Digitaltechnik. Unter einsynchronisieren sollte ich
doch an dieser Stelle verstehen, dass die Eingänge zeitgleich mit jedem
CPU-Takt ihren Zustand übergeben, richtig?
Fakt ist, dass ich in folgenden Situationen das genannte toggeln habe,
wenn die Weiterschaltbedingungen erfüllt sind:
Zustand 0 -> Zustand 2 und umgekehrt sowie Zustand 2 -> Zustand 3 und
umgekehrt.
Daniel L. schrieb:> Fakt ist, dass ich in folgenden Situationen das genannte toggeln habe,> wenn die Weiterschaltbedingungen erfüllt sind:> Zustand 0 -> Zustand 2 und umgekehrt sowie Zustand 2 -> Zustand 3 und> umgekehrt.
Diesen "Automaten" ohne Takt, den du da gepostet hast, ist letztlich nur
eine kombinatorische Schleife. Die "Halteglieder" sind irgendwelche
Latches.
Sieh dir nochmal an, wie z.B. Ich solche Automaten schreibe. Du wirst
sehen: da muss ein Takt dabei sein, denn sonst macht der Synthesizer
kein Flipflop draus.
BTW mit den [vhdl] Tags um den Code gibt's Syntaxhighlighting gratis.
Das heißt, ich muss meinem Automaten folgende Zeile voranstellen, sodass
alles ausschließlich mit dem CPU-Takt ausgeführt wird?
wait until rising_edge(clock);
Im Prinzip ja.
Dann brauchst du auch keine Sensitivliste mehr, bzw. du darfst keine
mehr verwenden, weil so ein wait until ja nichts anderes als eine
explizit ausformulierte "Sensitivliste" ist.
Es heißt aber noch viel mehr. Denn es heißt, dass dir noch nicht ganz
klar ist, wie und warum so ein Automat funktioniert und dass du allem
voran erstmal daran arbeiten solltest.
Denn man kann einen Automaten auf zig verschiedene Arten beschreiben,
wenn man weiß, wie er aufgebaut ist und was er zu tun hat.
Ich werde mal weiterlesen bezüglich Sensitivliste usw.. Habe hier auch
schon den einen oder anderen passenden Beitrag zu gefunden.
Allerdings ist es interessant, wirklich mal hinter die Kulissen zu
blicken. Denn in der SPS funktioniert der Automat mit wenigen Änderungen
im Funktionsplan einwandfrei. Um die Taktzuordnung und weitere Dinge,
die hintergründig ablaufen, muss man sich bei einer Sps ja kaum Gedanken
machen.
Daniel L. schrieb:> Denn in der SPS funktioniert der Automat mit wenigen Änderungen im> Funktionsplan einwandfrei
In der SPS sorgt auch das Drumrum (die
Eingangsabbild-Verarbeitung-Ausgangsabbild-Geschichte) dafür, dass
dieser Automat getaktet ist.
Du machst mit VHDL aber eben keine SPS und solltest daher ein Bild
eine Skizze oder eine Vorstellung deiner Schaltung haben, die du mit der
HardwareBESCHREIBUNGssprache VHDL beschreiben willst.
Insofern ist die SPS Denkweise für FPGAs eben nicht 100% passend...
> Denn in der SPS funktioniert der Automat mit wenigen Änderungen im> Funktionsplan einwandfrei
Zum Debuggen einer VHDL-Beschreibung nimmt man üblicherweise einen
entsprechenden Simulator. Und gibt darin Signale mit einer Testbench
vor.
Den Automatengraph, das Signal-Zeit-Diagramm sowie eine
Zustandsübergangstabelle bilden die Grundlage für den geposteten Code.
Diese kann ich gerne nachher mal einstellen, wenn es hilft. Werde mich
auf jeden Fall weiter schlau machen.
Daniel L. schrieb:> Den Automatengraph, das Signal-Zeit-Diagramm sowie eine> Zustandsübergangstabelle bilden die Grundlage für den geposteten Code.
Trotzdem musst du wissen, wie der Synthesizer gerne einen Automaten
beschrieben hätte, damit er das daraus macht, was du willst...
> Den Automatengraph, das Signal-Zeit-Diagramm sowie eine> Zustandsübergangstabelle bilden die Grundlage für den geposteten Code.
Korrekt wäre dieser Ansatz: diese Unterlagen bilden die Anforderungen an
die Schaltung, die du mit VHDL beschreiben musst, um das gewünschte
Verhalten zu erreichen.
Sachen wie das Einsynchronisieren oder Entprellen von Eingängen gehören
letztlich dann "einfach dazu". D.h. sie müssen für eine zuverlässige
Funktion in die Beschreibung rein, auch wenn sie nicht explizit
gefordert sind. So wie eine zuverlässige Spannungsversorgung nötig ist,
auch wenn das nirgendwo steht.
Du hast Recht Lothar, der Synthesizer macht laut Elaborated Design
Latches daraus.
Edit: Nach Einfügen des Taktes sind D-FFs aus den Latches geworden.
Allerdings bleibt das Problem, dass ich eben die Tasten entprellen und
das Signal so an die Halteglieder weiterleiten muss, dass bei einem
Tastendruck lediglich EIN Zustandswechsel erfolgt. Diese Toggelei nervt
ganz schön...
Daniel L. schrieb:> Allerdings bleibt das Problem, dass ich eben die Tasten entprellen und> das Signal so an die Halteglieder weiterleiten muss, dass bei einem> Tastendruck lediglich EIN Zustandswechsel erfolgt.
Naja, ein "Problem" ist das ja nun nicht. Eigentlich eher ein kleiner
Dreizeiler pro Taster... ?