Eines vorneweg: warum ist enable durch die Bank rot? Was machst du mit
diesem Signal?
Christian W. schrieb:
> -- HIER IST DAS PROBLEM!
Herzlichen Glückwunsch, du hast die "Latency" entdeckt!
Das Timingverhalten der Simulation ist genau so wie es zu erwarten ist:
wegen des Taktes ändert sich enable. Und deshalb kann erst mit der
nächsten Taktflanke auf diese Änderung reagiert werden. Vor der
weißen Linie ist enable offenbar '0'. Diese '0' wird dann mit der
Taktflanke, die auch den Zustand wechselt, ins lvds_data(2) Flipflop
übernommen. einen Takt später ist vor der Taktflanke enable '1' und es
wird mit dieser Taktflanke diese '1' ins lvds_data(2) Flipflop
gespeichert. Passt also (abgesehen von den vielen roten Stellen im
Timingdiagramm) alles.
Andersrum: im Zustand z0 wird alles für den Zustand z1 vorbereitet,
und im z1 für z2 usw.
Du schreibst es selber, dass im Zustand z6 die Ausgänge des Zustands z0
gesetzt werden:
1 | when z6 => zustand <= z0;
|
2 | -- Ausgänge für Z0
|
und lvds_data(2) ist ein solcher Ausgang. Dort steht also klar: im
Zustand z0 möchte ich gerne einen "Kollisions-Pegel" auf lvds_data(2)
sehen.
Dass daraus letztlich eine '0' wird, steht auf einem anderen Blatt, denn
sowas ist zwar für die Simulation hübsch, bringt dich aber in der
Realität nicht weiter:
Im FPGA gibt es kein 'X', sondern ausschließlich '0' und '1' und
bestenfalls noch 'Z'. Diese Geschichte mit 'X' kann dann zu eigenartigen
Effekten führen. Du solltest auch in der Simulation die Beschreibung
deiner Hardware mit solchen Pegeln machen, die tatsächlich in dieser
Hardware auftreten.
Ein Nachtrag: die Geschichte mit dem unterschiedlichen "Erkanntwerden"
des Signals enable und des clk_display in Relation zum clk_fast findet
sich ausserhalb des geposteten Codes. Wie werden die beiden Takte
clk_fast und clk_display erzeugt? In unabhängigen Prozessen? Worauf sind
die sensitiv, wie werden die angestoßen?