{"id":7,"date":"2014-10-27T11:10:03","date_gmt":"2014-10-27T10:10:03","guid":{"rendered":"http:\/\/www.fabienm.eu\/flf\/?p=7"},"modified":"2014-10-27T11:10:03","modified_gmt":"2014-10-27T10:10:03","slug":"experimentations-de-migen-sur-apf27-avec-debian","status":"publish","type":"post","link":"http:\/\/www.fabienm.eu\/flf\/experimentations-de-migen-sur-apf27-avec-debian\/","title":{"rendered":"Exp\u00e9rimentations de Migen sur APF27 avec debian"},"content":{"rendered":"<p><a href=\"https:\/\/github.com\/m-labs\/migen\">Migen<\/a> est une tentative open-source de faire du design FPGA en python. La solution initi\u00e9e par S.Bourdeauducq (principale d\u00e9veloppeur de <a href=\"http:\/\/m-labs.hk\/m1.html\">milkymist<\/a>) permet de simuler le design en python pur et de le g\u00e9n\u00e9rer en v\u00e9rilog pour la synth\u00e8se sur le FPGA proprement dite.<\/p>\n<p><strong>Installation sur debian Wheezy<\/strong><\/p>\n<p>Pour installer Migen, il faut tout d&rsquo;abord \u00abcloner\u00bb le projet git hub avec la commande suivante :<\/p>\n<pre><code>\r\n$ git clone https:\/\/github.com\/m-labs\/migen.git\r\n<\/code><\/pre>\n<p>Puis de se rendre dans le r\u00e9pertoire ainsi cr\u00e9\u00e9 et de taper la commande d&rsquo;installation suivante:<\/p>\n<pre><code>\r\n$ cd migen\r\n$ sudo python3 setup.py install\r\nMigen requires python 3.3 or greater\r\n<\/code><\/pre>\n<p>Premier probl\u00e8me sur debian wheezy : python est trop vieux. Comme le dit le message il nous faut un python 3.3 minimum, et celui de wheezy en est \u00e0 la version 3.2 \ud83d\ude41<\/p>\n<p>Il va donc nous falloir installer la derni\u00e8re version 3.4 de <a href=\"https:\/\/www.python.org\/ftp\/python\/3.4.0\/Python-3.4.0.tar.xz\">python <\/a>(tant qu&rsquo;\u00e0 faire prendre la derni\u00e8re).<\/p>\n<pre><code>\r\ntar -Jxvf Python-3.4.0.tar.xz\r\ncd Python-3.4.0\r\n.\/configure\r\nmake\r\nmake test\r\nsudo make install\r\n<\/code><\/pre>\n<p>De l\u00e0 il est facile de s&rsquo;installer Migen<\/p>\n<pre><code>\r\nsudo python3.4 setup.py install\r\n<\/code><\/pre>\n<p><strong>Icarus<\/strong><\/p>\n<p>Migen g\u00e9n\u00e8re du code en verilog. Pour pouvoir le simuler <a href=\"http:\/\/m-labs.hk\/migen-tutorial.pdf\">il est conseill\u00e9 d&rsquo;utiliser\u00a0<\/a> le simulateur libre <a href=\"http:\/\/iverilog.icarus.com\/\">Icarus<\/a>, logiciel qui se trouve dans le paquet \u00abverilog\u00bb de debian :<\/p>\n<pre><code>\r\nsudo apt-get install verilog\r\n<\/code><\/pre>\n<p>Dans le r\u00e9pertoire vpi des sources de migen il faut \u00e9galement g\u00e9n\u00e9rer le plugin permettant de se connecter \u00e0 icarus :<\/p>\n<pre><code>\r\n$ cd migen\/vpi\/\r\n$ make\r\n$ sudo make install\r\ninstall -m755 -t \/usr\/lib\/ivl migensim.vpi\r\n<\/code><\/pre>\n<p><strong>Premiers pas avec Migen<\/strong><\/p>\n<p>Le \u00abhelloworld\u00bb de l&rsquo;\u00e9lectronicien, c&rsquo;est la led qui clignote. La conception sur FPGA se rapprochant plus de l&rsquo;\u00e9lectronique que du logiciel, \u00e7a ne loupe pas : l&rsquo;exemple donn\u00e9 dans la doc est une led qui clignote !<\/p>\n<p>L&rsquo;exemple pose plusieurs probl\u00e8me :<\/p>\n<p><em>testmigen.py :<\/em><\/p>\n<pre><code>\r\nfrom migen.fhdl.std import *\r\nfrom mibuild.platforms import m1\r\nplat = m1.Platform()\r\nled = plat.request(\"user_led\")\r\nm = Module()\r\ncounter = Signal(26)\r\nm.comb += led.eq(counter[25])\r\nm.sync += counter.eq(counter + 1)\r\nplat.build_cmdline(m)\r\n<\/code><\/pre>\n<p>Si on ex\u00e9cute tel quel ce code on tombe sur une erreur de path \u00ab\/opt\/Xilinx\u00bb<\/p>\n<pre><code>\r\n$ python3.4 testmigen.py\r\nTraceback (most recent call last):\r\nFile \"testmigen.py\", line 11, in \r\nplat.build_cmdline(m)\r\nFile \"\/usr\/local\/lib\/python3.4\/site-packages\/migen-unknown-py3.4.egg\/mibuild\/generic_platform.py\", line 272, in build_cmdline\r\nself.build(*args, **kwargs)\r\nFile \"\/usr\/local\/lib\/python3.4\/site-packages\/migen-unknown-py3.4.egg\/mibuild\/xilinx_ise.py\", line 246, in build\r\nself.map_opt, self.par_opt)\r\nFile \"\/usr\/local\/lib\/python3.4\/site-packages\/migen-unknown-py3.4.egg\/mibuild\/xilinx_ise.py\", line 133, in _run_ise\r\nvers = [ver for ver in os.listdir(ise_path) if _is_valid_version(ise_path, ver)]\r\nFileNotFoundError: [Errno 2] No such file or directory: '\/opt\/Xilinx'\r\n<\/code><\/pre>\n<p>Car Migen est capable d&rsquo;aller jusqu\u2019\u00e0 la g\u00e9n\u00e9ration du design avec le <a href=\"http:\/\/www.xilinx.com\/products\/design-tools\/ise-design-suite\/ise-webpack.htm\">webpack de xilinx<\/a>. Mais pour cela il faut lui indiquer le bon chemin d&rsquo;<a href=\"http:\/\/www.armadeus.com\/wiki\/index.php?title=ISE_WebPack_installation_on_Linux\">installation de ISE<\/a>. Le code python de Migen r\u00e9f\u00e9ren\u00e7ant en dur le path, pour \u00e9viter de toucher au code, le plus simple est de faire un liens sur \/opt\/Xilinx.<\/p>\n<pre><code>\r\n$ sudo ln -s ~\/myxilinxinstallation\/ \/opt\/Xilinx\r\n$ sudo chmod 755 \/opt\/Xilinx\r\n<\/code><\/pre>\n<p>De cette mani\u00e8re, nous pouvons maintenant lancer le \u00abhelloworld\u00bb qui va nous g\u00e9n\u00e9rer le bitstream final directement :<\/p>\n<pre><code>\r\n$ python3.4 testmigen.py\r\n...\r\nSun May 4 16:06:25 2014\r\n\r\nRunning DRC.\r\nDRC detected 0 errors and 0 warnings.\r\nCreating bit map...\r\nSaving bit stream in \"top.bit\".\r\nSaving bit stream in \"top.bin\".\r\nBitstream generation is complete.\r\n<\/code><\/pre>\n<p>Tous les fichiers g\u00e9n\u00e9r\u00e9s se trouve dans le r\u00e9pertoire \u00abbuild\u00bb :<\/p>\n<pre><code>\r\n$ ls build\/\r\nbuild_top.sh top.bin top.drc top_map.ncd top.ngc top.pad top_par.xrpt top.srp top_usage.xml usage_statistics_webtalk.html xst\r\nnetlist.lst top.bit top.lso top_map.ngm top.ngc_xst.xrpt top_pad.csv top.pcf top_summary.xml top.v webtalk.log\r\npar_usage_statistics.html top_bitgen.xwbt top_map.map top_map.xrpt top.ngd top_pad.txt top.prj top.ucf top.xpi xlnx_auto_0_xdb\r\ntop.bgn top.bld top_map.mrp top.ncd top_ngdbuild.xrpt top.par top.ptwx top.unroutes top.xst _xmsgs\r\n<\/code><\/pre>\n<p><strong>Et la led ne clignote toujours pas !<\/strong><\/p>\n<p>Deuxi\u00e8me probl\u00e8me de l&rsquo;exemple : la plate-forme utilis\u00e9e est une <a href=\"http:\/\/m-labs.hk\/m1.html\">m1<\/a>, or nous utilisons une <a href=\"http:\/\/www.armadeus.com\/francais\/produits-cartes_microprocesseur-apf27.html\">apf27<\/a>.\u00a0 Il faut que nous importions la bonne plate-forme pour pouvoir faire clignoter notre led. Nous allons donc changer notre script python pour int\u00e9grer l&rsquo;apf27:<\/p>\n<div dir=\"ltr\">\n<pre class=\"source-python\"><span class=\"co1\">#!\/usr\/local\/bin\/python3.4<\/span>\r\n<span class=\"co1\"># -*- coding: utf-8 -*-<\/span>\r\n\u00a0\r\n<span class=\"kw1\">from<\/span> migen.<span class=\"me1\">fhdl<\/span>.<span class=\"me1\">std<\/span> <span class=\"kw1\">import<\/span> *\r\n<span class=\"kw1\">from<\/span> mibuild.<span class=\"me1\">generic_platform<\/span> <span class=\"kw1\">import<\/span> Pins, IOStandard\r\n<span class=\"kw1\">from<\/span> mibuild.<span class=\"me1\">platforms<\/span> <span class=\"kw1\">import<\/span> apf27\r\n\u00a0\r\nios = <span class=\"br0\">[<\/span>\r\n    <span class=\"br0\">(<\/span><span class=\"st0\">\"user_led\"<\/span>, <span class=\"nu0\">0<\/span>, Pins<span class=\"br0\">(<\/span><span class=\"st0\">\"J2:22\"<\/span><span class=\"br0\">)<\/span>, IOStandard<span class=\"br0\">(<\/span><span class=\"st0\">\"LVCMOS33\"<\/span><span class=\"br0\">)<\/span><span class=\"br0\">)<\/span>\r\n<span class=\"br0\">]<\/span>\r\n\u00a0\r\nplat = apf27.<span class=\"me1\">Platform<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span>\r\nplat.<span class=\"me1\">add_extension<\/span><span class=\"br0\">(<\/span>ios<span class=\"br0\">)<\/span>\r\nled = plat.<span class=\"me1\">request<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"user_led\"<\/span>, <span class=\"nu0\">0<\/span><span class=\"br0\">)<\/span>  <span class=\"co1\"># led pin on apf27dev<\/span>\r\nm = Module<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span>\r\ncounter = Signal<span class=\"br0\">(<\/span><span class=\"nu0\">26<\/span><span class=\"br0\">)<\/span>\r\nm.<span class=\"me1\">comb<\/span> += led.<span class=\"me1\">eq<\/span><span class=\"br0\">(<\/span>counter<span class=\"br0\">[<\/span><span class=\"nu0\">25<\/span><span class=\"br0\">]<\/span><span class=\"br0\">)<\/span>\r\nm.<span class=\"me1\">sync<\/span> += counter.<span class=\"me1\">eq<\/span><span class=\"br0\">(<\/span>counter + <span class=\"nu0\">1<\/span><span class=\"br0\">)<\/span>\r\nplat.<span class=\"me1\">build_cmdline<\/span><span class=\"br0\">(<\/span>m<span class=\"br0\">)<\/span><\/pre>\n<\/div>\n<p>Le bitstream g\u00e9n\u00e9r\u00e9 se nomme <em>top.bit<\/em> et se trouve dans le r\u00e9pertoire \u00abbuild\u00bb nouvellement cr\u00e9\u00e9.<\/p>\n<p>Il suffit ensuite de t\u00e9l\u00e9charger top.bit sur le fpga (via <a href=\"http:\/\/www.armadeus.com\/wiki\/index.php?title=Target_Software_Installation#FPGA_firmware_test\">uboot<\/a> ou via <a href=\"http:\/\/www.armadeus.com\/wiki\/index.php?title=FPGA_loader\">Linux<\/a> au choix)<\/p>\n<p><strong>Et la led clignote !<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Migen est une tentative open-source de faire du design FPGA en python. La solution initi\u00e9e par S.Bourdeauducq (principale d\u00e9veloppeur de milkymist) permet de simuler le design en python pur et de le g\u00e9n\u00e9rer en v\u00e9rilog pour la synth\u00e8se sur le FPGA proprement dite. Installation sur debian Wheezy Pour installer Migen, il faut tout d&rsquo;abord \u00abcloner\u00bb &hellip; <a href=\"http:\/\/www.fabienm.eu\/flf\/experimentations-de-migen-sur-apf27-avec-debian\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Exp\u00e9rimentations de Migen sur APF27 avec debian<\/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":[5],"tags":[58],"class_list":["post-7","post","type-post","status-publish","format-standard","hentry","category-migen","tag-migen"],"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":"Migen est une tentative open-source de faire du design FPGA en python. La solution initi\u00e9e par S.Bourdeauducq (principale d\u00e9veloppeur de milkymist) permet de simuler le design en python pur et de le g\u00e9n\u00e9rer en v\u00e9rilog pour la synth\u00e8se sur le FPGA proprement dite. Installation sur debian Wheezy Pour installer Migen, il faut tout d&rsquo;abord \u00abcloner\u00bb\u2026","_links":{"self":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/7","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=7"}],"version-history":[{"count":5,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/7\/revisions"}],"predecessor-version":[{"id":12,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/7\/revisions\/12"}],"wp:attachment":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/media?parent=7"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/categories?post=7"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/tags?post=7"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}