Nach dem was in den Bücher gelesen habe, läuft die Bearbeitung im
Process sequenziell. D.h das was in der "if" Anweisung doch auch: also
es wird zuerst Data(edgCnt) ausgegeben dann EdgCnt incrementiert?
Stimmt das oder habe ich es doch falsch verstanden?(oder denke ich
wieder in Software!!)
Vielen Dank für Erklärung
VHDL Anfänger schrieb im Beitrag #2666671:
> D.h das was in der "if" Anweisung doch auch: also> es wird zuerst Data(edgCnt) ausgegeben dann EdgCnt incrementiert?
Das wird nach der fehlerkorrektur von
> (sck'event and (event='1')
im FPGA einfach gleichzeitig passieren, weil beide/alle Flipflops mit
dem selben Takt angeseuert werden. Nur der Simulator, der arme Knabe
muss die einzelnen Schritte nacheinander rechnen, deshalb sieht das da
sequentiell aus.
> Stimmt das oder habe ich es doch falsch verstanden? (oder denke ich> wieder in Software!!)
Ja, ja, und ja.
Das Problem liegt da:
> Nach dem was in den Bücher gelesen habe
Diese Anweisungen sind concurrent/gleichzeitig, und es ist klar, was in
der Hardware daraus gemacht wird:
1
architectureBehavioralofirgendwasis
2
begin
3
out1<=in2;
4
out2<=in1;
5
endBehavioral;
Das sind einfach zwei Verbindungen zwischen Pins.
Und hier die sequentielle Beschreibung:
1
architectureBehavioralofirgendwasis
2
begin
3
process(in1,in2)begin
4
out1<=in2;
5
out2<=in1;
6
endprocess;
7
endBehavioral;
Wird da jetzt "zuerst" out1 oder out2 aktualisiert, oder sind das auch
nur simple und einfache Drähte zwischen ein paar Pins?
> variable EdgCnt : integer := 0;
Super, wieder mal: Anfänger und Variable...
Beitrag "Variable vs Signal"
Wenn hier EdgCnt als signal definiert ist, dann wird "EdgCnt > 4" erst
beim nächsten SCK (ein Zyklus später) erkannt, als variable geht sie
sofort in der if Anweisung?
Wie kann man das geliche mit "signal EdgCnt" realisiergen
Also das ganze ist für den Empfang eines Telegram der Länge zwischen 4
und 36 bits (cmd(4)+LedNr(8)+data(24)), es müssen nicht alle drei Teile
kommen (cmd, Cmd+LedNr oder cmd+LedNr+Data), daher habe ich in state
machine: GET_CMD, GET_LEDNR,GET_DATA,.. ich zähle die sck Flanken, dann
wechsele ich zur nächsten state. ein Execute signal gibts auch, hier
beende ich den Empfang und analysiere ich die das Telegram.
Sck ist der Clock der SPI, und es gibt ein clk_25MHZ wo state <=
NextState gibt, also mindestens zwei Prozesse.
VHDL Anfänger schrieb im Beitrag #2667501:
> Sck ist der Clock der SPI, und es gibt ein clk_25MHZ wo> state <= NextState gibt, also mindestens zwei Prozesse.
Na hoffentlich hast du den NextState dann auch hübsch in die andere
Taktdomäne einsynchronisiert...
VHDL ANfänger schrieb im Beitrag #2667570:
> Was meinst du mit hübsch?
Mindestens 2 Flipflops. Das ist hübsch. Zum Hintergrund:
http://www.lothar-miller.de/s9y/archives/64-State-Machine-mit-asynchronem-Eingang.html
ABER: Zustände, die i.A. aus mehreren Flipflops aufgebaut sind, lassen
sich so auch nicht synchronisieren. Denn das wäre ein paralleler Bus,
für den ein Synchronisierungsmechanismus ganz anders aussehen muss!
Wenn nämlich die "erste" Flipflopstufe falsche Pegel gespeichert hat,
dann wird an die 2. Stufe dieser falsche Zustand weitergegeben. Nimm mal
eine FSM mit 4 Zuständen, die One-Hot codiert sind, dann darf immer nur
1 Zustand aktiv sein. Hier z.B. der s2:
s1 0
s2 1
s3 0
s4 0
Wenn jetzt der NextState also gerade von 0010 nach 0100
weiterschaltet und zudem ein SYNCLK kommt, dann kann es sein, dass
im State das neue 0100 ankommt (ist ok), oder auch das alte 0010 (ist
auch ok) oder auch fehlerhafte 0110 oder 0000.
Weshalb? Siehe oben: Laufzeitunterschiede zu den 4 Flipflops...
Kurz&Gut: so wie du es gemacht hast, haut es dich auf jeden Fall recht
bald ab und zu auf die Nase...
Meine FSM habe ich eigfentlich so aufgebaut wie in FSM Beispiel im VHDL
Synthese Buch.
>ABER: Zustände, die i.A. aus mehreren Flipflops aufgebaut sind,
ist hier NextState gemeint? da sie in einem Prozess geschrieben und im
anderen gelesen wird?
>lassen sich so auch nicht synchronisieren. Denn das wäre ein paralleler >Bus,für
den ein Synchronisierungsmechanismus ganz anders aussehen muss!
Wie kann ich es denn verbessern/FSM Fehler vermeiden?
VHDL Anfänger schrieb im Beitrag #2667427:
> Wie kann man das geliche mit "signal EdgCnt" realisiergen
Indem du dir klarmachst, was eine Variable eigentlich ist: Ein
Logiksignal, in deinem Fall (innerhalb des process) der Eingang eines
FFs, nicht der Ausgang
Und wie baut man ein Logiksignal? z.B. mit einer Concurrent Anweisung,
also z.B. edgcnt_new <= edgcnt + 1;
Und dann im process halt edgcnt_new abfragen...
Oder einfaches so wie Klaus es beschrieben hat
VHDL Anfänger schrieb im Beitrag #2667615:
>>ABER: Zustände, die i.A. aus mehreren Flipflops aufgebaut sind,>>lassen sich so auch nicht synchronisieren> ist hier NextState gemeint? da sie in einem Prozess geschrieben und im> anderen gelesen wird?
Ja.
>> Denn das wäre ein paralleler Bus,für>> den ein Synchronisierungsmechanismus ganz anders aussehen muss!> Wie kann ich es denn verbessern/FSM Fehler vermeiden?
Du setzt in deinem "sck"-Prozess nur ein einziges Flipflop, das heißt:
"Übertragung fertig". Und das wird dann auf der "SYNCLK"-Domäne mit
einem (besser 2) Flipflops einsynchronisiert. Und dann mit diesem Signal
der Zustand weitergeschaltet. Denn ein einziges Flipflop kann nie
korrupt sein (mal vom hier belanglosen Thema "Metastabilität"
abgesehen).
>Du setzt in deinem "sck"-Prozess nur ein einziges Flipflop, das heißt:>"Übertragung fertig". Und das wird dann auf der "SYNCLK"-Domäne mit>einem (besser 2) Flipflops einsynchronisiert. Und dann mit diesem Signal>der Zustand weitergeschaltet. Denn ein einziges Flipflop kann nie>korrupt sein (mal vom hier belanglosen Thema "Metastabilität">abgesehen).
Ist es so gemeint?
VHDL Anfänger schrieb im Beitrag #2667672:
> Ist es so gemeint?Proc_1: Process(SYNCLK)> begin> if(SYNCLK'Event and (SYNCLK = '1')) then> if(ueb_Fertig ='1') then> State <= NextState;> end if;> end if;> end Process;
Fast. Du musst ueb_Fertig aber noch einsynchronisieren, denn das ist
asynchron...
1
signaltx_done:std_logic;
2
3
ifrising_edge(SYNCLK)then
4
tx_done<=ueb_Fertig;-- das hier ist das Sync-FF
5
if(tx_done='1')then
6
State<=NextState;
7
endif;
8
endif;
Und: verwende doch die Funktion rising_edge(), denn die kann wirklich
(auch in der Simulation) eine steigende Flanke erkennen...
Kommt auf deine Punkte (...) an.
2) wird nicht gehen, da hier ein dopple-edge flipflop beschrieben.
1) kann gehen, wenn du nicht auf das gleich signal schreibst, sprich
zwei FlipFlops baust.
Zu empfehlen ist keins von beiden.
GRuß
VHDL Anfänger schrieb im Beitrag #2667859:
> ist eine Schreibweise zu empfehlen?
Such mal hier im Forum nach meinen Postulaten...
Die Zusammenfassung: es gibt in einen (Anfänger-)Design nur 1 Takt, das
Design ist nur auf 1 Flanke dieses Taktes aktiv.
franke schrieb:> 2) wird nicht gehen, da hier ein dopple-edge flipflop beschrieben.
Geht evtl. mit Coolrunner II, weil der DDR-FFs im Kern hat...