{"id":1,"date":"2016-05-10T03:48:21","date_gmt":"2016-05-10T03:48:21","guid":{"rendered":"http:\/\/smartfpga.de\/?p=1"},"modified":"2020-09-06T16:57:47","modified_gmt":"2020-09-06T16:57:47","slug":"hello-world","status":"publish","type":"post","link":"https:\/\/smartfpga.de\/?p=1","title":{"rendered":"Umgang mit IODELAY2 Primitiven"},"content":{"rendered":"<p>Hat vielleicht jemand schon mal das Problem gehabt, dass ein ankommendes Signal nicht zum richtigen Zeitpunkt ankommt? Z.B. ereignet sich der \u00dcbergang eines einkommenden Datensignals quasi gleichzeitig mit dem positiven \u00dcbergang eines Systemtaktsignals, zu dem alles in einem entwickelten System gekoppelt ist. Um das einkommende Datensignal zeitlich zu verschieben, kann die Primitive IODELAY2 benutzt werden. Hier wird kurz und \u00fcbersichtlich beschrieben wie man ein IODELAY2 f\u00fcr die einkommenden Signale verwendet und wie eventuell auftretende Schwierigkeiten ber\u00fccksichtigt werden k\u00f6nnen. Dies wird an einem praktischen Beispiel erl\u00e4utert. <!--more--><\/p>\n\n\n<p>Die Primitive IODELAY2 befindet sich in allen Input-Output-Blocks (IOBs) und kann f\u00fcr einkommende Signale auf zwei (allgemeine) Weisen benutzt werden: f\u00fcr eine konstante oder aber variable Verz\u00f6gerung des Signals. Die Konfiguration der Primitive wird anhand von, bei der Instantierung \u00fcbergebenen, Attributen festgelegt. Die Art der Verz\u00f6gerung eines einkommenden Signals wird mit dem IDELAY_TYPE Attribut angegeben. F\u00fcr einen variablen Modus kann dieses Attribut entweder VARIABLE_FROM_ZERO oder VARIABLE_FROM_HALF_MAX sein, je nachdem wie lange die Verz\u00f6gerung von IODELAY2 gleich nach der Kalibrierungsprozedur sein muss. Die Modi mit der konstanten Verz\u00f6gerung werden durch FIXED oder DEFAULT Werte des IDELAY_TYPE Attributs ausgew\u00e4hlt. Die Modi mit der konstanten Verz\u00f6gerung ben\u00f6tigen kein CLK Signal.<\/p>\n\n\n\n<p>Ohne in die Details der Struktur der Primitive zu gehen, die in UG381 schon gut beschrieben ist, sieht diese IODELAY2 Primitive so aus:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/smartfpga.de\/wp-content\/uploads\/2016\/05\/IODELAY2.png\" alt=\"\" class=\"wp-image-37\" width=\"275\" height=\"414\" srcset=\"https:\/\/smartfpga.de\/wp-content\/uploads\/2016\/05\/IODELAY2.png 275w, https:\/\/smartfpga.de\/wp-content\/uploads\/2016\/05\/IODELAY2-199x300.png 199w\" sizes=\"auto, (max-width: 275px) 100vw, 275px\" \/><\/figure><\/div>\n\n\n\n<p>Die Beschreibung der Ein- und Ausg\u00e4nge der IODELAY2 Primitive findet man in UG381 in der Tabelle 2-8 (Seite 74.):<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/smartfpga.de\/wp-content\/uploads\/2019\/07\/Spartan-6-FPGA-SelectIO-Resources-User-Guide-UG381.png\" alt=\"\" class=\"wp-image-13\" width=\"947\" height=\"691\" srcset=\"https:\/\/smartfpga.de\/wp-content\/uploads\/2019\/07\/Spartan-6-FPGA-SelectIO-Resources-User-Guide-UG381.png 947w, https:\/\/smartfpga.de\/wp-content\/uploads\/2019\/07\/Spartan-6-FPGA-SelectIO-Resources-User-Guide-UG381-300x219.png 300w, https:\/\/smartfpga.de\/wp-content\/uploads\/2019\/07\/Spartan-6-FPGA-SelectIO-Resources-User-Guide-UG381-768x560.png 768w\" sizes=\"auto, (max-width: 947px) 100vw, 947px\" \/><\/figure><\/div>\n\n\n\n<p>In dem sp\u00e4ter gezeigten Beispiel wird ein einkommendes Signal durch zwei IODELAY2-Primitiven parallel geleitet. Die erste Primitive befindet sich im DEFAULT Modus, die zweite im VARIABLE_FROM_ZERO Modus. Mit der zweiten der Primitiven kann die Verz\u00f6gerung des einkommenden Signals auf dem DATAOUT2-Ausgang manuell angepasst werden.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/smartfpga.de\/wp-content\/uploads\/2016\/05\/ZweiIODELAY2-1024x803.png\" alt=\"\" class=\"wp-image-36\" width=\"1024\" height=\"803\" srcset=\"https:\/\/smartfpga.de\/wp-content\/uploads\/2016\/05\/ZweiIODELAY2-1024x803.png 1024w, https:\/\/smartfpga.de\/wp-content\/uploads\/2016\/05\/ZweiIODELAY2-300x235.png 300w, https:\/\/smartfpga.de\/wp-content\/uploads\/2016\/05\/ZweiIODELAY2-768x602.png 768w, https:\/\/smartfpga.de\/wp-content\/uploads\/2016\/05\/ZweiIODELAY2.png 1194w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Die&nbsp;Verz\u00f6gerung kann maximal 255 sogenannte \u201eTaps\u201c  betragen. Wie lang die Taps sind, wird in Dokumentation von Xilinx  nicht direkt angegeben. Die L\u00e4nge eines Taps h\u00e4ngt von der Temperatur  und der Versorgungsspannung ab. So wie ich es aus der Dokumentation und  Foren verstanden habe, kann man die Dauer eines Taps mit 40ps absch\u00e4tzen. Die Anzahl der Taps einer IODELAY2-Primitive, die sich im  variablen Modus befindet, kann manuell in- und dekrementiert werden.  Daf\u00fcr benutzt man die INC und CE Eing\u00e4nge der IODELAY2 Primitive (siehe  Tabelle).&nbsp;Wenn man die gesamte Verz\u00f6gerung z.B. inkrementieren will,  setzt man erst das INC-Signal zu \u201e1\u201c und danach setzt man das CE-Signal  zu \u201e1\u201c. Genauso verf\u00e4hrt man, um die Verz\u00f6gerung zu verk\u00fcrzen,  allerdings muss nat\u00fcrlich das INC-Signal auf \u201e0\u201c gesetzt werden. Wie ich (praktisch) herausgefunden habe, entspricht die Anzahl der In- oder  Dekrementschritte der Anzahl der positiven Flanken des CE-Signals.&nbsp;Das  hei\u00dft, wenn z.B. das INC-Signal positiv ist, verursacht ein positiver  \u00dcbergang des CE-Signals &nbsp;das Hinzuf\u00fcgen eines Taps zu der gesamten  Verz\u00f6gerung, egal wie viele Taktperioden danach das CE-Signal positiv  bleibt. Die letzte wichtige Sache: um die normale Funktion eines  IODELAY2 Primitives im variablen Modus zu erm\u00f6glichen, muss die  Kalibrierungsprozedur der jeweiligen Primitive durchgef\u00fchrt werden.  Daf\u00fcr muss der Zustandsautomat nach einem Reset den CAL-Eingang der  Primitive auf \u201e1\u201c einmal setzen.<\/p>\n\n\n\n<p>Im folgenden Video ist zu sehen, wie die Signale an den beiden Ausg\u00e4ngen aussehen:<\/p>\n\n\n\n<figure class=\"wp-block-embed-youtube aligncenter wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"IODELAY2 Example\" width=\"580\" height=\"326\" src=\"https:\/\/www.youtube.com\/embed\/gU4sDdKy5_8?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Hat vielleicht jemand schon mal das Problem gehabt, dass ein ankommendes Signal nicht zum richtigen Zeitpunkt ankommt? Z.B. ereignet sich der \u00dcbergang eines einkommenden Datensignals quasi gleichzeitig mit dem positiven \u00dcbergang eines Systemtaktsignals, zu dem alles in einem entwickelten System gekoppelt ist. Um das einkommende Datensignal zeitlich zu verschieben, kann die Primitive IODELAY2 benutzt werden. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"templates\/template-full-width.php","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1","post","type-post","status-publish","format-standard","hentry","category-fpga-primitiven"],"_links":{"self":[{"href":"https:\/\/smartfpga.de\/index.php?rest_route=\/wp\/v2\/posts\/1","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/smartfpga.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/smartfpga.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/smartfpga.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/smartfpga.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1"}],"version-history":[{"count":21,"href":"https:\/\/smartfpga.de\/index.php?rest_route=\/wp\/v2\/posts\/1\/revisions"}],"predecessor-version":[{"id":104,"href":"https:\/\/smartfpga.de\/index.php?rest_route=\/wp\/v2\/posts\/1\/revisions\/104"}],"wp:attachment":[{"href":"https:\/\/smartfpga.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/smartfpga.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/smartfpga.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}