{"id":1496,"date":"2020-03-14T20:47:08","date_gmt":"2020-03-14T19:47:08","guid":{"rendered":"http:\/\/www.fabienm.eu\/flf\/?p=1496"},"modified":"2020-10-01T20:47:48","modified_gmt":"2020-10-01T19:47:48","slug":"apicula-lancement-de-la-liberation-du-fpga-gowin-gw1n","status":"publish","type":"post","link":"https:\/\/www.fabienm.eu\/flf\/apicula-lancement-de-la-liberation-du-fpga-gowin-gw1n\/","title":{"rendered":"Apicula : lancement de la lib\u00e9ration du FPGA Gowin GW1N"},"content":{"rendered":"\n<p>[D\u00e9p\u00e8che \u00e9crite initialement pour <a href=\"https:\/\/linuxfr.org\/news\/apicula-lancement-de-la-liberation-du-fpga-gowin-gw1n\">LinuxFR<\/a>]<\/p>\n\n\n\n<p>Le lecteur assidu de <em>LinuxFr.org<\/em> sait d\u00e9j\u00e0 sans doute ce qu\u2019est un <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Circuit_logique_programmable#FPGA\">FPGA<\/a>. Rappelons\u2011en cependant bri\u00e8vement la&nbsp;d\u00e9finition.<\/p>\n\n\n\n<p>Les FPGA sont des composants constitu\u00e9s de \u00ab&nbsp;champs de portes \nprogrammables&nbsp;\u00bb. L\u2019id\u00e9e est de graver un certain nombre d\u2019\u00e9l\u00e9ments \nlogiques simples sous forme de matrice et de laisser au d\u00e9veloppeur le \nloisir de reconfigurer \u00e0 l\u2019infini les connexions entre ces&nbsp;portes. Une \nfois les connexions configur\u00e9es, on se retrouve avec un composant \nnum\u00e9rique sur mesure qui ne ressemble \u00e0 aucun composant disponible chez \nles fournisseurs classiques. C\u2019est tr\u00e8s pratique quand on a besoin \nd\u2019architectures b\u00e2tardes, ou quand justement on d\u00e9veloppe un composant \nnum\u00e9rique&nbsp;: \u00e7a permet de reconfigurer \u00e0 l\u2019infini pour d\u00e9verminer et \n\u00e9valuer les&nbsp;performances.<\/p>\n\n\n\n<p><a href=\"http:\/\/pepijndevos.nl\/\">Pepijn&nbsp;de&nbsp;Vos<\/a> a effectu\u00e9 un stage pour <a href=\"https:\/\/www.symbioticeda.com\/\">Symbiotic&nbsp;EDA<\/a>. Et l\u2019ing\u00e9nierie inverse du GW1N \u00e9tait son sujet de stage. Il a rendu son rapport avant No\u00ebl sur <a href=\"https:\/\/github.com\/pepijndevos\/internshipreport\">GitHub<\/a> et a publi\u00e9 le code source du projet <a href=\"https:\/\/github.com\/pepijndevos\/apicula\/\">Apicula<\/a>.<\/p>\n\n\n\n<p>Vous voulez en savoir plus, lisez la&nbsp;suite\u2026<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sommaire<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/linuxfr.org\/news\/apicula-lancement-de-la-liberation-du-fpga-gowin-gw1n#toc-le-gowin-gw1n\">Le Gowin GW1N<\/a><\/li><li><a href=\"https:\/\/linuxfr.org\/news\/apicula-lancement-de-la-liberation-du-fpga-gowin-gw1n#toc-mais-alors-cette-led-clignotante-ellevient\">Mais alors, cette LED clignotante, elle&nbsp;vient\u202f?<\/a><\/li><li><a href=\"https:\/\/linuxfr.org\/news\/apicula-lancement-de-la-liberation-du-fpga-gowin-gw1n#toc-architectures-de-d%C3%A9veloppement-h%C3%A9t%C3%A9roclites\">Architectures de d\u00e9veloppement h\u00e9t\u00e9roclites<\/a><\/li><li><a href=\"https:\/\/linuxfr.org\/news\/apicula-lancement-de-la-liberation-du-fpga-gowin-gw1n#toc-cest-encore-tr%C3%A8s-exp%C3%A9rimental\">C\u2019est encore tr\u00e8s exp\u00e9rimental<\/a><\/li><li><a href=\"https:\/\/linuxfr.org\/news\/apicula-lancement-de-la-liberation-du-fpga-gowin-gw1n#toc-super-comment-je-fais-pourcontribuer\">Super\u202f! Comment je fais pour&nbsp;contribuer\u202f?<\/a><\/li><\/ul>\n\n\n\n<p>Parlons maintenant du grand drame des FPGA&nbsp;: ils sont compl\u00e8tement \nverrouill\u00e9s car, pour reconfigurer ces fameuses connexions, il faut leur\n t\u00e9l\u00e9verser un fichier nomm\u00e9 <em>bitstream<\/em> qu\u2019aucun constructeur de\n FPGA ne documente. Ce drame conduit les libristes que nous sommes \u00e0 se \ntaper des installations d\u2019outils propri\u00e9taires particuli\u00e8rement \nvolumineux (surtout dans le cas de Xilinx et Altera) et pas toujours \ntr\u00e8s stables. Tout \u00e7a pour g\u00e9n\u00e9rer le fameux <em>bitstream<\/em>.<\/p>\n\n\n\n<p>Le format du <em>bitstream<\/em> n\u2019est pourtant pas chiffr\u00e9. <a href=\"http:\/\/www.fabienm.eu\/flf\/wp-content\/uploads\/2014\/11\/Note2008.pdf\">Depuis plus d\u2019une d\u00e9cennie, on&nbsp;sait<\/a>\n qu\u2019il est parfaitement possible d\u2019en faire l\u2019ing\u00e9nierie inverse. Mais \nrien n\u2019avait boug\u00e9 jusqu\u2019en&nbsp;2015 quand Clifford (qui se pr\u00e9nomme \nmaintenant <a href=\"http:\/\/www.clifford.at\/\">Claire<\/a>) Wolf a sorti sa suite open&nbsp;source pour le Lattice&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/ICE_(FPGA)#iCE40_(40_nm)\">iCE40<\/a>&nbsp;: <a href=\"http:\/\/www.clifford.at\/icestorm\/\">IceStorm<\/a>. Le projet IceStorm avait pour but d\u2019analyser toute la gamme des FPGA iCE40 pour en documenter le format du <em>bitstream<\/em>.\n Projet qui a parfaitement abouti et essaim\u00e9&nbsp;: toute la gamme des iCE40 \nest d\u00e9sormais accessible au moyen d\u2019outils open&nbsp;source, ainsi que la \ngamme des <a href=\"https:\/\/www.latticesemi.com\/Products\/FPGAandCPLD\/ECP5\">ECP5<\/a> avec le <a href=\"https:\/\/github.com\/SymbiFlow\/prjtrellis\">Projet&nbsp;Trellis<\/a>.<\/p>\n\n\n\n<p>Presque tous les mod\u00e8les de FPGA ont leur <a href=\"http:\/\/www.fabienm.eu\/flf\/materiel\/liberation-des-fpga\/\">projet d\u2019ing\u00e9nierie inverse<\/a> aujourd\u2019hui. Tous ne sont pas termin\u00e9s, loin s\u2019en faut. N\u00e9anmoins, quelques\u2011uns avancent, comme le projet <a href=\"https:\/\/github.com\/pepijndevos\/apicula\/\">Apicula<\/a> de Pepijn&nbsp;de&nbsp;Vos ciblant les FPGA du constructeur chinois <a href=\"https:\/\/www.gowinsemi.com\/en\/\">Gowin<\/a>.\n Dire que le projet Apicula est abouti serait un raccourci un peu \nrapide, il manque encore en effet un certain nombre de blocs \u00e0 d\u00e9coder. \nCependant, il est possible aujourd\u2019hui de r\u00e9aliser un projet tr\u00e8s simple\n (UNE LED QUI CLIGNOTE\u202f\\o\/) gr\u00e2ce au travail effectu\u00e9.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"toc-le-gowin-gw1n\">Le Gowin GW1N<\/h2>\n\n\n\n<p>Voici l\u2019architecture du GW1N donn\u00e9e dans la <a href=\"http:\/\/dl.sipeed.com\/TANG\/Nano\/HDK\/GW1N-Datasheet(English)\/GW1N%20series%20of%20FPGA%20Products%20Data%20Sheet.pdf\">documentation du&nbsp;composant<\/a>&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/img.linuxfr.org\/img\/687474703a2f2f7777772e66616269656e6d2e65752f706172746167652f676f77696e6c69626572652f6777316e5f617263682e706e67\/gw1n_arch.png\" alt=\"Architecture global du GW1N\"\/><\/figure>\n\n\n\n<p> \u2003<em>Oui, toi aussi, cher lecteur, tu te demandes bien l\u2019int\u00e9r\u00eat de ce zoom.\u202f;)<\/em><\/p>\n\n\n\n<p>On voit diff\u00e9rents \u00e9l\u00e9ments dans ce sch\u00e9ma, de la m\u00e9moire vive, des <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Boucle_%C3%A0_phase_asservie\">PLL<\/a> pour g\u00e9n\u00e9rer les horloges, des multiplieurs c\u00e2bl\u00e9s (<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Processeur_de_signal_num%C3%A9rique\">DSP<\/a>), des blocs d\u2019entr\u00e9es\u2011sorties (IOB) et surtout \u2014&nbsp;ce&nbsp;que l\u2019on voit le&nbsp;plus&nbsp;\u2014 des&nbsp;CFU (<em>Configurable Function&nbsp;Unit<\/em>).<\/p>\n\n\n\n<p>Chez Gowin, le CFU est l\u2019\u00e9l\u00e9ment de base constitu\u00e9 ainsi&nbsp;:<br>\n<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/img.linuxfr.org\/img\/687474703a2f2f7777772e66616269656e6d2e65752f706172746167652f676f77696e6c69626572652f4346552e706e67\/CFU.png\" alt=\"Sch\u00e9ma d\u2019architecture CFU\"\/><\/figure>\n\n\n\n<p>Les deux \u00e9l\u00e9ments qui nous int\u00e9ressent ici sont&nbsp;: la <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Table_de_correspondance\">LUT<\/a> (<em>Look&nbsp;Up&nbsp;Table<\/em>) et le REG (registre). Ces deux \u00e9l\u00e9ments sont la base de la logique synchrone.<\/p>\n\n\n\n<p>Le registre recopie son entr\u00e9e sur la sortie au front montant de l\u2019horloge, la sortie restant stable le reste du&nbsp;temps.<\/p>\n\n\n\n<p>La LUT, comme son nom anglais l\u2019indique, est une <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Table_de_v%C3%A9rit%C3%A9\">table&nbsp;de&nbsp;v\u00e9rit\u00e9<\/a>,\n qui, dans le cas de ce petit FPGA, comporte quatre entr\u00e9es binaires et \nune sortie. La configuration du FPGA viendra remplir cette table de \nv\u00e9rit\u00e9 pour r\u00e9aliser une fonction logique. Le registre se trouvant \nderri\u00e8re se charge ensuite de verrouiller le r\u00e9sultat au rythme \nde&nbsp;l\u2019horloge.<\/p>\n\n\n\n<p>Si l\u2019on arrive \u00e0 d\u00e9chiffrer  le <em>bitstream<\/em> pour pouvoir \nconfigurer ces LUT, ces registres ainsi que les blocs d\u2019entr\u00e9es\u2011sorties \n(IOB), alors on a (presque) gagn\u00e9&nbsp;: on peut r\u00e9aliser un composant simple\n mais fonctionnel.<\/p>\n\n\n\n<p>Et c\u2019est ce qu\u2019a r\u00e9alis\u00e9 Pepijn&nbsp;de&nbsp;Vos, on peut donc dire qu\u2019il a amorc\u00e9 la lib\u00e9ration du GW1N de&nbsp;Gowin\u202f!<\/p>\n\n\n\n<p>Le projet n\u2019est cependant pas termin\u00e9, il faut encore d\u00e9chiffrer les \nautres blocs pour permettre l\u2019utilisation compl\u00e8te du FPGA. Il faut \n\u00e9galement r\u00e9ussir \u00e0 documenter les temps de propagation des signaux \nentre les diff\u00e9rents blocs. L\u2019information de ces temps de propagation \npermet au logiciel de placement routage (<a href=\"https:\/\/github.com\/YosysHQ\/nextpnr\">nextpnr<\/a>, pour ne citer que le plus c\u00e9l\u00e8bre en&nbsp;libre) de faire son travail correctement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"toc-mais-alors-cette-led-clignotante-ellevient\">Mais alors, cette LED clignotante, elle&nbsp;vient\u202f?<\/h2>\n\n\n\n<p>Minute, papillon\u202f! Dans un premier temps, il va falloir trouver une \ncarte \u00e9lectronique munie d\u2019un FPGA de Gowin. Nous allons ensuite nous \nservir des donn\u00e9es d\u00e9j\u00e0 produites par le projet Apicula pour faire la \nsynth\u00e8se avec <a href=\"http:\/\/www.clifford.at\/yosys\/\">Yosys<\/a>, puis le placement\u2010routage avec&nbsp;nextpnr.<\/p>\n\n\n\n<p>Pour le moment, deux kits de d\u00e9veloppement ont \u00e9t\u00e9 utilis\u00e9s dans le projet&nbsp;Apicula&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>le kit <a href=\"https:\/\/shop.trenz-electronic.de\/en\/TEC0117-01-FPGA-Module-with-GOWIN-LittleBee-and-8-MByte-internal-SDRAM\">LittleBee&nbsp;TEC0117<\/a>, des Allemands de Trenz&nbsp;Electronic (~\u202f30\u202f\u20ac)\u202f;<\/li><li>le kit <a href=\"http:\/\/www.fabienm.eu\/flf\/longan-nano-deballage\/\">Tang&nbsp;Nano<\/a>, des Chinois de&nbsp;<a href=\"https:\/\/www.sipeed.com\/\">Sipeed<\/a>&nbsp;(~\u202f5\u202f\u20ac).<\/li><\/ul>\n\n\n\n<p>Nous allons tester avec le kit allemand TEC0117, mais le Tang&nbsp;Nano ne\n change pas grand\u2019chose \u00e0 la proc\u00e9dure (et il est moins&nbsp;cher).<\/p>\n\n\n\n<p>On doit installer&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<ul class=\"wp-block-list\"><li> <a href=\"https:\/\/github.com\/YosysHQ\/yosys\">Yosys<\/a>, le logiciel de synth\u00e8se <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Verilog\">Verilog<\/a>. Pour le d\u00e9tail des d\u00e9pendances et autres subtilit\u00e9s d\u2019installation, voir le site officiel. Sinon, pour&nbsp;r\u00e9sumer&nbsp;: <\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone https:\/\/github.com\/YosysHQ\/yosys.git\ncd yosys make sudo make install<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li> <a href=\"https:\/\/github.com\/YosysHQ\/nextpnr\">nextpnr<\/a>, le logiciel  de placement routage. Il faut le compiler avec le param\u00e8tre \u00abgeneric\u00bb.  Les deux autres param\u00e8tres possible \u00e0 ma connaissance sont <code>ice40<\/code> et <code>ecp5<\/code> (les deux gammes de FPGA vraiment prises en charge par&nbsp;nextpnr)&nbsp;: <code>git clone https:\/\/github.com\/YosysHQ\/nextpnr.git cd nextpnr\/ cmake -DARCH=generic . make sudo make install<\/code> <em>Dans mon cas, j\u2019ai d\u00fb forcer l\u2019utilisation de Python&nbsp;3.7 dans le fichier <code>CMakeLists.txt<\/code>&nbsp;: <code>find_package(PythonInterp 3.7 REQUIRED);<\/code> pour pouvoir ex\u00e9cuter les scripts en argument avec Python&nbsp;3.7.<\/em> <\/li><li> <a href=\"https:\/\/github.com\/pepijndevos\/apicula\/\">Apicula<\/a>, dont il faut cloner le d\u00e9p\u00f4t&nbsp;Git&nbsp;: <code>git clone https:\/\/github.com\/pepijndevos\/apicula.git cd apicula<\/code> <\/li><li>pour l\u2019instant la \u00ab&nbsp;base de&nbsp;donn\u00e9es&nbsp;\u00bb des \u00e9l\u00e9ments trouv\u00e9s par  ing\u00e9nierie inverse n\u2019est pas \u00ab&nbsp;commit\u00e9&nbsp;\u00bb dans le projet Apicula, il faut  donc avoir une installation de l\u2019<a href=\"https:\/\/gowinsemi.com\/en\/support\/home\/\">EDI&nbsp;officiel de&nbsp;Gowin<\/a>\u202f;  les scripts du projet Apicula iront fouiller dans les donn\u00e9es de l\u2019IDE  pour g\u00e9n\u00e9rer un fichier intelligible en JSON et pickle (Python), il  n\u2019est cependant pas n\u00e9cessaire d\u2019avoir la&nbsp;licence\u202f;<\/li><li> il faut \u00e9galement aller chercher le \u00ab&nbsp;<em>pinout<\/em>&nbsp;\u00bb de nos FPGA sur le site officiel de Gowin et le mettre dans son r\u00e9pertoire local nomm\u00e9 <code>~\/Documents\/gowinsemi<\/code>&nbsp;: <ul><li> <a href=\"https:\/\/www.gowinsemi.com\/en\/search\/?search=GW1NR-9+pinout\">GW1NR-9<\/a>, pour le kit TEC0117,<\/li><li> <a href=\"https:\/\/www.gowinsemi.com\/en\/search\/?search=GW1N-1+pinout\">GW1N-1<\/a>, pour le Tang&nbsp;Nano. <\/li><\/ul><\/li><\/ul>\n<\/div><\/div>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><\/code><\/pre>\n\n\n\n<p>Maintenant que nous avons les outils install\u00e9s, lan\u00e7ons l\u2019exemple g\u00e9n\u00e9rique du projet Apicula&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li> d\u2019abord, on g\u00e9n\u00e8re la base de donn\u00e9es des \u00e9l\u00e9ments du&nbsp;FPGA&nbsp;: <code>export GOWINHOME=\/chemin\/de\/linstallation\/gowin\/IDE\/ export DEVICE=\"GW1NR-9\" # TEC0117 python dat19_h4x.py # makes $DEVICE.json python tiled_fuzzer.py # makes $DEVICE.pickle<\/code> <\/li><li> muni de cette base de donn\u00e9es, on peut se lancer dans la synth\u00e8se du  (pas&nbsp;si) simple porte\u2011gramme de clignotement de LED donn\u00e9 en Verilog  ci\u2011dessous&nbsp;: <code>module top;     wire clk;     (* BEL=\"R29C29_IOBA\", keep *)     GENERIC_IOB #(.INPUT_USED(1), .OUTPUT_USED(0)) clk_ibuf (.O(clk));     wire [7:0] leds;     (* BEL=\"R1C8_IOBA\", keep *)     GENERIC_IOB #(.INPUT_USED(0), .OUTPUT_USED(1)) led7_obuf (.I(leds[7]));     (* BEL=\"R1C8_IOBB\", keep *)     GENERIC_IOB #(.INPUT_USED(0), .OUTPUT_USED(1)) led6_obuf (.I(leds[6]));     (* BEL=\"R1C10_IOBA\", keep *)     GENERIC_IOB #(.INPUT_USED(0), .OUTPUT_USED(1)) led5_obuf (.I(leds[5]));     (* BEL=\"R1C10_IOBB\", keep *)     GENERIC_IOB #(.INPUT_USED(0), .OUTPUT_USED(1)) led4_obuf (.I(leds[4]));     (* BEL=\"R1C11_IOBA\", keep *)     GENERIC_IOB #(.INPUT_USED(0), .OUTPUT_USED(1)) led3_obuf (.I(leds[3]));     (* BEL=\"R1C11_IOBB\", keep *)     GENERIC_IOB #(.INPUT_USED(0), .OUTPUT_USED(1)) led2_obuf (.I(leds[2]));     (* BEL=\"R1C12_IOBA\", keep *)     GENERIC_IOB #(.INPUT_USED(0), .OUTPUT_USED(1)) led1_obuf (.I(leds[1]));     (* BEL=\"R1C12_IOBB\", keep *)     GENERIC_IOB #(.INPUT_USED(0), .OUTPUT_USED(1)) led0_obuf (.I(leds[0])); reg [25:0] ctr; always @(posedge clk)     ctr &lt;= ctr + 1'b1; assign leds = ctr[25:18]; endmodule<\/code> <em>Un habitu\u00e9 des LED qui clignotent en Verilog reconna\u00eetra tout de suite le compteur dans les derni\u00e8res lignes (<code>always<\/code>, <code>reg<\/code>\u2026)  mais sera peut\u2011\u00eatre perturb\u00e9 par la d\u00e9claration des entr\u00e9es\u2011sorties. Il  faut juste avoir en t\u00eate que le projet n\u2019est pas termin\u00e9 et qu\u2019il faut  se taper le placement\u2010routage des entr\u00e9es\u2011sorties \u00ab&nbsp;\u00e0&nbsp;la&nbsp;main&nbsp;\u00bb, d\u2019o\u00f9  les directives <code>(*&nbsp;...&nbsp;*)<\/code> et les modules <code>GENERIC_IOB()<\/code>.<\/em> <\/li><li> le script pour la synth\u00e8se et le placement routage est donn\u00e9 dans l\u2019exemple&nbsp;: <code>$ cd generic $ bash simple.sh blinky.v # TEC0117 $ cd .. $ python gowin_pack.py generic\/pnrblinky.json $ python gowin_unpack.py pack.fs $ yosys -p \"read_verilog -lib +\/gowin\/cells_sim.v; clean -purge; show\" unpack.v<\/code> <\/li><li> on doit se retrouver avec un <em>bitstream<\/em> nomm\u00e9 <code>pack.fs<\/code> que l\u2019on peut t\u00e9l\u00e9verser dans le FPGA au moyen de l\u2019utilitaire libre <a href=\"https:\/\/github.com\/trabucayre\/openFPGALoader\">openFPGALoader<\/a> maintenu par <em>Trabucayre<\/em> (Gwenhael Goavec\u2011Merou)&nbsp;: <code>openFPGALoader -m -b littleBee pack.fs # FOSS programmer Parse pack.fs:  Done erase SRAM Done Flash SRAM: [==================================================] 100.000000% Done SRAM Flash: FAIL <\/code> <em>Le <code>FAIL<\/code> est connu et vient d\u2019une sombre histoire de  somme de contr\u00f4le que openFPGALoader ne sait pas encore calculer et  qu\u2019Apicula ne fournit pas. Un ticket est ouvert sur le sujet dans le  projet, <a href=\"https:\/\/github.com\/trabucayre\/openFPGALoader\/issues\/14\"><em>Trabucayre<\/em> sera ravi d\u2019accepter des&nbsp;correctifs<\/a>.<\/em> <\/li><\/ul>\n\n\n\n<p>Et les huit LED doivent clignoter. Enfin, disons plut\u00f4t qu\u2019elles \ncomptent en binaire. Pour voir la vid\u00e9o des LED clignotantes, c\u2019est sur&nbsp;<a href=\"https:\/\/studio.youtube.com\/video\/yc2yBYlCCI4\/edit\">YouTube<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"toc-architectures-de-d\u00e9veloppement-h\u00e9t\u00e9roclites\">Architectures de d\u00e9veloppement h\u00e9t\u00e9roclites<\/h2>\n\n\n\n<p>Comme nous avons des outils <em>open&nbsp;source<\/em>, il est possible de \nd\u00e9velopper sur des ordinateurs \u00e0 base d\u2019architectures diff\u00e9rentes de \nx86. Voici un petit exemple de t\u00e9l\u00e9chargement d\u2019un <em>bitstream<\/em> sur Tang&nbsp;Nano au moyen d\u2019un Raspberry&nbsp;<em>Pi<\/em> (architecture&nbsp;ARM). Le <em>bitstream<\/em> en question permet de piloter un \u00e9cran&nbsp;\u00e0 cristaux&nbsp;liquides.<\/p>\n\n\n\n<p>Chose impossible \u00e0 faire avec les Vivado, Diamond et autres Quartus.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/img.linuxfr.org\/img\/687474703a2f2f7777772e747261627563617972652e636f6d2f67676d2f61706963756c6142725250492e737667\/apiculaBrRPI.svg\" alt=\"LCD sur Tang\u00a0Nano\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"toc-cest-encore-tr\u00e8s-exp\u00e9rimental\">C\u2019est encore tr\u00e8s exp\u00e9rimental<\/h2>\n\n\n\n<p>Comme nous venons de le voir, le projet Apicula est encore tr\u00e8s \nexp\u00e9rimental. Cependant, tous les ingr\u00e9dients sont l\u00e0 et la preuve de \nfonctionnement est faite. Donc, \u00e0 condition de mettre un minimum les \nmains dans le cambouis, on peut d\u00e9sormais g\u00e9n\u00e9rer des <em>bitstreams<\/em> pour les GW1Nx avec des outils <em>open&nbsp;source<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"toc-super-comment-je-fais-pourcontribuer\">Super\u202f! Comment je fais pour&nbsp;contribuer\u202f?<\/h2>\n\n\n\n<p>Autant d\u2019enthousiasme fait plaisir \u00e0&nbsp;voir. Pour contribuer, le mieux \nest d\u2019acqu\u00e9rir l\u2019une des deux cartes cit\u00e9es dans cette d\u00e9p\u00eache et \nd\u2019installer le logiciel officiel de Gowin.<br>\nEnsuite, diff\u00e9rentes commandes permettant de mettre le pied \u00e0 l\u2019\u00e9trier de l\u2019ing\u00e9nierie inverse sont donn\u00e9es sur le <a href=\"https:\/\/github.com\/pepijndevos\/apicula\/\"><code>README.md<\/code> du projet&nbsp;Apicula<\/a>.<\/p>\n\n\n\n<p>Sinon, n\u2019h\u00e9sitez pas \u00e0 laisser une <em>issue<\/em> sur le projet <a href=\"https:\/\/github.com\/pepijndevos\/apicula\/issues\">GitHub<\/a> ou d\u2019interpeller Pepijn directement sur le \u00ab&nbsp;<a href=\"https:\/\/twitter.com\/pepijndevos\">silo&nbsp;social Twitter<\/a>&nbsp;\u00bb. Pepijn est super content de voir des gens s\u2019int\u00e9resser au projet et r\u00e9pond tr\u00e8s&nbsp;vite.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Aller plus loin<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>\n<a href=\"https:\/\/linuxfr.org\/redirect\/105893\">GitHub du projet<\/a>\n(7 clics)\n<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>[D\u00e9p\u00e8che \u00e9crite initialement pour LinuxFR] Le lecteur assidu de LinuxFr.org sait d\u00e9j\u00e0 sans doute ce qu\u2019est un FPGA. Rappelons\u2011en cependant bri\u00e8vement la&nbsp;d\u00e9finition. Les FPGA sont des composants constitu\u00e9s de \u00ab&nbsp;champs de portes programmables&nbsp;\u00bb. L\u2019id\u00e9e est de graver un certain nombre d\u2019\u00e9l\u00e9ments logiques simples sous forme de matrice et de laisser au d\u00e9veloppeur le loisir de &hellip; <a href=\"https:\/\/www.fabienm.eu\/flf\/apicula-lancement-de-la-liberation-du-fpga-gowin-gw1n\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Apicula : lancement de la lib\u00e9ration du FPGA Gowin GW1N<\/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":[176,61,146,30],"class_list":["post-1496","post","type-post","status-publish","format-standard","hentry","category-non-classe","tag-apicula","tag-bitstream","tag-gowin","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":"https:\/\/www.fabienm.eu\/flf\/author\/admin\/"},"uagb_comment_info":0,"uagb_excerpt":"[D\u00e9p\u00e8che \u00e9crite initialement pour LinuxFR] Le lecteur assidu de LinuxFr.org sait d\u00e9j\u00e0 sans doute ce qu\u2019est un FPGA. Rappelons\u2011en cependant bri\u00e8vement la&nbsp;d\u00e9finition. Les FPGA sont des composants constitu\u00e9s de \u00ab&nbsp;champs de portes programmables&nbsp;\u00bb. L\u2019id\u00e9e est de graver un certain nombre d\u2019\u00e9l\u00e9ments logiques simples sous forme de matrice et de laisser au d\u00e9veloppeur le loisir de\u2026","_links":{"self":[{"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1496","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/comments?post=1496"}],"version-history":[{"count":3,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1496\/revisions"}],"predecessor-version":[{"id":1603,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1496\/revisions\/1603"}],"wp:attachment":[{"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/media?parent=1496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/categories?post=1496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/tags?post=1496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}