1. Home
  2. Chat
  3. Forum
  4. Kalender
    1. Termine
    2. Karte
  5. Lexikon
    1. Letzte Änderungen
  6. Marktplatz
    1. Bewertungen
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Forum
  • Termine
  • Lexikon
  • Marktplatz-Eintrag
  • Seiten
  • Erweiterte Suche
  1. PA-Forum
  2. Forum
  3. Selbstbau
  4. Selbstbau und Reparatur Technik

FPGA

  • databass.ch
  • 7. Dezember 2007 um 22:02
  • Arno
    Verifiziert
    Beiträge
    902
    • 23. Dezember 2007 um 23:41
    • #21

    Was mir auf den ersten Blick beim rasch rübergucken auffällt: Deine Resetbedingung wird nur ausgeführt, wenn (rising_edge(clk) and clken_4mhz = '1') erfüllt ist. Das ist (denke ich mal) nicht im Sinne des Erfinders.

    Das zweite: Du kommst aus deinem "Idle" erst heraus, wenn dmx_in='0' ist. Ist das richtig?

    Das dritte: Dein dmx_clk hat ein Duty-Cycle von 1/clk. (Das heißt du bekommst immer nur einen kurzen Highpegel und einen langen Low-Pegel auf dem dmx_clk). Stimmt das?

    Einen genaueren Blick werfe ich jetzt nicht drauf. Ich habe Urlaub. :)

    (Außerdem kapiere ich noch nicht ganz was das Ding machen soll. 8) )

    Bis dann... Arno!

  • databass.ch
    Reaktionen
    1
    Beiträge
    1.197
    • 25. Dezember 2007 um 16:02
    • #22

    Danke Arno :)

    Zitat von "Arno"

    Was mir auf den ersten Blick beim rasch rübergucken auffällt: Deine Resetbedingung wird nur ausgeführt, wenn (rising_edge(clk) and clken_4mhz = '1') erfüllt ist. Das ist (denke ich mal) nicht im Sinne des Erfinders.

    Das sollte mein versuch eines "synchronen Resets" sein. Hab das in meinem Entwurf aber in der zwischen Zeit geändert.

    Zitat


    Das zweite: Du kommst aus deinem "Idle" erst heraus, wenn dmx_in='0' ist. Ist das richtig?

    ja, falls idle = 1 ist, soll er warten, bis das erste mal wieder eine fallende Flanke anliegt.

    Zitat

    Das dritte: Dein dmx_clk hat ein Duty-Cycle von 1/clk. (Das heißt du bekommst immer nur einen kurzen Highpegel und einen langen Low-Pegel auf dem dmx_clk). Stimmt das?

    Eigentlich schon, das soll dem nachfolgenden schieberegister nur kurz mitteilen, dass es etwas zu verarbeiten gibt.

    Zitat

    Einen genaueren Blick werfe ich jetzt nicht drauf. Ich habe Urlaub. :)

    na, dann schönen Urlaub noch :) Ich muss meine freie Zeit nutzen um mich in ruhe mit sowas beschäftigen zu können ;)

    Zitat

    (Außerdem kapiere ich noch nicht ganz was das Ding machen soll. 8) )

    Es soll 16 Samples pro DMX-Bit verarbeiten, und die Anzahl der Samples mit High-Pegel zählen. Ist deren Anzahl nach 16 gemessenen Samples grösser als 8 kann man davon ausgehen, dass das ein Bit mit dem Wert Eins sein soll.

    schöne Weihnachten

  • databass.ch
    Reaktionen
    1
    Beiträge
    1.197
    • 25. Dezember 2007 um 17:48
    • #23

    Mal eine grundsätzliche frage zu synchronen Designs:

    hier die entsprechenden VHDL Codes:
    Beispiel 1
    Beispiel 2
    Beispiel 3

    1. Frage: Ist so eine Verschaltung wie in Beispiel 1 wirklich zuverlässig? Ich meine, bei einer Clock-Flanke werden ja alle FlipFlops gleichzeitig ihren Q-Ausgang ändern. Das bedeutet auch, das der D-eingang des jeweils folgendem Flipflop sich genau dann ändert, wenn er eigentlich gespeichert werden soll.

    2. Frage: wäre eine abwechselnde Triggerung wie in Beispiel 2 da nicht sinnvoller. Im Internet wird davon dringen abgeraten. Warum?

    3. Frage: Gibt es einen Unterschied zwischen Beispiel 1 und 3? Vorallem in VHDL bzw. im FPGA. Der Schaltplan ist ja genau gleich, nur zur Verdeutlichung unterschiedlich angeordnet.

  • Michael D
    Beiträge
    721
    • 26. Dezember 2007 um 04:49
    • #24

    Erstmal zu deinem code oben:

    1. Wie Arno schon schrieb kommst du aus dem Idle nur bei dmx_in = 0 raus. Ich sehe aber gerade gar nicht, wie du überhaupt wieder in den Idle Zustand kommen willst. Machst du nach nem ganzen Byte einfach nen Reset?

    2. Du benutzt alle 16 Sample zur Auswertung und nicht nur drei in der Mitte, aber ich schätze das ist dir klar.

    3. Du solltest das dmx_in noch synchronisieren, aber das kannst du natürlich auch ausserhalb dieses Blocks machen.

    4. Noch ein Tip wie ich gerne Signale generiere, die nur eine Clock high sein sollen (in deinem Fall z.B. ser_clk): Zu Beginn des Prozesses auf 0 setzten (also hier direkt unter der Clockabfrage und noch vor der Idle abfrage) und dann wenn benötigt an der (den) entsprechenden Stelle(n) auf 1 setzen. Das erspart einem das man das Signal an allen anderen Stellen auf 0 setzten muss.

    Zum Synchronen Design:

    1. Was du hier entdeckt hast ist das Hold Time Problem. In der Tat ist das direkte Verbinden von FFs meist nicht möglich. Jedes (D-)FF hat eine Setup und eine Hold Time.
    Setup gibt die Zeit an, die das Signal am D Eingang stabil anliegen muss bevor die Rising Clock Edge kommt, Hold gibt entsprechend die Zeit an, die das Signal nach der Clock Edge stabil sein muss.
    D.h. man (bzw. die Software wie hier Xilinx) muss bei der Timing Analyse checken, dass a) keine Signalpfade zwischen FFs zu schnell sind (Hold Violation) und b) keine Signalpfade zwischen FFs zu langsam sind (Setupt Violation).
    Die Holdtimes kann man durch Einfügen von Buffern fixen, bei den Setuptimes hilft nur mit der Taktfreq. runter zu gehen, bzw. der schlechteste Setup Pfad gibt dir deine max. Frequenz vor. Wie das jetzt bei FPGAs exakt ist weiss ich nicht, eventuell hat man da durch die LUTs und Leitungen auch so schon genug Delay, dasses für die Holdtime reicht.
    Damit das ganze auch richtig funktioniert muss man dafür sorgen, dass die Clock bei allen FFs möglichst gleichzeitig ankommt. Das erreicht man mit entsprechendem Aufbau des sog. Clocktrees, d.h. z.B. in Baumform oder man muss die Clocksignallaufzeiten eben genau berechnen. Der max. Unterschied der Ankunftszeit der Clock wird Clock Skew genannt.
    Übrigens, wenn Signale verschiedene Clockdomains überqueren (auch dein dmx_in ist so ein Fall, da es von einem Gerät ausserhalb mit eigener Clock generiert wird) ist es unmöglich die Setup und Hold Times der FFs einzuhalten. Wenn das passiert kann der FF in einen metastabilen Zustand gehen, d.h. er gibt irgendwas zwischen 0 und 1 aus.
    Dieser Zustand legt sich schnell wieder, dauert aber deutlich länger als ein normaler Schaltvorgang.
    Deshalb muss man das Signal mit Hilfe von mind. zwei direkt hintereinander geschalteten FFs (was halt mit der Holdtime minimal möglich ist)
    synchronisieren. Man hoft da, dass das Timingbudget bis zur nächsten Clock lange genug ist, dass sich ein eventueller metastabiler Zustand
    des ersten FFs gelegt hat. Ist das nicht so kann sich der metastabile Zustand in der ganzen Schaltung ausbreiten und diese zum Absturz bringen.
    100% sicher kann man sich da nie sein, aber die Fehlerraten liegen bei heutiger Technologie bei vielen vielen Jahren bis zum ersten Fehler.

    2. Wechselnde Clockflanken verwendet man normalerweise nicht (es gibt sicherlich Spezialfälle wo das Sinn macht). Du hättest ein Problem,
    wenn du ein Schaltnetz hast, welches ein Signal aus dem Output von zwei invertiert geclockten FFs generiert.

    3. Es macht absolut keinen Unterschied. Aber nur, weil du Signale verwendest. Hättest du im Bsp. 3 Variablen im Prozess würden dieses direkt übernommen.
    Denk dir das so: Ein (sequenzieller) Prozess hat normalerweise immer ein paar Signale zum Eingang (Variablen sind ausserhalb von Prozessen ja nicht möglich)
    und ein paar als Ausgang (die die er beschreibt). Wenn die Clock kommt friert er die Zustände aller Eingangssignale ein und berechnet die Ausgangssignale mit diesen Eingangssignalen.
    Variablen hingegen sind eine Art der Abstraktion für die Beschreibung innerhalb eines Prozesses. Wenn du von ihnen liesst enthalten sie den im selben "Prozessdurchlauf" zuletzt geschrieben Wert.
    Das lässt sich natürlich hardwaretechnisch nicht direkt abbilden (es geht ja nur um eine Clock), d.h. der Compiler baut daraus etwas, was nur aus "Signalen" besteht. Ich hoffe das kann man irgendwie verstehen.
    In Kurzform:

    b <= a;
    c <= b;
    d <= c;
    e <= d;

    und

    e <= d;
    d <= c;
    c <= b;
    b <= a;

    sind Identisch im Fall von Signalen, aber nicht im Fall von Variablen.

    http://www.digital-enlightenment.de/
    USB DMX Interface, Mediensteuerung, Demultiplexer, Multiplexer, Dimmer, Relaisboard, Art-Net

  • databass.ch
    Reaktionen
    1
    Beiträge
    1.197
    • 26. Dezember 2007 um 13:03
    • #25

    Vielen Dank für dein ausführliches Posting. Habe einiges eingearbeitet, hier das Ergebniss: :D

    http://www.databass.ch/temp/forum/dmx-receiver.vhdl

  • Michael D
    Beiträge
    721
    • 31. Dezember 2007 um 01:56
    • #26

    Sorry für den langen Delay, aber is ja auch n komplexes Thema ;)
    Hab das ganze jetzt mal grob überflogen und sehe keinen prinzipiellen Fehler.
    Nächster Schritt wäre jetzt eine Testbench zu erstellen und in Modelsim eine Behaviol Simulation zu machen ob die Kiste auch so tut wie se soll. Danach noch ne kleine Schaltun die Startbyte prüft, Bytes zählt und das ganze in nen Dual Port Memory schreibt. An die andere Seite von dem Mem hängste dann nen Prozessor und fertig is der Empfänger.

    http://www.digital-enlightenment.de/
    USB DMX Interface, Mediensteuerung, Demultiplexer, Multiplexer, Dimmer, Relaisboard, Art-Net

  • databass.ch
    Reaktionen
    1
    Beiträge
    1.197
    • 19. Januar 2008 um 23:28
    • #27
    Zitat von &quot;Michael D&quot;

    Sorry für den langen Delay

    Kein Problem, hab ja selber auch nicht immer Zeit mich damit zu beschäftigen. Hab diese Woche den Preis für Modelsim bekommen. In der Grundausstattung: ca 6000Dollar :shock: :oops: :? :cry: Ich kann zwar eine 15Tage Demo bekommen, wird mir aber auch nicht soooviel bringen.

    Von Siphec hab ich auch noch nichts gehört wegen: http://www.siphec.com/item/XC3S400-TB.html
    Habt ihr eine Idee wo man sowas ähnliches herbekommen könnte. (Nur FPGA, Konfig-RAM, Spannungsversorgung und Quarz mit Lötstiften, genau wie das von Siphec)

  • Michael D
    Beiträge
    721
    • 20. Januar 2008 um 20:43
    • #28

    Es gibt ne freie Version von Modelsim die einfach bischen langsamer ist. Die 10000 Zeilen Code wirste so schnell sowiso nit erreichen:
    http://www.mikrocontroller.net/articles/ModelSim
    Klar sind die offiziellen Versionen von ModelSim unendlich teuer, schau dir mal an, wer die normalerweise benutzt...

    Trenz Electronic macht auch noch solche Boards, hab da aber noch nie bestellt:
    http://shop.trenz-electronic.de/catalog/product_info.php?products_id=178&osCsid=1661be96272bd8ee88a0aa39cf080538
    Oder halt das Spartan Starterboard von Xilinx.
    http://www.digilentinc.com/

    http://www.digital-enlightenment.de/
    USB DMX Interface, Mediensteuerung, Demultiplexer, Multiplexer, Dimmer, Relaisboard, Art-Net

Anstehende Termine

  • Kombiseminar Sachkundiger für Anschlagmittel und Traversensysteme (AnschlägerPlus)

    Mittwoch, 23. September 2026 – Freitag, 25. September 2026
  • Kombiseminar Sachkundiger für Anschlagmittel und Traversensysteme (AnschlägerPlus)

    Dienstag, 29. September 2026 – Donnerstag, 1. Oktober 2026
  • Sachkunde für Fliegende Bauten

    Dienstag, 29. September 2026 – Donnerstag, 1. Oktober 2026
  • Virtueller Stammtisch im Chat

    Dienstag, 29. September 2026, 21:00 – 23:00
  • PA-Forum Stammtisch LeatCon

    Dienstag, 6. Oktober 2026, 13:00 – 14:00

Letzte Themen

  1. 17. - 18. November | PA Rigging & Truss Safety mit Tom Greber

    Soundchecker
    23. September 2026 um 10:33
  2. 13. - 14. Oktober | Live Mixing Workshop mit Jörn Müller in Köln

    Soundchecker
    23. September 2026 um 10:30
  3. können das hier (Foto) die original Weichen der KMT CS215 / CM215 sein ?

    phattomatic
    23. September 2026 um 09:12
  4. RCF: "Bass Motion Control" vs. "XBoost" => Ähnliche Funktionalität unter zwei verschiedenen Etiketten oder relevante Unterschiede?

    Hanseat
    21. September 2026 um 22:21
  5. Suche Lichteffekt

    Schreddl
    21. September 2026 um 12:22
  6. QLC+4 in MagicQ Visualsieren - wie richtig einstellen?

    metal-shot
    19. September 2026 um 17:44
  7. Verschiedene Verteiler mit Powercon Anschluss bzw. Ausgang kompatibel?

    tenderboy
    19. September 2026 um 12:22
  8. Suche Optocore Spezialisten - trouble shooting eines SANE Verbunds

    georg.h
    19. September 2026 um 10:21
  9. Quick & dirty reverse engineering - wie gehts weiter?

    phlownd
    19. September 2026 um 10:13
  10. DSP Preset für The Box Pro TP218 MKIII

    dxnny074
    18. September 2026 um 15:16
  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™