{"id":616,"date":"2013-11-15T13:04:06","date_gmt":"2013-11-15T11:04:06","guid":{"rendered":"http:\/\/www.martoni.fr\/wordpress\/?p=616"},"modified":"2013-11-15T13:04:58","modified_gmt":"2013-11-15T11:04:58","slug":"peripheralondemand-ise-et-la-ligne-de-commande","status":"publish","type":"post","link":"http:\/\/www.fabienm.eu\/wordpress\/2013\/11\/15\/peripheralondemand-ise-et-la-ligne-de-commande\/","title":{"rendered":"PeripheralOnDemand, ISE et la ligne de commande."},"content":{"rendered":"<p><a href=\"http:\/\/http:\/\/periphondemand.sourceforge.net\/\">POD (PeripheralOnDemand)<\/a> est un outils \u00e9crit en python permettant de g\u00e9n\u00e9rer un design pour les FPGA d&rsquo;armadeus sans avoir \u00e0 faire du VHDL\/Verilog. Cet utilitaire permet d&rsquo;int\u00e9grer des \u00abcomposants virtuels\u00bb disponibles sur \u00e9tag\u00e8re et de g\u00e9n\u00e9rer le design.<\/p>\n<p>POD peut-\u00eatre utilis\u00e9 en ligne de commande pour cr\u00e9er un projet, mais il peut aussi \u00eatre script\u00e9 via l&rsquo;argument -s de la commande pod :<\/p>\n<pre><code>\r\n$ pod -s monscript.pod\r\n<\/code><\/pre>\n<p>On trouve un certain nombre de scripts POD dans le projet armadeus dans le r\u00e9pertoire <a href=\"https:\/\/sourceforge.net\/p\/armadeus\/code\/ci\/master\/tree\/firmware\/pod_scripts\/\">firmware\/pod_scripts\/<\/a>.<\/p>\n<p>Par exemple si nous avons besoin d&rsquo;utiliser le gsm ou le gps de la carte <a href=\"http:\/\/www.armadeus.com\/english\/products-development_boards-apf51_dev.html\">APF51dev<\/a> il faudra g\u00e9n\u00e9rer des uarts dans le FPGA au moyen du script  <a href=\"https:\/\/sourceforge.net\/p\/armadeus\/code\/ci\/master\/tree\/firmware\/pod_scripts\/apf51_gsm_gps_firmware.pod\">apf51_gsm_gps_firmware.pod<\/a> :<\/p>\n<pre><code>\r\n$ pod -s apf51_gsm_gps_firmware.pod\r\ncreate apf51_gsm_gps_firmware\r\nProject apf51_gsm_gps_firmware created\r\nPOD:apf51_gsm_gps_firmware> $ selectplatform standard.apf51\r\n[INFO]   : No platform in project\r\nComponent platform added as apf51\r\nComponent imx51_wb16_wrapper added as imx51_wb16_wrapper00\r\nComponent rstgen_syscon added as rstgen_syscon00\r\nComponent irq_mngr added as irq_mngr00\r\n\r\nPOD:apf51_gsm_gps_firmware> $ addinstance components.uart16750 gsm_uart\r\nComponent uart16750 added as gsm_uart\r\n\r\nPOD:apf51_gsm_gps_firmware> $ addinstance components.uart16750 gps_uart\r\nComponent uart16750 added as gps_uart\r\n\r\nPOD:apf51_gsm_gps_firmware> $ connectpin gsm_uart.interrupt.int_o.0 irq_mngr00.irq.irqport.0\r\n\r\nPOD:apf51_gsm_gps_firmware> $ connectpin gps_uart.interrupt.int_o.0 irq_mngr00.irq.irqport.1\r\n\r\nPOD:apf51_gsm_gps_firmware> $ connectpin gps_uart.uart.srx_pad_i.0 apf51.fpga.IO_L40P_M3DQ6_3\r\n\r\nPOD:apf51_gsm_gps_firmware> $ connectpin gps_uart.uart.stx_pad_o.0 apf51.fpga.IO_L42N_GCLK24_M3LDM_3\r\n\r\nPOD:apf51_gsm_gps_firmware> $ connectpin gsm_uart.uart.srx_pad_i.0 apf51.fpga.IO_L39P_M3LDQS_3\r\n\r\nPOD:apf51_gsm_gps_firmware> $ connectpin gsm_uart.uart.stx_pad_o.0 apf51.fpga.IO_L41P_GCLK27_M3DQ4_3\r\n\r\nPOD:apf51_gsm_gps_firmware> $ connectpin gsm_uart.uart.cts_pad_i.0 apf51.fpga.IO_L41N_GCLK26_M3DQ5_3\r\n\r\nPOD:apf51_gsm_gps_firmware> $ connectpin gsm_uart.uart.rts_pad_o.0 apf51.fpga.IO_L39N_M3LDQSN_3\r\n\r\nPOD:apf51_gsm_gps_firmware> $ autoconnectbus\r\nsetting base address 0x0 for  irq_mngr00.swb16\r\nsetting base address 0x20 for  gsm_uart.swb16\r\nsetting base address 0x40 for  gps_uart.swb16\r\nNo addressing value in this type of bus\r\nBus connected\r\n\r\nPOD:apf51_gsm_gps_firmware> $ generateintercon imx51_wb16_wrapper00.mwb16\r\nIntercon with name : imx51_wb16_wrapper00_mwb16_intercon Done\r\nComponent imx51_wb16_wrapper00_mwb16 added as imx51_wb16_wrapper00_mwb16_intercon\r\n\r\nPOD:apf51_gsm_gps_firmware> $ generateintercon rstgen_syscon00.candroutput\r\nIntercon with name : rstgen_syscon00_candroutput_intercon Done\r\nComponent rstgen_syscon00_candroutput added as rstgen_syscon00_candroutput_intercon\r\n\r\nPOD:apf51_gsm_gps_firmware> $ generatetop\r\n\r\nMapping for interface mwb16:\r\nAddress  | instance.interface             | size\r\n---------------------------------------------------------\r\n0x0 |               irq_mngr00.swb16 |          8\r\n0x08 |                       --void-- |         24\r\n0x20 |                 gsm_uart.swb16 |         32\r\n0x40 |                 gps_uart.swb16 |         32\r\n---------------------------------------------------------\r\n[INFO] : port gsm_uart.uart.dsr_pad_i is void. It will be set to '0'\r\n[INFO] : port gsm_uart.uart.ri_pad_i is void. It will be set to '1'\r\n[INFO] : port gsm_uart.uart.dcd_pad_i is void. It will be set to '0'\r\n[INFO] : port gps_uart.uart.cts_pad_i is void. It will be set to '0'\r\n[INFO] : port gps_uart.uart.dsr_pad_i is void. It will be set to '0'\r\n[INFO] : port gps_uart.uart.ri_pad_i is void. It will be set to '1'\r\n[INFO] : port gps_uart.uart.dcd_pad_i is void. It will be set to '0'\r\n\r\nTop generated with name : top_apf51_gsm_gps_firmware.vhd\r\nPOD:apf51_gsm_gps_firmware> $ synthesis.selecttoolchain ise\r\nPOD:apf51_gsm_gps_firmware> $ synthesis.generateproject\r\nMake directory for imx51_wb16_wrapper\r\nMake directory for rstgen_syscon\r\nMake directory for irq_mngr\r\nMake directory for uart16750\r\nMake directory for imx51_wb16_wrapper00_mwb16\r\nMake directory for rstgen_syscon00_candroutput\r\n\r\nConstraint file generated with name : firmware\/pod_scripts\/apf51_gsm_gps_firmware\/synthesis\/apf51_gsm_gps_firmware.ucf\r\n\r\nTCL script generated with name : apf51_gsm_gps_firmware.tcl\r\n\r\nPOD:apf51_gsm_gps_firmware> $ driver.selecttoolchain armadeus\r\n<\/code><\/pre>\n<p>Ce script a permit de g\u00e9n\u00e9rer tout le projet qui est maintenant disponible pour ISE. Pour simplifier son utilisation pod a g\u00e9n\u00e9r\u00e9 un script tcl firmware\/pod_scripts\/apf51_gsm_gps_firmware\/synthesis\/apf51_gsm_gps_firmware.tcl que l&rsquo;on peut \u00absourcer\u00bb dans la console tcl d&rsquo;ISE pour g\u00e9n\u00e9rer le bitstream.<\/p>\n<p>Cependant nous devons quand m\u00eame lancer l&rsquo;\u00e9norme programme qu&rsquo;est <a href=\"http:\/\/www.xilinx.com\/products\/design-tools\/ise-design-suite\/ise-webpack.htm\">ISE Webpack<\/a> pour lancer le script. Ce qui est r\u00e9ellement tr\u00e8s fastidieux. Jusqu&rsquo;ici nous \u00e9tions contraint de le faire \u00e0 cause d&rsquo;un bug d&rsquo;ISE qui emp\u00eachait de charger le fichier de contraintes *.ucf correctement.<\/p>\n<p>Ce bug a \u00e9t\u00e9 patch\u00e9 dans la derni\u00e8re release de POD et nous pouvons maintenant g\u00e9n\u00e9rer le bitstream en ligne de commande directement. Il suffit pour cela de taper les commandes suivantes :<\/p>\n<pre><code>\r\n$ cd apf51_gsm_gps_firmware\/synthesis\/\r\n# pour l'architecture 32bits, sinon c'est settings64.sh\r\n$ source ISE\/14.6\/ISE_DS\/settings32.sh\r\n$ xtclsh apf51_gsm_gps_firmware.tcl \r\n<\/code><\/pre>\n<p>Le script prend un certain temps \u00e0 s&rsquo;ex\u00e9cuter. Une fois termin\u00e9 nous retrouvons le bitstream dans le r\u00e9pertoire objs\/ du projet :<\/p>\n<pre><code>\r\n$ ls ..\/objs\/*.bin\r\n..\/objs\/top_apf51_gsm_gps_firmware.bin\r\n<\/code><\/pre>\n<p>Fichier que l&rsquo;on peut ensuite t\u00e9l\u00e9charger directement dans le fpga avec <a href=\"http:\/\/www.armadeus.com\/wiki\/index.php?title=Using_FPGA#Using_Armadeus_FPGA\">la m\u00e9thode de son choix<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>POD (PeripheralOnDemand) est un outils \u00e9crit en python permettant de g\u00e9n\u00e9rer un design pour les FPGA d&rsquo;armadeus sans avoir \u00e0 faire du VHDL\/Verilog. Cet utilitaire permet d&rsquo;int\u00e9grer des \u00abcomposants virtuels\u00bb disponibles sur \u00e9tag\u00e8re et de g\u00e9n\u00e9rer le design. POD peut-\u00eatre &hellip; <a href=\"http:\/\/www.fabienm.eu\/wordpress\/2013\/11\/15\/peripheralondemand-ise-et-la-ligne-de-commande\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[106,10],"tags":[],"class_list":["post-616","post","type-post","status-publish","format-standard","hentry","category-embarque","category-informatique"],"_links":{"self":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/616","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/comments?post=616"}],"version-history":[{"count":4,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/616\/revisions"}],"predecessor-version":[{"id":620,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/616\/revisions\/620"}],"wp:attachment":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/media?parent=616"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/categories?post=616"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/tags?post=616"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}