mikrocontroller.net

Forum: FPGA, VHDL & Co. Daten mit 2 Takten einlesen?!?


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

nun habe ich eine weitere Frage an das Forum.
Wie kann ich einen seriellen 16 Bit Datenstrom in ein Schieberegister
einlesen, dass folgende Bedingungen erfüllt:
Die seriellen Daten sollen mit einer BCL (Bitclock) eingelesen werden.
Dies soll aber nur dann geschehen, wenn ein Framesync-Takt (FSC)
erfolgt ist. Da innerhalb eines Prozesses nicht zwei Taktabfragen
erfolgen können (ansteigende Flanken beider Clocks), stehe ich nun vor
einem Problem.

Wie kann ich das am Besten realisieren?!?

Für Tipps und Anregungen bin ich sehr dankbar...

Gruß
Tom

Autor: AxelM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hältst du davon, das du eine Statemachine entwickelst, die erst dann
in den nächsten zustand geht, wenn FSC auf hight war. In dem Zustand
wartest du dann auf ein Signal von Bitclock. Die Taktung machst du mit
nem schnellen Takt... oder ist das nicht möglich?( Ist mir nur grad so
auf die schnelle eingefallen).

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, wenn ich das richtig verstehe, kann ich meine 2 gewünschten
Zustände mit der Statemachine realisieren. Einmal die einlesende
Funktion mit dem FSC als Startsignal und der BCL. Nach 16 Bits (also
einem Counter,der 16 BCL Takte zählt) springt die Statemachiene wieder
in den Wartemodus des nächsten FSC-Signals....

...muss ich jetzt mal drüber nachdenken, wie ich die Statemachine
realisiere.... ;-)

Danke für diesen Tipp...

Gruß
Thomas

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Tom

hast Du mal ein Timing von Deinem Eingangssignal als Bild,
Skizze würde auch reichen, dann könnte ich Dir sicher den
VHDL-Code dafür gleich hier reinschreiben

Autor: Tom (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi FPGA-User,

anbei die eine Skizze des Timings
Die BCL-Frequenz beträgt 256kHz. Das entspricht einer Zeitdauer wischen
zwei BCL-Impulsen von 3,90625µs. Die Impulsdauer eines BCL-Taktes
beträbt aber nur 1/6tel der BCL-Zeitdauer, in etwa 651ns.
Ein Datenbit wird innerhalb eines BCL-Taktes ausgegeben, also ein
Datenbit pro 3,90625µs.

Die FSC-Frequenz beträgt 8kHz. Die Impulsdauer des FSC ist identisch
mit der Dauer eines Datenbits, also 3,90625µs.

Vielen Dank vorab für Deine Mühen!!!

Gruß
Thomas

Autor: Oliver Lpo (emperor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi
Ich hab so ein ähnliches Problem auch mal angesprochen.
Hab ein PCM Modul gebastelt, welches mit 32 Timslots a 8 Bit arbeitet.
Bin grad dabei das an einen Microblaze anzubinden, um später damit voip
codes zu testen und evtl. später noch eine Umsetzung auf Lan
vorzunehmen.
Mein Problem war, dass das FSC Signal exakt mit der steigenden Flanke
des Clocksignals auf H geht.Das heißt beim ersten FCS verpass ich das
erste Bit, natürlich nur falls Timeslot 0 ausgewählt wird.
Ansonsten habe ich das im Moment über zwei Processe die sich um die
Start- und Stopbedingung kümmern realisiert.Im Prinzip kannst du
probieren das über globale Variablen zu lösen.
Nicht die schönste Lösung aber bei mir funktionierts.

olli

Autor: Jens D. (jens) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom

wuerde es nicht reichen, wenn du den FSC mit einem RS FlipFlop
speicherst und nach 16 BCL Takten (4Bit zähler) wieder löschst??

Schieberegister:
Auf den SET Eingang vom RSFF dein FSC Signal mit dem BCL per "UND"
verknüpft somit ist der Ausgang nur dann gesetzt, wenn beide Takt da
waren.

den Takt fuer das Schieberegister UND den Counter nimst du dann aus der
Verknüpfung mit: RS-FF-OUT und deinem BCL Signal.

4Bit Counter:
wenn der Counter 16 Takte bekommt setzt er das RS FlipFlop zurück

muesste so in etwa funktionieren

BCL
     _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   
_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_
FSC
      _
_____| |_____________________________________________________________

RS-FF gesetzt
      _____________________________________________________________
_____|
RS-FF UND BCL
         _   _   _   _   _   _   _   _   _   _   _   _   _   _   
_____| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_

Nach den 16 Signalen meldet der Counter einen "Überlauf" mit diesem
löschst du das RS-FF dann wieder

Gruss Jens

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jens:

das Problem bei Deinem Entwurf ist, dass das erste Datenbit, was
zeitgleich mit dem FSC und BCL eingelesen werden sollte, nicht beachtet
wird, da der erste BCL mit dem FSC erst das RS-FF setzt...

...das wird dasselbe Problem von Oliver, das er oben beschrieben hat,
nach sich ziehen....

Trotzdem vielen Dank für Deinen Vorschlag

Gruß
Tom

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jens:

Sorry, habe die Zeichnung jetzt erst richtig interpretiert.
Das Problem wird aber sein, dass, wenn bis 15 gezählt worden ist, beim
nächsten Takt der Überlauf das RS-FF zurücksetzen soll, aber
gleichzeitig der FSC UND BCL am Setzeingang ansteht....ergo wird
entweder der Speicherzustand (NAND) oder der verbotenen Zustand (NOR)
des RS-FF erzielt....oder?!?

Gruß
Tom

Autor: FPGA-User (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Tom

im Anhang mal meine Idee dazu, bin davon ausgegangen, dass sich
frame-sync und Daten mit steigender Flanke bit-clock ändern.

Ich würde einen ausreichend hohen Systemtakt wählen und dann
alle Signale darauf synchronisieren, z.B. 10 MHz.

Vielleicht hilfts ja

Autor: Jens D. (jens) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Tom
wenn das BCL Signal immer weiter kommt kannst du auch bis 17 Zählen
lassen ;)

ich glaube nur, dass du fuer diese Aufgabe fast besser mit einem
kleinem Tiny arbeiten kannst kleiner und einfacher ;)

Gruss Jens

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@FPGA-User

Puuh...werde mal versuchen, durchzusteigen..... ;-)

Hier schon mal die ersten Fragen:

--------------------------------------------------------------------
         -- ext. Signale mit Systemtakt einlesen
         bclk1_q <= bclk;
         bclk2_q <= bclk1_q;

Werden hier nicht bclk1_q das anstehende Eingangssignal bclk (=1) und
bclk2_q der vorherige Wert von bclk1_q (=0) mit dem ersten clk-Takt
(also dem erstem Durchlaufen des Prozesses) zugewiesen?!? Quasi
Einsynchronisierung der BCL, mit der auch nur die u.a. if-Schleife
einmalig pro BCL durchlaufen wird...
------------------------------------------------------------
    fsync_q <= fsync;
    data_q  <= data;


         -- steigende Flanke BCLK ?
         rising_bclk_q <= bclk1_q='1' and bclk2_q='0';

         if rising_bclk_q then
--------------------

Mein lieber Schwan....das ist wirklich ein gewiefter Code.... ;-)
Werde vielleicht die Framausgabe innerhalb der Counter=0 => TRUE
einschieben....


Vielen Dank für Deinen Code...das zeigt mir, dass ich noch ein
VHDL-Rookie bin.... ;-)

Gruß
Tom

Autor: ope (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah, jemand der das _q verwendet; was heisst das _q wörtlich? mit _q
enden die internal arch variablen. q=quiet kann es ja nicht sein. Mit
_n bezeichnen ja einige low active signal, das habe ich schon
rausgefunden. _n wie negative logik???

Viele Grüße
Olaf

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Tom

bclk1_q und bclk2_q sind nur 2 hintereinandergeschaltete FFs,
also praktisch ein 2-bit Schieberegister.
Das ist das übliche Verfahren, wenn ein Signal mit einem
internen, schnelleren Takt eingesampelt wird und dann die
Flanke ausgewertet wird.
Bei einer steigenden Flanke wird zuerst bclk1_q='1', einen Takt
später erst bclk2_q. Das macht man sich zunutze, um eine Flanke
bei einem "einsynchr." Signal zu erkennen.

Der nächste Trick ist die IF-Abfrage vor der Statemachine.
Damit wird die gesamte Statemachine nur aktiv, wenn eine
steigende Flanke von bclk erkannt wurde. Ich brauch die
Bedingung dann nicht in jedem State einzeln hinzuschreiben.

@ope
_n sind bei mir Low-aktive Signale, _q sind alles Flip-Flops
(im Unterschied z.B. zu do_shift, was reine Kombinatorik ist)
_qn sind demnach Low-aktive Signale aus einem FF.
Habe die Regel im Bsp. 1 mal verletzt (frame-Ausgang in der Entity)
das war reine Nachlässigkeit

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@FPGA-User:

werde mir Deine Tricks merken und auch anwenden. Ich kenne das 3-Bit
Schieberegister zum entprellen von Schaltern und zum
"Einsynchronisieren" von Signalen, aber die direkt folgende Abfrage
zum aktivieren einer Statemachiene ist mir gänzlich neu...(naja, als
Rookie habe ich eben noch nicht in der Literatur gefunden, wenn man
diesen Trick überhaupt in Büchern findet, denn schliesslich wird hier
Deine Erfahrung eingeflossen sein)....

Nochmals danke für Deine Mühen!!

PS: gibt es eigentlich eine Art Leitfaden für die Indices hinter
bestimmten Deklarationen?!? (_q = FF, _n = low-aktiv,...)

Gruß
Tom

Autor: FPGA-User (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Tom

Leitfaden gibts nicht, kann sich jeder selbst definieren,
wichtig ist nur, dass man es dann konsequent durchzieht :-)
Nur dann bringt es was.

Im Anhang noch ein Screenshot der Simulation (in dem Fall
liegen 18 bits ziwschen 2 Frame-Syncs, was von der Logik
toleriert wird).

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@FPGA-User:

ist Dein Code für das Schieberegister synthetisierbar?!?
Irgendwie folgt mit dem RTL Schematic Viewer nach dem Top-Level Symbol
nur noch ein frame(0) Pin/Pad, der auf Masse liegt...

Gruß
Tom

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Tom

also mit Quartus II gings problemlos, 46 LEs im Cyclone,
21 Pins, also nichts wegoptimiert, kurzer Blick in den
RTL-Viewer von ALTERA: sieht alles prima aus.
Weiß nicht, was da bei Dir passiert ist

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@FPGA User

arbeite momentan noch mit dem Xilinx WebPack 6.1...
Habe aber bald die ISE7.1 Xilinx Umgebung...
Ob es an der abgespeckten WebPack Version liegt?!?

Danke für die Infos...

Gruß
Tom

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@FPGA-User:

Sorry, Rolle rückwärts... ;-)

Habe einen kleinen Tippfehler in meinem Code gehabt. Nun funzt alles
wunderbar. Das kommt davon ,wenn man schnell schnell den Code
eintippert....

Sieht alles sehr gut aus...!!

Thanx!!

Gruß
Thomas

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@FPGA-User:

Hallo nochmal,

um Deinen Code beschreiben zu können bräuchte ich etwaig nochmals 1-2
Anmerkungen Deinerseits....deshalb würde es mich freuen, wenn Du Dich
an og Mail-Addy mal melden könntest...

Vielen Dank!!
Gruß
Tom

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.