{"id":363,"date":"2015-07-06T10:10:00","date_gmt":"2015-07-06T09:10:00","guid":{"rendered":"http:\/\/www.fabienm.eu\/flf\/?p=363"},"modified":"2023-01-31T11:16:07","modified_gmt":"2023-01-31T10:16:07","slug":"synchronisation-dun-signal-externe-avec-chisel","status":"publish","type":"post","link":"http:\/\/www.fabienm.eu\/flf\/synchronisation-dun-signal-externe-avec-chisel\/","title":{"rendered":"Synchronisation d&rsquo;un signal externe avec Chisel"},"content":{"rendered":"<p>Quand on r\u00e9cup\u00e8re un signal ext\u00e9rieur au fpga dont on ne maitrise pas le timing d&rsquo;arriv\u00e9e des fronts \u2014 typiquement un bouton ou une interruption \u2014 il est n\u00e9cessaire de le synchroniser par rapport \u00e0 l&rsquo;horloge qui cadence le FPGA.<\/p>\n<p>Il faut donc utiliser le montage classique des<a href=\"http:\/\/www.researchgate.net\/publication\/224202883_Synchronization_Techniques_for_Crossing_Multiple_Clock_Domains_in_FPGA-Based_TMR_Circuits\"> deux bascules<\/a>. En Verilog et en VHDL cela se traduit par la d\u00e9claration d&rsquo;un signal interm\u00e9diaire permettant la connection entre les deux bascules:<\/p>\n<pre><code>reg tmp, sig_s;\n\nalways @(posedge clk)\n begin\n    tmp &lt;= sig;\n    sig_s &lt;= tmp;\n end\n<\/code><\/pre>\n<p>Avec Chisel l&rsquo;exemple donn\u00e9 dans le <a href=\"https:\/\/chisel.eecs.berkeley.edu\/2.2.0\/chisel-tutorial.pdf\">tutorial <\/a>(page 14) est assez d\u00e9cevant car il impose aussi l&rsquo;utilisation d&rsquo;un signal interm\u00e9diaire :<\/p>\n<pre><code>s1 :=\u00a0 signalA\ns2 := s1;\nsignalB := s2\n<\/code><\/pre>\n<p>Pourtant il existe une m\u00e9thode un peu plus \u00e9l\u00e9gante ne n\u00e9cessitant qu&rsquo;une seule ligne de code si on regarde du cot\u00e9 de la classe <a href=\"https:\/\/www.chisel-lang.org\/api\/3.3.3\/chisel3\/util\/ShiftRegister$.html\">ChiselUtil<\/a> :\u00a0ShiftRegister()<\/p>\n<p>Cette fonction permet de d\u00e9caler un signal du nombre de coup d&rsquo;horloge donn\u00e9 en argument, la synchronisation d&rsquo;un signal par une double bascule n&rsquo;\u00e9tant rien de plus qu&rsquo;un registre \u00e0 d\u00e9calage de deux coups d&rsquo;horloge il suffit donc de l&rsquo;utiliser avec un d\u00e9calage de 2 :<\/p>\n<pre><code>val\u00a0 sig_s = ShiftRegister(sig, 2)\n<\/code><\/pre>\n<p>Si on regarde le Verilog g\u00e9n\u00e9r\u00e9 par le backend on obtient bien les deux bascules souhait\u00e9es:<\/p>\n<pre><code>always @(posedge clk) begin\n[...]\nsig_s &lt;= R23;\nR23 &lt;= sig;\n[...]\nend\n<\/code><\/pre>\n<p>Voila qui nous simplifie grandement les design, et \u00e9vite l&#8217;empilement des copier\/coller de signaux temporaire pour synchroniser des grappes de signaux.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quand on r\u00e9cup\u00e8re un signal ext\u00e9rieur au fpga dont on ne maitrise pas le timing d&rsquo;arriv\u00e9e des fronts \u2014 typiquement un bouton ou une interruption \u2014 il est n\u00e9cessaire de le synchroniser par rapport \u00e0 l&rsquo;horloge qui cadence le FPGA. Il faut donc utiliser le montage classique des deux bascules. En Verilog et en VHDL &hellip; <a href=\"http:\/\/www.fabienm.eu\/flf\/synchronisation-dun-signal-externe-avec-chisel\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Synchronisation d&rsquo;un signal externe avec Chisel<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","footnotes":""},"categories":[4,3],"tags":[57,54,53,30],"class_list":["post-363","post","type-post","status-publish","format-standard","hentry","category-chisel-langages","category-langages","tag-chisel","tag-synchronisation","tag-truc","tag-verilog"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"post-thumbnail":false},"uagb_author_info":{"display_name":"Fabien Marteau","author_link":"http:\/\/www.fabienm.eu\/flf\/author\/martoni\/"},"uagb_comment_info":0,"uagb_excerpt":"Quand on r\u00e9cup\u00e8re un signal ext\u00e9rieur au fpga dont on ne maitrise pas le timing d&rsquo;arriv\u00e9e des fronts \u2014 typiquement un bouton ou une interruption \u2014 il est n\u00e9cessaire de le synchroniser par rapport \u00e0 l&rsquo;horloge qui cadence le FPGA. Il faut donc utiliser le montage classique des deux bascules. En Verilog et en VHDL\u2026","_links":{"self":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/363","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/comments?post=363"}],"version-history":[{"count":6,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/363\/revisions"}],"predecessor-version":[{"id":2281,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/363\/revisions\/2281"}],"wp:attachment":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/media?parent=363"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/categories?post=363"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/tags?post=363"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}