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
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).
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
@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
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
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
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
@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
@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
@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
@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
@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
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
@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
@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
@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).
@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
@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
@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
@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
@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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.