{"id":1837,"date":"2021-09-21T20:04:54","date_gmt":"2021-09-21T19:04:54","guid":{"rendered":"http:\/\/www.fabienm.eu\/flf\/?p=1837"},"modified":"2021-09-22T07:53:51","modified_gmt":"2021-09-22T06:53:51","slug":"une-led-qui-clignote-sur-icestick-vite-vite-vite","status":"publish","type":"post","link":"http:\/\/www.fabienm.eu\/flf\/une-led-qui-clignote-sur-icestick-vite-vite-vite\/","title":{"rendered":"Une LED qui clignote sur  ICEStick vite vite vite !"},"content":{"rendered":"\n<p><a href=\"http:\/\/www.fabienm.eu\/flf\/projet-icestorm-le-fpga-libere\/\">Historiquement<\/a> le ICE40 soud\u00e9 sur la carte <a href=\"http:\/\/icestick\">icestick<\/a> est le premier support\u00e9 par des outils libres.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"http:\/\/www.fabienm.eu\/flf\/wp-content\/uploads\/2021\/09\/icestick-reva-side-2400.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"774\" src=\"http:\/\/www.fabienm.eu\/flf\/wp-content\/uploads\/2021\/09\/icestick-reva-side-2400-1024x774.png\" alt=\"\" class=\"wp-image-1843\" srcset=\"http:\/\/www.fabienm.eu\/flf\/wp-content\/uploads\/2021\/09\/icestick-reva-side-2400-1024x774.png 1024w, http:\/\/www.fabienm.eu\/flf\/wp-content\/uploads\/2021\/09\/icestick-reva-side-2400-300x227.png 300w, http:\/\/www.fabienm.eu\/flf\/wp-content\/uploads\/2021\/09\/icestick-reva-side-2400-768x580.png 768w, http:\/\/www.fabienm.eu\/flf\/wp-content\/uploads\/2021\/09\/icestick-reva-side-2400-1536x1160.png 1536w, http:\/\/www.fabienm.eu\/flf\/wp-content\/uploads\/2021\/09\/icestick-reva-side-2400-2048x1547.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Le c\u00e9l\u00e8bre icestick qui a lib\u00e9r\u00e9 les FPGA<\/figcaption><\/figure>\n\n\n\n<p>Il est maintenant possible d&rsquo;utiliser plusieurs programmes open-source pour d\u00e9velopper dessus. Voici une m\u00e9thode avec yosys, nextpnr, icestorm et openFPGALoader.<\/p>\n\n\n\n<p>Dans un premier temps, allez donc cloner, compiler makeInstaller les 4 programmes cit\u00e9s ci-avant :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/www.clifford.at\/yosys\/download.html\">Yosys<\/a>: Logiciel de synth\u00e8se Verilog couteau suisse du monde du FPGA.<\/li><li><a href=\"https:\/\/github.com\/YosysHQ\/nextpnr\">nextpnr<\/a>: Logiciel de placement routage supportant de plus en plus de famille de FPGA<\/li><li><a href=\"http:\/\/www.clifford.at\/icestorm\/\">icestorm<\/a>: La temp\u00eate \u00e0 l&rsquo;origine de la lib\u00e9ration des ICE40 de Lattice.<\/li><li><a href=\"https:\/\/github.com\/trabucayre\/openFPGALoader\">openFPGALoader<\/a>: Le configurateur universel pour FPGA.<\/li><\/ul>\n\n\n\n<p>N&rsquo;oubliez pas l&rsquo;option de compilation \u00abICE40\u00bb  quand elle est requise, mais c&rsquo;est expliqu\u00e9 dans les diff\u00e9rents tutos de compilation des outils.<\/p>\n\n\n\n<p>Une fois que tout est install\u00e9 on peut prendre le source Verilog \u00ab<a href=\"https:\/\/github.com\/Martoni\/blp\/blob\/master\/verilog\/src\/blink.v\">Blinking Led Project<\/a>\u00bb et le modifier comme ci-dessous :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>module blink (\n    \/\/ Horloge\n    input clock,\n    output led\n);\n\n\/\/ Icestick clock : 12Mhz\nparameter clock_freq = 12_000_000; \/\/ clock frequency\nlocalparam MAX_COUNT = clock_freq;\nlocalparam MAX_COUNT_UPPER = $clog2(MAX_COUNT) - 1;\n\nreg &#91;MAX_COUNT_UPPER:0] counter;\nreg led_reg;\n\nassign led = led_reg;\n\nalways@(posedge clock)\nbegin\n    if(counter &lt; MAX_COUNT\/2)\n        led_reg &lt;= 1;\n    else\n        led_reg &lt;= 0;\n\n    if(counter &gt;= MAX_COUNT)\n        counter &lt;= 0;\n    else\n        counter &lt;= counter + 1;\nend\n\nendmodule<\/code><\/pre>\n\n\n\n<p>Il faut ensuite ajouter les informations de pinout pour l&rsquo;horloge et la LED  dans un fichier pcf que nous nommerons <code>blink.pc<\/code>f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>set_io clock  21\nset_io led 98<\/code><\/pre>\n\n\n\n<p>Puis enfin, lancer les diff\u00e9rentes commande de synth\u00e8se\/pnr\/bitstream :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ PROJECTNAME=blink\n$ VERILOGS=\"$PROJECTNAME.v\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Synth\u00e8se avec <strong>yosys<\/strong>:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>$ yosys -q -p \"synth_ice40 -top $PROJECTNAME -json $PROJECTNAME.json\" $VERILOGS<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Placement routage avec <strong>nextpnr<\/strong>:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>$ nextpnr-ice40 --force --json $PROJECTNAME.json --pcf $PROJECTNAME.pcf --asc $PROJECTNAME.asc --freq 12 --hx1k --package tq144 $1\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>V\u00e9rification des timings avec <strong>icetime<\/strong>:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>$ icetime -p $PROJECTNAME.pcf -P tq144 -r $PROJECTNAME.timings -d hx1k -t $PROJECTNAME.asc\n\/\/ Reading input .pcf file..\n\/\/ Reading input .asc file..\n\/\/ Reading 1k chipdb file..\n\/\/ Creating timing netlist..\n\/\/ Timing estimate: 6.12 ns (163.28 MHz)\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Packaging du bitstream avec <strong>icepack<\/strong> :<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>$ icepack $PROJECTNAME.asc $PROJECTNAME.bin\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Configuration du fpga avec <strong>openFPGALoader<\/strong>:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>$ openFPGALoader -b ice40_generic blink.bin \nwrite to ram\nJtag frequency : requested 6.00MHz   -&gt; real 6.00MHz  \nParse file DONE\n00\nDetail: \nJedec ID          : 20\nmemory type       : ba\nmemory capacity   : 16\nEDID + CFD length : 10\nEDID              : 0000\nCFD               : \nErasing: &#91;==================================================] 100.00%\nDone\nWriting: &#91;==================================================] 100.00%\nDone\nWait for CDONE DONE\n<\/code><\/pre>\n\n\n\n<p>Et voila, la LED clignote.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Historiquement le ICE40 soud\u00e9 sur la carte icestick est le premier support\u00e9 par des outils libres. Il est maintenant possible d&rsquo;utiliser plusieurs programmes open-source pour d\u00e9velopper dessus. Voici une m\u00e9thode avec yosys, nextpnr, icestorm et openFPGALoader. Dans un premier temps, allez donc cloner, compiler makeInstaller les 4 programmes cit\u00e9s ci-avant : Yosys: Logiciel de synth\u00e8se &hellip; <a href=\"http:\/\/www.fabienm.eu\/flf\/une-led-qui-clignote-sur-icestick-vite-vite-vite\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Une LED qui clignote sur  ICEStick vite vite vite !<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","footnotes":""},"categories":[1],"tags":[46,208,47,179,158,72,30,45],"class_list":["post-1837","post","type-post","status-publish","format-standard","hentry","category-non-classe","tag-ice40","tag-icestick","tag-icestorm","tag-nextpnr","tag-openfpgaloader","tag-synthese","tag-verilog","tag-yosys"],"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\/admin\/"},"uagb_comment_info":1,"uagb_excerpt":"Historiquement le ICE40 soud\u00e9 sur la carte icestick est le premier support\u00e9 par des outils libres. Il est maintenant possible d&rsquo;utiliser plusieurs programmes open-source pour d\u00e9velopper dessus. Voici une m\u00e9thode avec yosys, nextpnr, icestorm et openFPGALoader. Dans un premier temps, allez donc cloner, compiler makeInstaller les 4 programmes cit\u00e9s ci-avant : Yosys: Logiciel de synth\u00e8se\u2026","_links":{"self":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1837","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\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/comments?post=1837"}],"version-history":[{"count":6,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1837\/revisions"}],"predecessor-version":[{"id":1844,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1837\/revisions\/1844"}],"wp:attachment":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/media?parent=1837"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/categories?post=1837"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/tags?post=1837"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}