Hallo,
ich habe eine digitales Eingangssignal (Data_in) welches asynchron
eingespeist wird. Dieses Eingangssignal habe ich zuerst
Einsynchronisiert für eine Flankenerkennung. Das Eingangssignal hat High
und Lowpegel mit 2 und 4 MHz. Anschließend wollte ich dieses Signal
welches seriell ist, parallel wandeln. Jedoch schaffe ich es nicht
parallel auszugeben. Mein Code ist hier:
Das zweite Problem welches ich habe, ist das von meinem Eingangssignal
(Data_in) zum Beispiel irgendein high Pegel 500ns breit ist. Nach dem
einsynchronisieren aber nicht mehr, da ja hart auf die steigende Flanke
des Clks getriggert wird. Wie kann ich das bewerkstelligen das dass
einsynchronisierte Signal bei dem erwähnten high Pegel auch die 500ns
hat und nicht um 2.5ns verringert wird?
Grüße und vielen Dank euch
Fabian Z. schrieb:> Wie kann ich das bewerkstelligen das dass einsynchronisierte Signal bei> dem erwähnten high Pegel auch die 500ns hat
Warum ist es nötig, dass es hinterher auch noch 500ns hat?
> Das Eingangssignal hat High und Lowpegel mit 2 und 4 MHz.
?
Kannst du das mal aufzeichnen und posten?
Oder du könntest sagen woher das Signal kommt, evtl. findet man dann
eine Doku zum Protokoll.
Oder ist das eine übliche NRZ Codierung, wo der Takt zusammen mit den
Daten übertragen wird?
Ist Dein Weg der richtige?
Üblicherweise sind die Daten eines seriellen Signales, relativ zur
"eigenen" Frequenz oder zu einem externen Träger.
Eine "Einsynchronisierung" - was auch immer das heißt - kann ja nur zu
"Deiner" Frequenz - einer anderen Frequenz wie das Eingangssignal -
erfolgen.
Da sind üblicherweise die Daten futsch. Ausnahme, Du kannst mit vielfach
höherer Frequenz abtasten.
Lothar M. schrieb:> Fabian Z. schrieb:>> Wie kann ich das bewerkstelligen das dass einsynchronisierte Signal bei>> dem erwähnten high Pegel auch die 500ns hat> Warum ist es nötig, dass es hinterher auch noch 500ns hat?
Hm ich hatte Angst das mir irgendwann das Signal wegläuft. Über lange
Zeit gedacht.
>>> Das Eingangssignal hat High und Lowpegel mit 2 und 4 MHz.> ?> Kannst du das mal aufzeichnen und posten?> Oder du könntest sagen woher das Signal kommt, evtl. findet man dann> eine Doku zum Protokoll.> Oder ist das eine übliche NRZ Codierung, wo der Takt zusammen mit den> Daten übertragen wird?
Als Eingangsfolge kommt sowas von einem Messgerät:
100110100110011011100100110101010011010011010011010101001101001101010100
11010011001101001101001100110100110100110011010011 Die ersten 16 sind
Synchronisationsbits dann folgen 288 Datenbits gefolgt wieder von 16
Synchronisationsbits. Dieses will ich auswerten. Man kann die
Datenfolge auch im Bild (Simulation) oben sehen. Data_in ist die
Eingangsfolge vom Messgerät. Ich glaube das geht auch wie ich es oben
versucht habe, jedoch ist das Problem das dass hineinschieben klappt
aber das erkennen mit
if Data_Buffer = "0100110100110011“ then
usw.
nicht.
Fabian Z. schrieb:> Hm ich hatte Angst das mir irgendwann das Signal wegläuft. Über lange> Zeit gedacht.
Natürlich, das wird passieren, wenn du den Empfang nicht zwischendurch
wieder auf die Flanken synchronisierst.
Das ist ein NRZ Signal wie beim RC5 Code. Und so ein Signal bringt mit
jedem Datenbit einen Taktflanke zur Synchronisation mit. Meine
Implementierung dort kann Frequenabweichungen bin zu 25% kompensieren:
http://www.lothar-miller.de/s9y/categories/50-RC-5> Man kann die Datenfolge auch im Bild (Simulation) oben sehen.
Diese da eingelesene Reihenfolge ist Zufall. Sie hängt extrem von den
Samplingzeitpunkten ab. Es klappt zwar irgendwie in der Simulation, weil
du da ein festes und starres, immer gleich wiederkehrendes Bitmuster
hast, es wird aber garantiert in der Realität nicht zuverlässig
funktionieren, wenn du das einfach als Bitstrom einliest und mit einem
festen Wert vergleichst.
Ok super, ich habe mal in deinen Code hineingeschaut und meinen daran
angepasst. Jetzt wollte ich mal einen Simulation Langzeittest machen ob
mir da was wegläuft. Jedoch mache ich in der Testbench was mit der
for-Schleife falsch. Da ich zu Faul war die Bitkette immer wieder zu
kopieren wollte ich diese mit einer Schleife immer und immer wieder neu
einlesen. Geht aber irgendwie nicht. Was mache ich da den falsch?
Andreas F. schrieb:> Warum wird nur bei der Flanke weitergeschoben?
Sinnvollerweise wird sogar nur bei der jeweils gleichen Flanke
geschoben. Sonst hättest du ein Double Data Rate (DDR) Design wo sich
mit jeder Taktflanke was ändert. Und das macht die Sache nicht
einfacher...
Lothar M. schrieb:> Sinnvollerweise wird sogar nur bei der jeweils gleichen Flanke> geschoben.
Das unübersichtliche hier ist das Weiterschalten der Eingangsdaten in
der Bedingungsabfrage. Die gehört nach draußen, da sie eh läuft. Dann:
der TE sollte sich mal fragen, ob er alle Fälle abgefangen hat und wie
man so etwas geschickter in eine TB versetzt.
Aber mal was anderes:
Duke Scarring schrieb:> Es wäre schön, wenn Du compilierbaren Code einstellst:$ vcom tb.vhd
"einstelltest" (Konjunktiv Präsens)
> Model Technology ModelSim SE-64 vcom 10.6c Compiler 2017.07 Jul 26 2017
Ist die 10.6 die aktuelle Version vom SE?
Wenn ich das richtig lese, ist letzten Monat abgelaufen - was kostet
denn aktuell eine Lizenz vom SE?
Mein AG spendiert leider nur die DE, vormalige PE.
Weltbester FPGA-Pongo schrieb im Beitrag #5574655:
>> Model Technology ModelSim SE-64 vcom 10.6c Compiler 2017.07 Jul 26 2017> Ist die 10.6 die aktuelle Version vom SE?> Wenn ich das richtig lese, ist letzten Monat abgelaufen - was kostet> denn aktuell eine Lizenz vom SE?
Aktuell ist 10.7c. Aber seit Jahren sind da für mich keine nennenswerten
Features hinzugekommen, wie z.B. die Unterstützung für SystemVerilog.
Außerdem darf man dann sicher wieder den Lizenzserver updaten und ggf.
das System auf dem dieser läuft gleich dazu.
Der Academicpreis (pro Jahr) liegt in der Höhe eines mittleren
FPGA-Evalboards.
Duke