<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wikilegacy.armadeus.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=FabriceM</id>
	<title>ArmadeusWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://wikilegacy.armadeus.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=FabriceM"/>
	<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Special:Contributions/FabriceM"/>
	<updated>2026-04-27T22:46:44Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Association&amp;diff=9690</id>
		<title>Association</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Association&amp;diff=9690"/>
		<updated>2011-05-19T16:50:45Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Why become a member? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Legal status of the association==&lt;br /&gt;
The &amp;quot;Armadeus Project&amp;quot; is a French non-profit association (law 1907) that was founded in Mulhouse, France (68). We accept members from everywhere.&lt;br /&gt;
The production of the development boards used by the association is done by a privately owned company, which is independent of the project. Board reselling is done by the [http://www.armadeus.com armadeus systems] company, founded by Armadeus Project leaders.&lt;br /&gt;
&lt;br /&gt;
==To become a member==&lt;br /&gt;
&lt;br /&gt;
* At first, you must fill the [http://www.armadeus.com/assos_downloads/adhesion_en.pdf following membership form] and send it back either by mail (see form) or e-mail (adhesion(at)armadeus(dot)org).&lt;br /&gt;
* Then, go to the armadeus systems online shop and [https://ssl3.ovh.net/~armadeus/onlineshop/catalog/create_account.php?language=en create an account] (Do not buy any products just yet!!). &#039;&#039;&#039;IMPORTANT: Check Association Armadeus Project membership option when creating the account !!&#039;&#039;&#039;&lt;br /&gt;
* Then, after a few days (max. 3), the following message should appear when you log in: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Imamember.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Now you can buy your boards. You become a member as soon as you purchase at least one main board (here an APF9328). This will ensure that new members will develop on the same basis. After that you will receive your userid and your password to participate to this Wiki and project activities.   &#039;&#039;&#039;Everyone is welcome!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Members|Geographical position of the members]]&lt;br /&gt;
&lt;br /&gt;
[[MemberList|Active members list]]&lt;br /&gt;
&lt;br /&gt;
==Why become a member?==&lt;br /&gt;
* Benefit from special prices on the products (the goal of the association is not to make money)&lt;br /&gt;
* Participate to the development of new boards  &lt;br /&gt;
* Increase your experience&lt;br /&gt;
* Enjoy working with other developers through:&lt;br /&gt;
** 2 public IRC channels where we talk together in the evening and during the weekend: irc://irc.rezosup.org/#Armadeus and a second one irc://irc.rezosup.org/#Armadeus_eng to talk in English (access via web is possible through CGI client http://irc.u-psud.rezosup.org/cgi-bin/client.cgi )&lt;br /&gt;
** public mailing list: https://lists.sourceforge.net/lists/listinfo/armadeus-forum&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
* The boards bought through the association membership can not be used in a commercial product unless this product belongs to the association.&lt;br /&gt;
* The software/firmware developments realized within the association have to be GPL/LGPL compliant.&lt;br /&gt;
* The Armadeus Project association is not responsible for the misuse or malfunction of the developments performed within the association.&lt;br /&gt;
&lt;br /&gt;
==Buying hardware==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Minimum system is composed of an APF9328 and a DevLight V2. These boards can be bought online. Note that the displayed prices are the &amp;quot;commercial&amp;quot; ones and that the discounts are applied to association members only. Ex.: 22 euros discount on an APF9328_Dev_Light V2, visible by browsing the product information and &#039;&#039;&#039;only if the member is logged in&#039;&#039;&#039;. Therefore, in this case, the price will be 45 euros (not including taxes) for the members:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:devlightV2.png]]&lt;br /&gt;
&lt;br /&gt;
==Association prices (not including taxes)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.store.armadeus.com/assoc_prices.php Click here for the price list]&lt;br /&gt;
&lt;br /&gt;
==Remarks==&lt;br /&gt;
* No accessories (cable, power supply...) are delivered with the boards. You can purchase them at your favorite supplier for a few $&lt;br /&gt;
* Grouped orders can be organized for some special components, such as LCDs, special connectors...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{{LanguageBar|Association|Association|Verein}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Association]]&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Association&amp;diff=9689</id>
		<title>Association</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Association&amp;diff=9689"/>
		<updated>2011-05-19T16:50:23Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: Ajout d&amp;#039;un client CGI pour l&amp;#039;accès à l&amp;#039;IRC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Legal status of the association==&lt;br /&gt;
The &amp;quot;Armadeus Project&amp;quot; is a French non-profit association (law 1907) that was founded in Mulhouse, France (68). We accept members from everywhere.&lt;br /&gt;
The production of the development boards used by the association is done by a privately owned company, which is independent of the project. Board reselling is done by the [http://www.armadeus.com armadeus systems] company, founded by Armadeus Project leaders.&lt;br /&gt;
&lt;br /&gt;
==To become a member==&lt;br /&gt;
&lt;br /&gt;
* At first, you must fill the [http://www.armadeus.com/assos_downloads/adhesion_en.pdf following membership form] and send it back either by mail (see form) or e-mail (adhesion(at)armadeus(dot)org).&lt;br /&gt;
* Then, go to the armadeus systems online shop and [https://ssl3.ovh.net/~armadeus/onlineshop/catalog/create_account.php?language=en create an account] (Do not buy any products just yet!!). &#039;&#039;&#039;IMPORTANT: Check Association Armadeus Project membership option when creating the account !!&#039;&#039;&#039;&lt;br /&gt;
* Then, after a few days (max. 3), the following message should appear when you log in: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Imamember.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Now you can buy your boards. You become a member as soon as you purchase at least one main board (here an APF9328). This will ensure that new members will develop on the same basis. After that you will receive your userid and your password to participate to this Wiki and project activities.   &#039;&#039;&#039;Everyone is welcome!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Members|Geographical position of the members]]&lt;br /&gt;
&lt;br /&gt;
[[MemberList|Active members list]]&lt;br /&gt;
&lt;br /&gt;
==Why become a member?==&lt;br /&gt;
* Benefit from special prices on the products (the goal of the association is not to make money)&lt;br /&gt;
* Participate to the development of new boards  &lt;br /&gt;
* Increase your experience&lt;br /&gt;
* Enjoy working with other developers through:&lt;br /&gt;
** 2 public IRC channels where we talk together in the evening and during the weekend: irc://irc.rezosup.org/#Armadeus and a second one irc://irc.rezosup.org/#Armadeus_eng to talk in English (access via web is possible through CGI client http://irc.u-psud.rezosup.org/cgi-bin/client.cgi &lt;br /&gt;
** public mailing list: https://lists.sourceforge.net/lists/listinfo/armadeus-forum&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
* The boards bought through the association membership can not be used in a commercial product unless this product belongs to the association.&lt;br /&gt;
* The software/firmware developments realized within the association have to be GPL/LGPL compliant.&lt;br /&gt;
* The Armadeus Project association is not responsible for the misuse or malfunction of the developments performed within the association.&lt;br /&gt;
&lt;br /&gt;
==Buying hardware==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Minimum system is composed of an APF9328 and a DevLight V2. These boards can be bought online. Note that the displayed prices are the &amp;quot;commercial&amp;quot; ones and that the discounts are applied to association members only. Ex.: 22 euros discount on an APF9328_Dev_Light V2, visible by browsing the product information and &#039;&#039;&#039;only if the member is logged in&#039;&#039;&#039;. Therefore, in this case, the price will be 45 euros (not including taxes) for the members:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:devlightV2.png]]&lt;br /&gt;
&lt;br /&gt;
==Association prices (not including taxes)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.store.armadeus.com/assoc_prices.php Click here for the price list]&lt;br /&gt;
&lt;br /&gt;
==Remarks==&lt;br /&gt;
* No accessories (cable, power supply...) are delivered with the boards. You can purchase them at your favorite supplier for a few $&lt;br /&gt;
* Grouped orders can be organized for some special components, such as LCDs, special connectors...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{{LanguageBar|Association|Association|Verein}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Association]]&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Using_FPGA&amp;diff=6136</id>
		<title>Using FPGA</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Using_FPGA&amp;diff=6136"/>
		<updated>2009-03-12T08:11:11Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== First recommended readings ==&lt;br /&gt;
* [[FPGA | FPGA on APF introduction]]&lt;br /&gt;
&lt;br /&gt;
==Developing on the APF FPGA==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;5&amp;quot; summary=&amp;quot;Hardware Add-Ons by functionnalities&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|----------------&lt;br /&gt;
|- style=&amp;quot;background:#f4f4f4; color:black; -moz-border-radius:18px;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
=== Design Tools===&lt;br /&gt;
Description of tools used to simulate, to synthesize and to download/configure FGPA.&lt;br /&gt;
&lt;br /&gt;
* [[ISE WebPack installation on Linux| ISE WebPack (Xilinx&#039;s free devt tool) installation]]&lt;br /&gt;
* [[How_to_make_a_VHDL_design_in_Ubuntu/Debian| How to setup the FPGA toolchain in Ubuntu/Debian]]&lt;br /&gt;
* [[How to simulate post synthesis and post place &amp;amp; route design with GHDL]]&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
===Using ARMadeus FPGA===&lt;br /&gt;
Manage the FGPA from ARMadeus distribution.&lt;br /&gt;
&lt;br /&gt;
* [[FPGA_loader | Configure the FPGA from Linux]]&lt;br /&gt;
* [[Target_Software_Installation#FPGA_firmware_installation|Configure the FPGA from U-Boot]]&lt;br /&gt;
* [[FPGA_register | Access the FPGA address domain from Linux]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|----------------&lt;br /&gt;
|- style=&amp;quot;background:#f4f4f4; color:black; -moz-border-radius:18px;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
===Designs examples===&lt;br /&gt;
&lt;br /&gt;
This examples give the basis to make VHDL design for FPGA.&lt;br /&gt;
&lt;br /&gt;
* [[Simple blinking LED | LED]]&lt;br /&gt;
* [[FPGA and led | Button and LED]]&lt;br /&gt;
* [[A simple design with Wishbone bus | Button, Linux drivers, Wishbone bus communication and LED]]&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
===VHDL ===&lt;br /&gt;
&lt;br /&gt;
* [[VHDL coding styles]]&lt;br /&gt;
* [http://www.xess.com/ho03000.html Nice ideas/examples to look at]&lt;br /&gt;
* [http://www.opencores.org www.opencores.org]&lt;br /&gt;
* [http://www.gmvhdl.com/VHDL.html An Introductory VHDL Tutorial]&lt;br /&gt;
&lt;br /&gt;
|----------------&lt;br /&gt;
|- style=&amp;quot;background:#f4f4f4; color:black; -moz-border-radius:18px;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;P&#039;&#039;&#039;eripheral &#039;&#039;&#039;O&#039;&#039;&#039;n &#039;&#039;&#039;D&#039;&#039;&#039;emand ===&lt;br /&gt;
&lt;br /&gt;
POD is a Python tool that allows you to easily create FPGA bitstream for your&lt;br /&gt;
embedded system, from several Open Source IPs.&lt;br /&gt;
&lt;br /&gt;
* [[POD specification]]&lt;br /&gt;
* [https://sourceforge.net/projects/periphondemand/ sources repository]&lt;br /&gt;
| width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
===Links===&lt;br /&gt;
Some useful links.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Wishbone &#039;&#039;&#039;&lt;br /&gt;
* [http://www.opencores.org/projects.cgi/web/wishbone/wbspec_b3.pdf  official Wishbone specifications]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Wishbone_%28computer_bus%29 Wikipedia Wishbone doc]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Spartan &#039;&#039;&#039;&lt;br /&gt;
* [http://www.xilinx.com/support/documentation/data_sheets/ds099.pdf Spartan-3 FPGA Family Data Sheet]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Orchestra &#039;&#039;&#039;&lt;br /&gt;
* [http://osocgen.berlios.de/ Orchestra website]&lt;br /&gt;
* [http://developer.berlios.de/projects/osocgen/ Orchestra project page]&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4901</id>
		<title>User:FabriceM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4901"/>
		<updated>2008-11-14T19:03:55Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Petite présentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Petite présentation ==&lt;br /&gt;
&lt;br /&gt;
Quelques mots concernant ma personne, je m&#039;appelle Fabrice Mousset (alias KroMignon), je suis électronicien de formation mais j&#039;ai assez rapidement délaissé le fer à souder pour me consacrer plus à la programmation système et aux (micro)processeurs qui sont ma vrai passion.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai débuté ma carrière professionnelle 1993 avec le 80C51 pour arriver maintenant en 2008 aux processeurs ARM (type iMX27) et softcore (NIOS II d&#039;Altera).&lt;br /&gt;
&lt;br /&gt;
En 1998, j&#039;ai fait mes premières armes avec le protocole TCP/IP, j&#039;ai participé à la conception d&#039;un système complet (RTOS + TCP/IP + Services) sur un 68EN360. A l&#039;époque les accès internet n&#039;étaient pas très connus, on communiquait encore beaucoup par téléphone/FAX ou pour les plus à la pointe via CompuServe. C&#039;était les balbutiements de la fameuse &#039;&#039;Bulle Internet&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Après cela, les technos ceux sont enchainées, en vrac: MP3, Linux, ActiveX, .NET, Windows CE, XP Embedded, VHDL, System on Chip, et d&#039;autres encore. &lt;br /&gt;
&lt;br /&gt;
Début 2000, j&#039;ai fait la découverte de Linux, tout d&#039;abord avec la distribution &#039;&#039;&#039;Suze&#039;&#039;&#039; et très rapidement &#039;&#039;&#039;Debian&#039;&#039;&#039;, que j&#039;utilise chez moi sur un PC qui me sert de serveur et, en 2004, je me suis mis à &#039;&#039;&#039;Ubuntu&#039;&#039;&#039;, que j&#039;utilise sur mon PC portable en dual boot avec Windows, parce que certains outils ne fonctionnent que sous Windows et qu&#039;au boulot de toute façon j&#039;utilise Windows.&lt;br /&gt;
&lt;br /&gt;
Fin 2006, découvert l&#039;association Armadeus sur Linux-Fr, et après quelques échanges de mails pour &#039;&#039;sentir&#039;&#039; un peu l&#039;association, je me suis lancé dans l&#039;aventure et j&#039;ai commandé ma carte APF9328 :-)&lt;br /&gt;
&lt;br /&gt;
== Mes centres d&#039;intérêts ==&lt;br /&gt;
&lt;br /&gt;
Il y a beaucoup de choses qui m&#039;intéressent et que j&#039;aimerai pouvoir essayer avec la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Mon centre d&#039;intérêt le plus fort en ce moment, c&#039;est le VHDL. C&#039;est l&#039;association d&#039;un FPGA avec un microprocesseur sur la même carte qui m&#039;a fait craquer pour la carte APF9328. Dans mon travail, j&#039;ai souvent affaire aux FPGA, dans mon cas de chez Aletra et non Xilinx. J&#039;ai accumulé pas mal d&#039;expérience avec ces périphériques et l&#039;envie de les utiliser &#039;&#039;pour moi&#039;&#039; est donc venue tout naturellement.&lt;br /&gt;
&lt;br /&gt;
A coté de cela, cette carte me donne la possibilité de me mettre à la programmation Linux, que je ne connait finalement seulement qu&#039;en tant qu&#039;utilisateur. De plus je n&#039;ai jamais utilisé Linux ailleurs que sur PC, l&#039;utilisation dans le monde de l&#039;embarqué est également une découverte pour moi.&lt;br /&gt;
&lt;br /&gt;
== Mes projets en cours ==&lt;br /&gt;
&lt;br /&gt;
=== Orchestra ===&lt;br /&gt;
La première chose qui m&#039;est apparue en mettant en oeuvre la carte APF9328, c&#039;est le manque d&#039;outils permettant la mise en oeuvre &#039;&#039;simple&#039;&#039; d&#039;un design dans le FPGA. La simplicité est toujours quelque chose de relatif. Et pour moi, qui suis habitué aux outils Altera, la mise en oeuvre d&#039;un &#039;&#039;&#039;System on Chip&#039;&#039;&#039; sur les FPGA Altera a toujours été quelque chose de très simple, et ceci en particulier grâce à l&#039;outil &#039;&#039;&#039;SoPC Builder&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
C&#039;est ce manque d&#039;outil qui m&#039;a donner l&#039;envie de créer mon propre outil de conception de System on Chip. Après en avoir discuter avec Nicolas Colombain (aka salocin) et la rédactions de quelques spécifications sur le wiki, je me suis lancé dans l&#039;aventure.&lt;br /&gt;
&lt;br /&gt;
Et voilà le point de départ d&#039;Orchestra :)&lt;br /&gt;
&lt;br /&gt;
Le projet est encore à ces balbutiements mais j&#039;espère bien pouvoir obtenir une première version utilisable pour début 2009. Actuellement le projet est hébergé sous &#039;&#039;&#039;berlios&#039;&#039;&#039; [http://osocgen.berlios.de].&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4900</id>
		<title>User:FabriceM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4900"/>
		<updated>2008-11-14T19:03:06Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Petite présentation ==&lt;br /&gt;
&lt;br /&gt;
Quelques mots concernant ma personne, je m&#039;appel Fabrice Mousset (alias KroMignon), je suis électronicien de formation mais j&#039;ai assez rapidement délaissé le fer à souder pour me consacrer plus à la programmation système et aux (micro)processeurs qui sont ma vrai passion.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai débuté ma carrière professionnelle 1993 avec le 80C51 pour arriver maintenant en 2008 aux processeurs ARM (type iMX27) et softcore (NIOS II d&#039;Altera).&lt;br /&gt;
&lt;br /&gt;
En 1998, j&#039;ai fait mes premières armes avec le protocole TCP/IP, j&#039;ai participé à la conception d&#039;un système complet (RTOS + TCP/IP + Services) sur un 68EN360. A l&#039;époque les accès internet n&#039;étaient pas très connus, on communiquait encore beaucoup par téléphone/FAX ou pour les plus à la pointe via CompuServe. C&#039;était les balbutiements de la fameuse &#039;&#039;Bulle Internet&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Après cela, les technos ceux sont enchainées, en vrac: MP3, Linux, ActiveX, .NET, Windows CE, XP Embedded, VHDL, System on Chip, et d&#039;autres encore. &lt;br /&gt;
&lt;br /&gt;
Début 2000, j&#039;ai fait la découverte de Linux, tout d&#039;abord avec la distribution &#039;&#039;&#039;Suze&#039;&#039;&#039; et très rapidement &#039;&#039;&#039;Debian&#039;&#039;&#039;, que j&#039;utilise chez moi sur un PC qui me sert de serveur et, en 2004, je me suis mis à &#039;&#039;&#039;Ubuntu&#039;&#039;&#039;, que j&#039;utilise sur mon PC portable en dual boot avec Windows, parce que certains outils ne fonctionnent que sous Windows et qu&#039;au boulot de toute façon j&#039;utilise Windows.&lt;br /&gt;
&lt;br /&gt;
Fin 2006, découvert l&#039;association Armadeus sur Linux-Fr, et après quelques échanges de mails pour &#039;&#039;sentir&#039;&#039; un peu l&#039;association, je me suis lancé dans l&#039;aventure et j&#039;ai commandé ma carte APF9328 :-)&lt;br /&gt;
&lt;br /&gt;
== Mes centres d&#039;intérêts ==&lt;br /&gt;
&lt;br /&gt;
Il y a beaucoup de choses qui m&#039;intéressent et que j&#039;aimerai pouvoir essayer avec la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Mon centre d&#039;intérêt le plus fort en ce moment, c&#039;est le VHDL. C&#039;est l&#039;association d&#039;un FPGA avec un microprocesseur sur la même carte qui m&#039;a fait craquer pour la carte APF9328. Dans mon travail, j&#039;ai souvent affaire aux FPGA, dans mon cas de chez Aletra et non Xilinx. J&#039;ai accumulé pas mal d&#039;expérience avec ces périphériques et l&#039;envie de les utiliser &#039;&#039;pour moi&#039;&#039; est donc venue tout naturellement.&lt;br /&gt;
&lt;br /&gt;
A coté de cela, cette carte me donne la possibilité de me mettre à la programmation Linux, que je ne connait finalement seulement qu&#039;en tant qu&#039;utilisateur. De plus je n&#039;ai jamais utilisé Linux ailleurs que sur PC, l&#039;utilisation dans le monde de l&#039;embarqué est également une découverte pour moi.&lt;br /&gt;
&lt;br /&gt;
== Mes projets en cours ==&lt;br /&gt;
&lt;br /&gt;
=== Orchestra ===&lt;br /&gt;
La première chose qui m&#039;est apparue en mettant en oeuvre la carte APF9328, c&#039;est le manque d&#039;outils permettant la mise en oeuvre &#039;&#039;simple&#039;&#039; d&#039;un design dans le FPGA. La simplicité est toujours quelque chose de relatif. Et pour moi, qui suis habitué aux outils Altera, la mise en oeuvre d&#039;un &#039;&#039;&#039;System on Chip&#039;&#039;&#039; sur les FPGA Altera a toujours été quelque chose de très simple, et ceci en particulier grâce à l&#039;outil &#039;&#039;&#039;SoPC Builder&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
C&#039;est ce manque d&#039;outil qui m&#039;a donner l&#039;envie de créer mon propre outil de conception de System on Chip. Après en avoir discuter avec Nicolas Colombain (aka salocin) et la rédactions de quelques spécifications sur le wiki, je me suis lancé dans l&#039;aventure.&lt;br /&gt;
&lt;br /&gt;
Et voilà le point de départ d&#039;Orchestra :)&lt;br /&gt;
&lt;br /&gt;
Le projet est encore à ces balbutiements mais j&#039;espère bien pouvoir obtenir une première version utilisable pour début 2009. Actuellement le projet est hébergé sous &#039;&#039;&#039;berlios&#039;&#039;&#039; [http://osocgen.berlios.de].&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4862</id>
		<title>User:FabriceM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4862"/>
		<updated>2008-11-12T14:49:34Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Orchestra */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Petite présentation ==&lt;br /&gt;
&lt;br /&gt;
Quelques mots concernant ma personne, je suis électronicien de formation mais j&#039;ai assez rapidement délaissé le fer à souder pour me consacrer plus à la programmation système et aux (micro)processeurs qui sont ma vrai passion.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai débuté ma carrière professionnelle 1993 avec le 80C51 pour arriver maintenant en 2008 aux processeurs ARM (type iMX27) et softcore (NIOS II d&#039;Altera).&lt;br /&gt;
&lt;br /&gt;
En 1998, j&#039;ai fait mes premières armes avec le protocole TCP/IP, j&#039;ai participé à la conception d&#039;un système complet (RTOS + TCP/IP + Services) sur un 68EN360. A l&#039;époque les accès internet n&#039;étaient pas très connus, on communiquait encore beaucoup par téléphone/FAX ou pour les plus à la pointe via CompuServe. C&#039;était les balbutiements de la fameuse &#039;&#039;Bulle Internet&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Après cela, les technos ceux sont enchainées, en vrac: MP3, Linux, ActiveX, .NET, Windows CE, XP Embedded, VHDL, System on Chip, et d&#039;autres encore. &lt;br /&gt;
&lt;br /&gt;
Début 2000, j&#039;ai fait la découverte de Linux, tout d&#039;abord avec la distribution &#039;&#039;&#039;Suze&#039;&#039;&#039; et très rapidement &#039;&#039;&#039;Debian&#039;&#039;&#039;, que j&#039;utilise chez moi sur un PC qui me sert de serveur et, en 2004, je me suis mis à &#039;&#039;&#039;Ubuntu&#039;&#039;&#039;, que j&#039;utilise sur mon PC portable en dual boot avec Windows, parce que certains outils ne fonctionnent que sous Windows et qu&#039;au boulot de toute façon j&#039;utilise Windows.&lt;br /&gt;
&lt;br /&gt;
Fin 2006, découvert l&#039;association Armadeus sur Linux-Fr, et après quelques échanges de mails pour &#039;&#039;sentir&#039;&#039; un peu l&#039;association, je me suis lancé dans l&#039;aventure et j&#039;ai commandé ma carte APF9328 :-)&lt;br /&gt;
&lt;br /&gt;
== Mes centres d&#039;intérêts ==&lt;br /&gt;
&lt;br /&gt;
Il y a beaucoup de choses qui m&#039;intéressent et que j&#039;aimerai pouvoir essayer avec la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Mon centre d&#039;intérêt le plus fort en ce moment, c&#039;est le VHDL. C&#039;est l&#039;association d&#039;un FPGA avec un microprocesseur sur la même carte qui m&#039;a fait craquer pour la carte APF9328. Dans mon travail, j&#039;ai souvent affaire aux FPGA, dans mon cas de chez Aletra et non Xilinx. J&#039;ai accumulé pas mal d&#039;expérience avec ces périphériques et l&#039;envie de les utiliser &#039;&#039;pour moi&#039;&#039; est donc venue tout naturellement.&lt;br /&gt;
&lt;br /&gt;
A coté de cela, cette carte me donne la possibilité de me mettre à la programmation Linux, que je ne connait finalement seulement qu&#039;en tant qu&#039;utilisateur. De plus je n&#039;ai jamais utilisé Linux ailleurs que sur PC, l&#039;utilisation dans le monde de l&#039;embarqué est également une découverte pour moi.&lt;br /&gt;
&lt;br /&gt;
== Mes projets en cours ==&lt;br /&gt;
&lt;br /&gt;
=== Orchestra ===&lt;br /&gt;
La première chose qui m&#039;est apparue en mettant en oeuvre la carte APF9328, c&#039;est le manque d&#039;outils permettant la mise en oeuvre &#039;&#039;simple&#039;&#039; d&#039;un design dans le FPGA. La simplicité est toujours quelque chose de relatif. Et pour moi, qui suis habitué aux outils Altera, la mise en oeuvre d&#039;un &#039;&#039;&#039;System on Chip&#039;&#039;&#039; sur les FPGA Altera a toujours été quelque chose de très simple, et ceci en particulier grâce à l&#039;outil &#039;&#039;&#039;SoPC Builder&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
C&#039;est ce manque d&#039;outil qui m&#039;a donner l&#039;envie de créer mon propre outil de conception de System on Chip. Après en avoir discuter avec Nicolas Colombain (aka salocin) et la rédactions de quelques spécifications sur le wiki, je me suis lancé dans l&#039;aventure.&lt;br /&gt;
&lt;br /&gt;
Et voilà le point de départ d&#039;Orchestra :)&lt;br /&gt;
&lt;br /&gt;
Le projet est encore à ces balbutiement mais j&#039;espère bien pouvoir obtenir une première version utilisable pour début 2009. Actuellement le projet est hébergé sous &#039;&#039;&#039;berlios&#039;&#039;&#039; [http://osocgen.berlios.de].&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4861</id>
		<title>User:FabriceM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4861"/>
		<updated>2008-11-12T14:49:07Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Petite présentation ==&lt;br /&gt;
&lt;br /&gt;
Quelques mots concernant ma personne, je suis électronicien de formation mais j&#039;ai assez rapidement délaissé le fer à souder pour me consacrer plus à la programmation système et aux (micro)processeurs qui sont ma vrai passion.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai débuté ma carrière professionnelle 1993 avec le 80C51 pour arriver maintenant en 2008 aux processeurs ARM (type iMX27) et softcore (NIOS II d&#039;Altera).&lt;br /&gt;
&lt;br /&gt;
En 1998, j&#039;ai fait mes premières armes avec le protocole TCP/IP, j&#039;ai participé à la conception d&#039;un système complet (RTOS + TCP/IP + Services) sur un 68EN360. A l&#039;époque les accès internet n&#039;étaient pas très connus, on communiquait encore beaucoup par téléphone/FAX ou pour les plus à la pointe via CompuServe. C&#039;était les balbutiements de la fameuse &#039;&#039;Bulle Internet&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Après cela, les technos ceux sont enchainées, en vrac: MP3, Linux, ActiveX, .NET, Windows CE, XP Embedded, VHDL, System on Chip, et d&#039;autres encore. &lt;br /&gt;
&lt;br /&gt;
Début 2000, j&#039;ai fait la découverte de Linux, tout d&#039;abord avec la distribution &#039;&#039;&#039;Suze&#039;&#039;&#039; et très rapidement &#039;&#039;&#039;Debian&#039;&#039;&#039;, que j&#039;utilise chez moi sur un PC qui me sert de serveur et, en 2004, je me suis mis à &#039;&#039;&#039;Ubuntu&#039;&#039;&#039;, que j&#039;utilise sur mon PC portable en dual boot avec Windows, parce que certains outils ne fonctionnent que sous Windows et qu&#039;au boulot de toute façon j&#039;utilise Windows.&lt;br /&gt;
&lt;br /&gt;
Fin 2006, découvert l&#039;association Armadeus sur Linux-Fr, et après quelques échanges de mails pour &#039;&#039;sentir&#039;&#039; un peu l&#039;association, je me suis lancé dans l&#039;aventure et j&#039;ai commandé ma carte APF9328 :-)&lt;br /&gt;
&lt;br /&gt;
== Mes centres d&#039;intérêts ==&lt;br /&gt;
&lt;br /&gt;
Il y a beaucoup de choses qui m&#039;intéressent et que j&#039;aimerai pouvoir essayer avec la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Mon centre d&#039;intérêt le plus fort en ce moment, c&#039;est le VHDL. C&#039;est l&#039;association d&#039;un FPGA avec un microprocesseur sur la même carte qui m&#039;a fait craquer pour la carte APF9328. Dans mon travail, j&#039;ai souvent affaire aux FPGA, dans mon cas de chez Aletra et non Xilinx. J&#039;ai accumulé pas mal d&#039;expérience avec ces périphériques et l&#039;envie de les utiliser &#039;&#039;pour moi&#039;&#039; est donc venue tout naturellement.&lt;br /&gt;
&lt;br /&gt;
A coté de cela, cette carte me donne la possibilité de me mettre à la programmation Linux, que je ne connait finalement seulement qu&#039;en tant qu&#039;utilisateur. De plus je n&#039;ai jamais utilisé Linux ailleurs que sur PC, l&#039;utilisation dans le monde de l&#039;embarqué est également une découverte pour moi.&lt;br /&gt;
&lt;br /&gt;
== Mes projets en cours ==&lt;br /&gt;
&lt;br /&gt;
=== Orchestra ===&lt;br /&gt;
La première chose qui m&#039;est apparue en mettant en oeuvre la carte APF9328, c&#039;est le manque d&#039;outils permettant la mise en oeuvre &#039;&#039;simple&#039;&#039; d&#039;un design dans le FPGA. La simplicité est toujours quelque chose de relatif. Et pour moi, qui suis habitué aux outils Altera, la mise en oeuvre d&#039;un &#039;&#039;&#039;System on Chip&#039;&#039;&#039; sur les FPGA Altera a toujours été quelque chose de très simple, et ceci en particulier grâce à l&#039;outil &#039;&#039;&#039;SoPC Builder&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
C&#039;est ce manque d&#039;outil qui m&#039;a donner l&#039;envie de créer mon propre outil de conception de System on Chip. Après en avoir discuter avec Nicolas Colombain (aka salocin) et la rédactions de quelques spécifications sur le wiki, je me suis lancé dans l&#039;aventure.&lt;br /&gt;
&lt;br /&gt;
Et voilà le point de départ d&#039;Orchestra :)&lt;br /&gt;
&lt;br /&gt;
Le projet est encore à ces balbutiement mais j&#039;espère bien pouvoir obtenir une première version utilisable pour début 2009. Actuellement le projet est hébergé sous &#039;&#039;&#039;berlios&#039;&#039;&#039; à l&#039;adresse suivante [http://osocgen.berlios.de].&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4848</id>
		<title>User:FabriceM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4848"/>
		<updated>2008-11-06T09:54:59Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Mes centres d&amp;#039;intérêts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Petite présentation ==&lt;br /&gt;
Quelques mots concernant ma personne, je suis électronicien de formation mais j&#039;ai assez rapidement délaissé le fer à souder pour me consacrer plus à la programmation système et aux (micro)processeurs qui sont ma vrai passion.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai débuté ma carrière professionnelle 1993 avec le 80C51 pour arriver maintenant en 2008 aux processeurs ARM (type iMX27) et softcore (NIOS II d&#039;Altera).&lt;br /&gt;
&lt;br /&gt;
En 1998, j&#039;ai fait mes premières armes avec le protocole TCP/IP, j&#039;ai participé à la conception d&#039;un système complet (RTOS + TCP/IP + Services) sur un 68EN360. A l&#039;époque les accès internet n&#039;étaient pas très connus, on communiquait encore beaucoup par téléphone/FAX ou pour les plus à la pointe via CompuServe. C&#039;était les balbutiements de la fameuse &#039;&#039;Bulle Internet&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Après cela, les technos ceux sont enchainées, en vrac: MP3, PowerPC, Linux, ActiveX, .NET, Windows CE, XP Embedded, VHDL, System on Chip. &lt;br /&gt;
&lt;br /&gt;
Début 2000, j&#039;ai fait la découverte de Linux, tout d&#039;abord avec la distribution &#039;&#039;&#039;Debian&#039;&#039;&#039;, que j&#039;utilise chez moi sur un PC qui me sert de serveur et, en 2004, je me suis mis à &#039;&#039;&#039;Ubuntu&#039;&#039;&#039;, que j&#039;utilise sur mon PC portable en dual boot avec Windows, parce que certains outils ne fonctionnent que sous Windows et qu&#039;au boulot de toute façon j&#039;utilise Windows.&lt;br /&gt;
&lt;br /&gt;
Fin 2006, découvert l&#039;association Armadeus sur Linux-Fr, et après quelques échanges de mails pour &#039;&#039;sentir&#039;&#039; un peu l&#039;association, je me suis lancé dans l&#039;aventure et j&#039;ai commandé ma carte APF9328 :-)&lt;br /&gt;
&lt;br /&gt;
== Mes centres d&#039;intérêts ==&lt;br /&gt;
Il y a beaucoup de choses qui m&#039;intéressent que j&#039;aimerai pouvoir essayer avec la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Mon centre d&#039;intérêt le plus fort en ce moment, c&#039;est le VHDL. C&#039;est l&#039;association d&#039;un FPGA avec un microprocesseur sur la même carte qui m&#039;a fait craquer pour la carte APF9328. Dans mon travail, j&#039;ai souvent affaire aux FPGA, dans mon cas de chez Aletra et non Xilinx. J&#039;ai accumulé pas mal d&#039;expérience avec ces périphériques et l&#039;envie de les utiliser &#039;&#039;pour moi&#039;&#039; est donc venue tout naturellement.&lt;br /&gt;
&lt;br /&gt;
A coté de cela, cette carte me donne la possibilité de me mettre à la programmation Linux, que je ne connait finalement seulement qu&#039;en tant qu&#039;utilisateur. De plus je n&#039;ai jamais utilisé Linux ailleurs que sur PC, l&#039;utilisation dans le monde de l&#039;embarqué est également une découverte pour moi.&lt;br /&gt;
&lt;br /&gt;
== Mes projets en cours ==&lt;br /&gt;
&lt;br /&gt;
=== Orchestra ===&lt;br /&gt;
La première chose qui m&#039;est apparue en mettant en oeuvre la carte APF9328, c&#039;est le manque d&#039;outils permettant la mise en oeuvre &#039;&#039;simple&#039;&#039; d&#039;un design dans le FPGA. La simplicité est toujours quelque chose de relatif. Et pour moi, qui suis habitué aux outils Altera, la mise en oeuvre d&#039;un &#039;&#039;&#039;System on Chip&#039;&#039;&#039; sur les FPGA Altera a toujours été quelque chose de très simple, et ceci en particulier grâce à l&#039;outil &#039;&#039;&#039;SoPC Builder&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
C&#039;est ce manque d&#039;outil qui m&#039;a donner l&#039;envie de créer mon propre outil de conception de System on Chip. Après en avoir discuter avec Nicolas Colombain (aka salocin) et la rédactions de quelques spécifications sur le wiki, je me suis lancé dans l&#039;aventure.&lt;br /&gt;
&lt;br /&gt;
Et voilà le point de départ d&#039;Orchestra :)&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4847</id>
		<title>User:FabriceM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4847"/>
		<updated>2008-11-06T09:34:57Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Petite présentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Petite présentation ==&lt;br /&gt;
Quelques mots concernant ma personne, je suis électronicien de formation mais j&#039;ai assez rapidement délaissé le fer à souder pour me consacrer plus à la programmation système et aux (micro)processeurs qui sont ma vrai passion.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai débuté ma carrière professionnelle 1993 avec le 80C51 pour arriver maintenant en 2008 aux processeurs ARM (type iMX27) et softcore (NIOS II d&#039;Altera).&lt;br /&gt;
&lt;br /&gt;
En 1998, j&#039;ai fait mes premières armes avec le protocole TCP/IP, j&#039;ai participé à la conception d&#039;un système complet (RTOS + TCP/IP + Services) sur un 68EN360. A l&#039;époque les accès internet n&#039;étaient pas très connus, on communiquait encore beaucoup par téléphone/FAX ou pour les plus à la pointe via CompuServe. C&#039;était les balbutiements de la fameuse &#039;&#039;Bulle Internet&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Après cela, les technos ceux sont enchainées, en vrac: MP3, PowerPC, Linux, ActiveX, .NET, Windows CE, XP Embedded, VHDL, System on Chip. &lt;br /&gt;
&lt;br /&gt;
Début 2000, j&#039;ai fait la découverte de Linux, tout d&#039;abord avec la distribution &#039;&#039;&#039;Debian&#039;&#039;&#039;, que j&#039;utilise chez moi sur un PC qui me sert de serveur et, en 2004, je me suis mis à &#039;&#039;&#039;Ubuntu&#039;&#039;&#039;, que j&#039;utilise sur mon PC portable en dual boot avec Windows, parce que certains outils ne fonctionnent que sous Windows et qu&#039;au boulot de toute façon j&#039;utilise Windows.&lt;br /&gt;
&lt;br /&gt;
Fin 2006, découvert l&#039;association Armadeus sur Linux-Fr, et après quelques échanges de mails pour &#039;&#039;sentir&#039;&#039; un peu l&#039;association, je me suis lancé dans l&#039;aventure et j&#039;ai commandé ma carte APF9328 :-)&lt;br /&gt;
&lt;br /&gt;
== Mes centres d&#039;intérêts ==&lt;br /&gt;
Il y a beaucoup de choses qui m&#039;intéressent que j&#039;aimerai pouvoir essayer avec la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Mon centre d&#039;intérêt le plus fort en ce moment, c&#039;est le VHDL. C&#039;est l&#039;association d&#039;un FPGA avec un microprocesseur sur la même carte qui m&#039;a fait craquer pour la carte APF9328. Dans mon travail, j&#039;ai souvent affaire aux FPGA, dans mon cas de chez Aletra et non Xilinx. J&#039;ai accumulé pas mal d&#039;expérience avec ces périphériques et l&#039;envie de les utiliser &#039;&#039;pour moi&#039;&#039; est donc venue tout naturellement.&lt;br /&gt;
&lt;br /&gt;
A coté de cela, cette carte me donne la possibilité de me mettre à la programmation Linux, que je ne connait finalement qu&#039;en tant qu&#039;utilisateur. De plus je n&#039;ai jamais utilisé Linux ailleurs que sur PC, l&#039;utilisation dans le monde de l&#039;embarqué est également une découverte pour moi.&lt;br /&gt;
&lt;br /&gt;
== Mes projets en cours ==&lt;br /&gt;
&lt;br /&gt;
=== Orchestra ===&lt;br /&gt;
La première chose qui m&#039;est apparue en mettant en oeuvre la carte APF9328, c&#039;est le manque d&#039;outils permettant la mise en oeuvre &#039;&#039;simple&#039;&#039; d&#039;un design dans le FPGA. La simplicité est toujours quelque chose de relatif. Et pour moi, qui suis habitué aux outils Altera, la mise en oeuvre d&#039;un &#039;&#039;&#039;System on Chip&#039;&#039;&#039; sur les FPGA Altera a toujours été quelque chose de très simple, et ceci en particulier grâce à l&#039;outil &#039;&#039;&#039;SoPC Builder&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
C&#039;est ce manque d&#039;outil qui m&#039;a donner l&#039;envie de créer mon propre outil de conception de System on Chip. Après en avoir discuter avec Nicolas Colombain (aka salocin) et la rédactions de quelques spécifications sur le wiki, je me suis lancé dans l&#039;aventure.&lt;br /&gt;
&lt;br /&gt;
Et voilà le point de départ d&#039;Orchestra :)&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4846</id>
		<title>User:FabriceM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4846"/>
		<updated>2008-11-06T09:34:10Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Petite présentation ==&lt;br /&gt;
Quelques mots concernant ma personne, je suis électronicien de formation mais j&#039;ai assez rapidement délaissé le fer à souder pour me consacrer plus à la programmation système et aux (micro)processeurs qui sont ma vrai passion.&lt;br /&gt;
J&#039;ai débuté ma carrière professionnelle 1993 avec le 80C51 pour arriver maintenant en 2008 aux processeurs ARM (type iMX27) et softcore (NIOS II d&#039;Altera).&lt;br /&gt;
En 1998, j&#039;ai fait mes premières armes avec le protocole TCP/IP, j&#039;ai participé à la conception d&#039;un système complet (RTOS + TCP/IP + Services) sur un 68EN360. A l&#039;époque les accès internet n&#039;étaient pas très connus, on communiquait encore beaucoup par téléphone/FAX ou pour les plus à la pointe via CompuServe. C&#039;était les balbutiements de la fameuse &#039;&#039;Bulle Internet&#039;&#039;.&lt;br /&gt;
Après cela, les technos ceux sont enchainées, en vrac: MP3, PowerPC, Linux, ActiveX, .NET, Windows CE, XP Embedded, VHDL, System on Chip. &lt;br /&gt;
&lt;br /&gt;
Début 2000, j&#039;ai fait la découverte de Linux, tout d&#039;abord avec la distribution &#039;&#039;&#039;Debian&#039;&#039;&#039;, que j&#039;utilise chez moi sur un PC qui me sert de serveur et, en 2004, je me suis mis à &#039;&#039;&#039;Ubuntu&#039;&#039;&#039;, que j&#039;utilise sur mon PC portable en dual boot avec Windows, parce que certains outils ne fonctionnent que sous Windows et qu&#039;au boulot de toute façon j&#039;utilise Windows.&lt;br /&gt;
&lt;br /&gt;
Fin 2006, découvert l&#039;association Armadeus sur Linux-Fr, et après quelques échanges de mails pour &#039;&#039;sentir&#039;&#039; un peu l&#039;association, je me suis lancé dans l&#039;aventure et j&#039;ai commandé ma carte APF9328 :-)&lt;br /&gt;
&lt;br /&gt;
== Mes centres d&#039;intérêts ==&lt;br /&gt;
Il y a beaucoup de choses qui m&#039;intéressent que j&#039;aimerai pouvoir essayer avec la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Mon centre d&#039;intérêt le plus fort en ce moment, c&#039;est le VHDL. C&#039;est l&#039;association d&#039;un FPGA avec un microprocesseur sur la même carte qui m&#039;a fait craquer pour la carte APF9328. Dans mon travail, j&#039;ai souvent affaire aux FPGA, dans mon cas de chez Aletra et non Xilinx. J&#039;ai accumulé pas mal d&#039;expérience avec ces périphériques et l&#039;envie de les utiliser &#039;&#039;pour moi&#039;&#039; est donc venue tout naturellement.&lt;br /&gt;
&lt;br /&gt;
A coté de cela, cette carte me donne la possibilité de me mettre à la programmation Linux, que je ne connait finalement qu&#039;en tant qu&#039;utilisateur. De plus je n&#039;ai jamais utilisé Linux ailleurs que sur PC, l&#039;utilisation dans le monde de l&#039;embarqué est également une découverte pour moi.&lt;br /&gt;
&lt;br /&gt;
== Mes projets en cours ==&lt;br /&gt;
&lt;br /&gt;
=== Orchestra ===&lt;br /&gt;
La première chose qui m&#039;est apparue en mettant en oeuvre la carte APF9328, c&#039;est le manque d&#039;outils permettant la mise en oeuvre &#039;&#039;simple&#039;&#039; d&#039;un design dans le FPGA. La simplicité est toujours quelque chose de relatif. Et pour moi, qui suis habitué aux outils Altera, la mise en oeuvre d&#039;un &#039;&#039;&#039;System on Chip&#039;&#039;&#039; sur les FPGA Altera a toujours été quelque chose de très simple, et ceci en particulier grâce à l&#039;outil &#039;&#039;&#039;SoPC Builder&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
C&#039;est ce manque d&#039;outil qui m&#039;a donner l&#039;envie de créer mon propre outil de conception de System on Chip. Après en avoir discuter avec Nicolas Colombain (aka salocin) et la rédactions de quelques spécifications sur le wiki, je me suis lancé dans l&#039;aventure.&lt;br /&gt;
&lt;br /&gt;
Et voilà le point de départ d&#039;Orchestra :)&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=4224</id>
		<title>Members</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=4224"/>
		<updated>2008-06-04T12:18:31Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Google Map==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;googlemap lat=&amp;quot;47&amp;quot; lon=&amp;quot;6&amp;quot; width=640 height=480 zoom=4&amp;gt;&lt;br /&gt;
47.270377, 6.025314, [[User:JulienB]] Besancon&lt;br /&gt;
47.752598,7.301788, ARMadeus Systems&lt;br /&gt;
47.760791, 7.339897, [[User:Salocin68]] Mulhouse&lt;br /&gt;
47.734392,7.316975, [[User:FabienM]] Mulhouse&lt;br /&gt;
46.550833, 6.632309, [[User:Jorasse]] Lausanne&lt;br /&gt;
47.681108, 7.390366, [[User:Carbure]] Helfranzkirch&lt;br /&gt;
47.436448, 8.429947, [[User:SonZerro]] Baden&lt;br /&gt;
44.653992, 6.176672, [[User:JulienN]] Chabottes&lt;br /&gt;
48.573342, 7.911476,  [[User:KroMignon]] Legelshurst&lt;br /&gt;
42.734405, 2.894211, ELIAUS Perpignan&lt;br /&gt;
47.653363, 6.862335, UTBM Belfort&lt;br /&gt;
48.879619, 2.351074, Paris - 20 membres&lt;br /&gt;
-21.115141, 55.536384, La Réunion - 1 member&lt;br /&gt;
14.551684, -60.912323, La Martinique - 1 member&lt;br /&gt;
&lt;br /&gt;
47.399744, 8.53775, Zurich - 1 member&lt;br /&gt;
46.810282, 7.151241, Fribourg&lt;br /&gt;
47.574904, 7.580566, Basel&lt;br /&gt;
&lt;br /&gt;
53.371859, -6.2677, Dublin - 1 member&lt;br /&gt;
50.637704, 5.608521, Liège - 1 member&lt;br /&gt;
50.67, 3.48, Velaines - 1 member&lt;br /&gt;
48.199964, 11.57959, Munich - 1 member&lt;br /&gt;
48.109588,-1.678752, Rennes - 1 member&lt;br /&gt;
47.750109,-3.366339, [[User:MatthieuT]] Lorient&lt;br /&gt;
48.70,2.03, [[User:JulienPeeters]] Chevreuse&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==!!! Everything above this line is obsolete and will be removed soon !!!==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: relative&amp;quot;&amp;gt;[[Image:France.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 350px; top: 250px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Besançon(3)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 350px; top: 320px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Lyon(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 390px; top: 340px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Grenoble(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 350px; top: 360px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Valence(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 310px; top: 220px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Dijon(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 420px; top: 180px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Mulhouse(3)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 400px; top: 210px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Montbéliard/Belfort(2)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 460px; top: 120px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Strasbourg(3)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 400px; top: 100px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Metz(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 400px; top: 145px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Charmes(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 255px; top: 5px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Lille(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 250px; top: 70px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Amiens(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 250px; top: 150px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Paris(20)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 300px; top: 120px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Soisson(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 335px; top: 132px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Reims(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 150px; top: 190px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Angers(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 100px; top: 210px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Nantes(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 180px; top: 170px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Le Mans(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 80px; top: 150px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Rennes(2)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 250px; top: 480px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Perpignan(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 350px; top: 450px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Aix/Marseille(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 200px; top: 400px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Toulouse(2)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 200px; top: 350px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Périgueux(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Association]]&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User_talk:FabriceM&amp;diff=4045</id>
		<title>User talk:FabriceM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User_talk:FabriceM&amp;diff=4045"/>
		<updated>2008-05-14T08:27:38Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mon ambition sur ce projet est essentiellement basée sur le FPGA.&lt;br /&gt;
&lt;br /&gt;
== Points abordés avec ce projet ==&lt;br /&gt;
* &amp;lt;del&amp;gt;Analyse du bus Wishbone (en cours... 140 pages pas faciles à absorber :( !)&amp;lt;/del&amp;gt;&lt;br /&gt;
* &amp;lt;del&amp;gt;Analyse du soft Wishbone Builder (écrit en Perl, pas trop mal fait mais pas assez modulaire à mon goût)&amp;lt;/del&amp;gt;&lt;br /&gt;
* &amp;lt;del&amp;gt;Analyse du bus i.MXL (il me faut encore extraire les infos utiles du databook)&amp;lt;/del&amp;gt;&lt;br /&gt;
* [[FpgaArchitecture|Spécification de l&#039;architecture du FPGA]]&lt;br /&gt;
* [[FpgaCodingRules|Spécification des règles de codage]]&lt;br /&gt;
* [[Orchestra|Spécification de l&#039;outil de conception automatique du FPGA]]&lt;br /&gt;
* &amp;lt;del&amp;gt;Elaboration d&#039;une interface i.MXL &amp;lt;-&amp;gt; Wishbone&amp;lt;/del&amp;gt;&lt;br /&gt;
* &amp;lt;del&amp;gt;Création d&#039;un banc de test VHDL / ModelSim&amp;lt;/del&amp;gt;&lt;br /&gt;
* &amp;lt;del&amp;gt;Création d&#039;un design simple : Interface i.MXL/Wishbone + Registres&amp;lt;/del&amp;gt;&lt;br /&gt;
* Création d&#039;un petit programme pour accès aux registres dans le FPGA (langage ?!?)&lt;br /&gt;
* Création d&#039;un cahier des charges pour un outils de conception automatique du FPGA (petite préférence pour python... Il faut bien amortir les livres que j&#039;ai acheté sur le sujet ;-) )&lt;br /&gt;
* [[OrchestraPython|Elaboration du projet Orchestra en Python]]&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
=== Vu d&#039;ensemble ===&lt;br /&gt;
Le bus Wishbone est une spécifications de bus d&#039;interconnexion placé dans le domaine public. Son utilisation est libre de droit. Les [http://www.opencores.org/projects.cgi/web/wishbone/wbspec_b3.pdf|spécification Wishbone Version B3] sont librement accessibles. Le bus Wishbone est entièrement synchrone et définit un certain nombre d&#039;éléments:&lt;br /&gt;
* Des &#039;&#039;&#039;Maitres&#039;&#039;&#039;. Ces composants vont initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des &#039;&#039;&#039;Esclaves&#039;&#039;&#039;. Ces composants vont répondre à des demandes de transfert.&lt;br /&gt;
* Un &#039;&#039;&#039;Syscon&#039;&#039;&#039;. Ce composant va fournir les signaux globaux CLK (horloge système) et RST (reset synchrone)&lt;br /&gt;
* Une ou plusieurs &#039;&#039;&#039;Interconnexions&#039;&#039;&#039;. Ce macro composant prend en charge les connexions entre les différents composants maitres, esclaves et syscon qui composent le système ainsi que le décodage d&#039;adresse.&lt;br /&gt;
* Un ou plusieurs &#039;&#039;&#039;Arbitres&#039;&#039;&#039;. Ce composant va faire la gestion des signaux de contrôle des différents composants du bus pour autoriser les transferts entre maitre et esclave (sélection du maitre actif, contrôle de fin de transfert, etc).&lt;br /&gt;
&lt;br /&gt;
=== Type d&#039;interconnexion ===&lt;br /&gt;
Le bus peut être de type:&lt;br /&gt;
* &#039;&#039;&#039;Point To Point&#039;&#039;&#039;: Un maitre communique avec une esclave&lt;br /&gt;
* &#039;&#039;&#039;DataFlow&#039;&#039;&#039;: Chaque composant du bus possède une interface maitre et une interface esclave et tous les composants sont chainés l&#039;un après l&#039;autre.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;:  Tout les composants sont connectés sur le même bus de communication. Si plusieurs maitres se trouvent sur ce bus, un composant d&#039;arbitrage va faire la sélection du maitre qui aura le droit d&#039;effectuer des opérations sur le bus. Les autres maitres seront placés dans une file d&#039;attente.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: Avec ce type de bus, chaque composant maitre dispose d&#039;un bus de communication. Ceci permet à plusieurs maitres de communiquer en même temps. Lorsque plusieurs maitres sont connecté à un même composant esclave, un composant arbitre est intercalé qui va faire la sélection du maitre qui aura l&#039;accès à l&#039;esclave, les autres seront placés dans une file d&#039;attente.&lt;br /&gt;
&lt;br /&gt;
Mais un bus Wishbone peut être composé d&#039;une combinaison de ces différentes possibilités.&lt;br /&gt;
&lt;br /&gt;
=== Signaux du Wishbone ===&lt;br /&gt;
&lt;br /&gt;
== Le bus iMXL ==&lt;br /&gt;
&lt;br /&gt;
== Interface Wishbone/i.MXL ==&lt;br /&gt;
&lt;br /&gt;
== Wishbone Tools ==&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4044</id>
		<title>User:FabriceM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User:FabriceM&amp;diff=4044"/>
		<updated>2008-05-14T08:20:48Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Je suis électronicien de formation, mais après quelques années de travail j&#039;ai progressivement tourné le dos à l&#039;électronique (la vrai avec des condensateurs, des résistances, des selfs, etc.) pour faire plus de la programmation aussi bien Windows (C, C# et VB) qu&#039;embarqué (C ou assembleur).&lt;br /&gt;
&lt;br /&gt;
Début 2000, j&#039;ai fait la découverte de Linux, tout d&#039;abord avec la distribution Debian, que j&#039;utilise chez moi sur un PC qui me sert de serveur et, en 2004, je me suis mis à Ubuntu, que j&#039;utilise sur mon PC portable en dual boot avec Windows, parce que certains outils ne fonctionnent que sous Windows et qu&#039;au boulot de toute façon j&#039;utilise Windows.&lt;br /&gt;
&lt;br /&gt;
Durant ma relativement longue carrière professionnelle, j&#039;ai travaillé avec un certain nombre de technologies plus ou moins de pointe:&lt;br /&gt;
* Le &#039;&#039;&#039;80c51&#039;&#039;&#039;, mon premier micro-contrôleur avec lequel j&#039;ai réalisé un système de synthèse vocale par diphonèmes en 1993.&lt;br /&gt;
* Le &#039;&#039;&#039;RDS&#039;&#039;&#039; (Radio Data System). Dans mon premier emploi, j&#039;ai participé au développement de produit pro ou semi-pro pour la diffusion de données RDS (Nom de la station, titre en cours de diffusion, radio-guidage, etc.)&lt;br /&gt;
* Les &#039;&#039;&#039;protocoles série&#039;&#039;&#039; (JBUS, MODBUS) ainsi que les accès MODEM (HAYES mon ami/ennemi)&lt;br /&gt;
* Le &#039;&#039;&#039;protocole TCP/IP&#039;&#039;&#039; et les systèmes temps réels.&lt;br /&gt;
* Le &#039;&#039;&#039;68EN360&#039;&#039;&#039;, mon micro-contrôleur préféré avec lequel j&#039;ai réalisé un système complet RTOS + Pile TCP/IP de 1999 à 2003. Au début de l&#039;aventure, très peu de personnes connaissaient le protocole TCP/IP et les connexions à internet n&#039;étaient pas encore &#039;&#039;démocratisées&#039;&#039;&lt;br /&gt;
* Le &#039;&#039;&#039;MP3&#039;&#039;&#039;&lt;br /&gt;
* Les &#039;&#039;&#039;systèmes de fichiers embarqués&#039;&#039;&#039;&lt;br /&gt;
* Le &#039;&#039;&#039;PowerPC&#039;&#039;&#039;&lt;br /&gt;
* La programmation de composants &#039;&#039;&#039;ActiveX&#039;&#039;&#039;&lt;br /&gt;
* La technologie &#039;&#039;&#039;.NET&#039;&#039;&#039; avec le &#039;&#039;&#039;Framework 1.1 et 2.0&#039;&#039;&#039; ainsi que le &#039;&#039;&#039;Compact Framework 1.02&#039;&#039;&#039;&lt;br /&gt;
* Le langage &#039;&#039;&#039;C#&#039;&#039;&#039;&lt;br /&gt;
* Les circuits &#039;&#039;&#039;CPLD&#039;&#039;&#039; et &#039;&#039;&#039;FPGA&#039;&#039;&#039;&lt;br /&gt;
* Le langage&#039;&#039;&#039;VHDL&#039;&#039;&#039;&lt;br /&gt;
* Les &#039;&#039;&#039;Softcores&#039;&#039;&#039; en particulier &#039;&#039;&#039;NIOS II&#039;&#039;&#039;&lt;br /&gt;
* Les outils &#039;&#039;&#039;Open Sources&#039;&#039;&#039; commme &#039;&#039;&#039;la chaîne de compilation GCC&#039;&#039;&#039;, &#039;&#039;&#039;Newlib&#039;&#039;&#039;, etc.&lt;br /&gt;
* Le système &#039;&#039;&#039;Windows CE 5.0&#039;&#039;&#039;&lt;br /&gt;
* Le système &#039;&#039;&#039;Windows XPEmbedded&#039;&#039;&#039;, une grosse daube qui ne reflète pas vraiment les qualités de la version &#039;&#039;boîte&#039;&#039;&lt;br /&gt;
* Le bus &#039;&#039;&#039;VME&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mais de toutes ces technologies, celle qui me procure le plus de plaisir, en tout cas à l&#039;heure actuelle, c&#039;est le VHDL.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Using_FPGA&amp;diff=3512</id>
		<title>Using FPGA</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Using_FPGA&amp;diff=3512"/>
		<updated>2008-03-05T20:56:13Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Developing on the APF FPGA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Developing on the APF FPGA==&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;5&amp;quot; summary=&amp;quot;Hardware Add-Ons by functionnalities&amp;quot;&lt;br /&gt;
|----------------&lt;br /&gt;
|- style=&amp;quot;background:#f4f4f4; color:black; -moz-border-radius:18px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
===Tools===&lt;br /&gt;
* [[FPGA | FPGA on APF introduction]]&lt;br /&gt;
* [[ISE WebPack installation on Linux]]&lt;br /&gt;
* [[How to make a VHDL design in Ubuntu/Debian]]&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
===Xilinx documentation links===&lt;br /&gt;
* [http://www.xilinx.com/support/documentation/data_sheets/ds099.pdf Spartan-3 FPGA Family Data Sheet]&lt;br /&gt;
|----------------&lt;br /&gt;
|- style=&amp;quot;background:#f4f4f4; color:black; -moz-border-radius:18px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
===Designs===&lt;br /&gt;
* [[FPGA and led]]&lt;br /&gt;
* [[Une led qui clignote avec le spartan 3]]&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
===Link VHDL===&lt;br /&gt;
* [http://www.chez.com/amouf/syntaxe.htm Syntaxe VHDL (French)]&lt;br /&gt;
* [http://www.gmvhdl.com/VHDL.html An Introductory VHDL Tutorial]&lt;br /&gt;
&lt;br /&gt;
|----------------&lt;br /&gt;
|- style=&amp;quot;background:#f4f4f4; color:black; -moz-border-radius:18px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
===Orchestra===&lt;br /&gt;
* [[FpgaArchitecture | Spécification de l&#039;architecture du FPGA (french)]]&lt;br /&gt;
* [[Orchestra | Spécification de l&#039;outil de conception automatique du FPGA (french)]]&lt;br /&gt;
* [[FPGA | FPGA project generation with Orchestra]]&lt;br /&gt;
* [[OrchestraPython | Elaboration du projet Orchestra en Python (french)]]&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
===Link Orchestra===&lt;br /&gt;
* [http://www.opencores.org/projects.cgi/web/wishbone/wbspec_b3.pdf  official Wishbone specifications]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Wishbone_%28computer_bus%29 Wikipedia Wishbone doc]&lt;br /&gt;
|----------------&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Using_FPGA&amp;diff=3511</id>
		<title>Using FPGA</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Using_FPGA&amp;diff=3511"/>
		<updated>2008-03-05T20:47:38Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Link Orchestra */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Developing on the APF FPGA==&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;5&amp;quot; summary=&amp;quot;Hardware Add-Ons by functionnalities&amp;quot;&lt;br /&gt;
|----------------&lt;br /&gt;
|- style=&amp;quot;background:#f4f4f4; color:black; -moz-border-radius:18px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
===Tools===&lt;br /&gt;
* [[FPGA | FPGA on APF introduction]]&lt;br /&gt;
* [[ISE WebPack installation on Linux]]&lt;br /&gt;
* [[How to make a VHDL design in Ubuntu/Debian]]&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
===Xilinx documentation links===&lt;br /&gt;
* [http://www.xilinx.com/support/documentation/data_sheets/ds099.pdf Spartan-3 FPGA Family Data Sheet]&lt;br /&gt;
|----------------&lt;br /&gt;
|- style=&amp;quot;background:#f4f4f4; color:black; -moz-border-radius:18px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
===Designs===&lt;br /&gt;
* [[FPGA and led]]&lt;br /&gt;
* [[Une led qui clignote avec le spartan 3]]&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|----------------&lt;br /&gt;
|- style=&amp;quot;background:#f4f4f4; color:black; -moz-border-radius:18px;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
===Orchestra===&lt;br /&gt;
*  [[FpgaArchitecture| Spécification de l&#039;architecture du FPGA]] &lt;br /&gt;
* [[FPGA| FPGA project generation with Orchestra]]&lt;br /&gt;
* [[OrchestraPython | Elaboration du projet Orchestra en Python]]&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
===Link Orchestra===&lt;br /&gt;
* [http://www.opencores.org/projects.cgi/web/wishbone/wbspec_b3.pdf  official Wishbone specifications]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Wishbone_%28computer_bus%29 Wikipedia Wishbone doc]&lt;br /&gt;
|----------------&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=3408</id>
		<title>Members</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=3408"/>
		<updated>2008-02-24T16:36:34Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Here are the places where the german members are living */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Google Map==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;googlemap lat=&amp;quot;47&amp;quot; lon=&amp;quot;6&amp;quot; width=640 height=480 zoom=5&amp;gt;&lt;br /&gt;
47.263854, 6.025314, [[User:JulienB]] Besancon&lt;br /&gt;
47.752598,7.301788, ARMadeus Systems&lt;br /&gt;
47.760791, 7.339897, [[User:Salocin68]] Mulhouse&lt;br /&gt;
47.734392,7.316975, [[User:FabienM]] Mulhouse&lt;br /&gt;
46.550833, 6.632309, [[User:Jorasse]] Lausanne&lt;br /&gt;
47.681108, 7.390366, [[User:Carbure]] Helfranzkirch&lt;br /&gt;
47.436448, 8.429947, [[User:SonZerro]] Baden&lt;br /&gt;
44.653992, 6.176672, [[User:JulienN]] Chabottes&lt;br /&gt;
48.568077,7.912888,  [[User:KroMignon]] Legelshurst&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Here are the places where the french members are living==&lt;br /&gt;
Work in progress !!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: relative&amp;quot;&amp;gt;[[Image:France.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 350px; top: 250px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Besançon(3)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 350px; top: 320px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Lyon(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 390px; top: 340px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Grenoble(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 350px; top: 360px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Valence(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 310px; top: 220px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Dijon(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 420px; top: 180px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Mulhouse(3)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 400px; top: 210px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Montbéliard/Belfort(2)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 460px; top: 120px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Strasbourg(3)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 400px; top: 100px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Metz(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 400px; top: 145px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Charmes(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 255px; top: 5px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Lille(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 250px; top: 70px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Amiens(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 250px; top: 150px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Paris(20)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 300px; top: 120px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Soisson(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 335px; top: 132px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Reims(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 150px; top: 190px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Angers(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 100px; top: 210px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Nantes(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 180px; top: 170px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Le Mans(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 80px; top: 150px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Rennes(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 250px; top: 480px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Perpignan(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 350px; top: 450px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Aix/Marseille(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 200px; top: 400px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Toulouse(2)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 200px; top: 350px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Périgueux(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DOM-TOM===&lt;br /&gt;
* La Réunion (1)&lt;br /&gt;
* Martinique (1)&lt;br /&gt;
&lt;br /&gt;
==Here are the places where the swiss members are living==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: relative&amp;quot;&amp;gt;[[Image:Suisse.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 50px; top: 150px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Lausanne(2)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 100px; top: 110px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Fribourg(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 150px; top: 30px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Basel(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 220px; top: 50px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Zürich(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Here are the places where the belgian members are living==&lt;br /&gt;
Liege (1)&lt;br /&gt;
Work in progress !!&lt;br /&gt;
&lt;br /&gt;
==Here are the places where the german members are living==&lt;br /&gt;
* Munich (1)&lt;br /&gt;
* Legelshurst/Offenburg (1)&lt;br /&gt;
Work in progress !!&lt;br /&gt;
&lt;br /&gt;
==Here are the places where the irish members are living==&lt;br /&gt;
* Dublin(1)&lt;br /&gt;
Work in progress !!&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=3407</id>
		<title>Members</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Members&amp;diff=3407"/>
		<updated>2008-02-24T16:34:35Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Google Map */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Google Map==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;googlemap lat=&amp;quot;47&amp;quot; lon=&amp;quot;6&amp;quot; width=640 height=480 zoom=5&amp;gt;&lt;br /&gt;
47.263854, 6.025314, [[User:JulienB]] Besancon&lt;br /&gt;
47.752598,7.301788, ARMadeus Systems&lt;br /&gt;
47.760791, 7.339897, [[User:Salocin68]] Mulhouse&lt;br /&gt;
47.734392,7.316975, [[User:FabienM]] Mulhouse&lt;br /&gt;
46.550833, 6.632309, [[User:Jorasse]] Lausanne&lt;br /&gt;
47.681108, 7.390366, [[User:Carbure]] Helfranzkirch&lt;br /&gt;
47.436448, 8.429947, [[User:SonZerro]] Baden&lt;br /&gt;
44.653992, 6.176672, [[User:JulienN]] Chabottes&lt;br /&gt;
48.568077,7.912888,  [[User:KroMignon]] Legelshurst&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Here are the places where the french members are living==&lt;br /&gt;
Work in progress !!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: relative&amp;quot;&amp;gt;[[Image:France.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 350px; top: 250px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Besançon(3)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 350px; top: 320px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Lyon(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 390px; top: 340px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Grenoble(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 350px; top: 360px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Valence(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 310px; top: 220px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Dijon(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 420px; top: 180px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Mulhouse(3)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 400px; top: 210px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Montbéliard/Belfort(2)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 460px; top: 120px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Strasbourg(3)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 400px; top: 100px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Metz(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 400px; top: 145px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Charmes(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 255px; top: 5px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Lille(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 250px; top: 70px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Amiens(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 250px; top: 150px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Paris(20)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 300px; top: 120px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Soisson(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 335px; top: 132px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Reims(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 150px; top: 190px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Angers(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 100px; top: 210px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Nantes(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 180px; top: 170px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Le Mans(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 80px; top: 150px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Rennes(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 250px; top: 480px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Perpignan(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 350px; top: 450px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Aix/Marseille(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 200px; top: 400px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Toulouse(2)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 200px; top: 350px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Périgueux(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DOM-TOM===&lt;br /&gt;
* La Réunion (1)&lt;br /&gt;
* Martinique (1)&lt;br /&gt;
&lt;br /&gt;
==Here are the places where the swiss members are living==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: relative&amp;quot;&amp;gt;[[Image:Suisse.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 50px; top: 150px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Lausanne(2)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 100px; top: 110px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Fribourg(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 150px; top: 30px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Basel(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; left: 220px; top: 50px&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:transparent&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| Zürich(1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Here are the places where the belgian members are living==&lt;br /&gt;
Liege (1)&lt;br /&gt;
Work in progress !!&lt;br /&gt;
&lt;br /&gt;
==Here are the places where the german members are living==&lt;br /&gt;
* Munich (1)&lt;br /&gt;
Work in progress !!&lt;br /&gt;
&lt;br /&gt;
==Here are the places where the irish members are living==&lt;br /&gt;
* Dublin(1)&lt;br /&gt;
Work in progress !!&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=OrchestraPython&amp;diff=3380</id>
		<title>OrchestraPython</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=OrchestraPython&amp;diff=3380"/>
		<updated>2008-02-22T10:36:59Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Fonctionnement du programme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Plan de développement ==&lt;br /&gt;
Cette page a pour objectif de clarifier le développement d&#039;Orchestra en Python.&lt;br /&gt;
Pourquoi Python ? Parce que c&#039;est le langage que j&#039;ai choisi pour le développement tout simplement.&lt;br /&gt;
Et aussi parce qu&#039;il:&lt;br /&gt;
* intègre déjà beaucoup de fonctions;&lt;br /&gt;
* est multi-platerforme (Unix/Linux, MacOS, Windows, BSD, etc.);&lt;br /&gt;
* est facilement extensible&lt;br /&gt;
* etc...&lt;br /&gt;
&lt;br /&gt;
Le développement du projet Orchestra se fait sous licence GPL v3 et suivantes.&lt;br /&gt;
&lt;br /&gt;
Après une petite analyse des possibilités du langage Python et divers projets existants, j&#039;ai décidé de découper le développement de cette façon:&lt;br /&gt;
* orchestra.py: ce module est le module principal qui va lancer/initialiser le progamme&lt;br /&gt;
* orchestralib: cette librairie est le coeur de l&#039;application, c&#039;est ici que se situe toute l&#039;intelligence.&lt;br /&gt;
&lt;br /&gt;
La librairie &#039;&#039;&#039;orchestralib&#039;&#039;&#039; est composée des sous-librairies suivantes:&lt;br /&gt;
* core : cette librairie contient toutes les classes de base utilisées par Orchestra&lt;br /&gt;
* components : cette librairie contient toutes les classes nécessaires au traitement des &amp;quot;Armadeus Ready Components&amp;quot;&lt;br /&gt;
* thirdparty : cette librairie contient toutes les librairies tierces utilisées pour le développement et ne faisant pas partie des librairies standards de Python&lt;br /&gt;
* vhdl : cette librairie contient les classes nécessaires pour le traitement des fichiers VHDL&lt;br /&gt;
&lt;br /&gt;
== Convention de codage ==&lt;br /&gt;
Pour le développement des classes, la convention de codage suivante a été utilisée:&lt;br /&gt;
* Tous les noms sont en anglais, courts et le plus expressifs possibles;&lt;br /&gt;
* Le nom des variables est en minuscule avec &#039;_&#039; pour la séparation des mots;&lt;br /&gt;
* Le nom des constantes est en majuscule avec &#039;_&#039; pour la séparation des mots;&lt;br /&gt;
* Le nom des fonctions est en camelCase, avec la première lettre en minuscule;&lt;br /&gt;
* Le nom des classes est en CamelCase, avec la première lettre en majuscule.&lt;br /&gt;
* Utilisation de DocString (en anglais) pour documenter un maximum le code pour garantir la maintenance du code.&lt;br /&gt;
&lt;br /&gt;
== Détails de la mise en oeuvre ==&lt;br /&gt;
=== Les composants Armadeus ===&lt;br /&gt;
Les composants Armadeus sont placés dans le sous répertoire &amp;quot;components&amp;quot; du projet.&lt;br /&gt;
Chaque composant est regroupé dans une archive ZIP et contient:&lt;br /&gt;
* Un fichier XML de description&lt;br /&gt;
* Un ou plusieurs fichiers VHDL/Verilog (l&#039;IP)&lt;br /&gt;
* Un ou plusieurs fichiers C/H (un driver)&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;instant ceux sont uniquement le fichier XML et les fichiers VHDL qui sont traités.&lt;br /&gt;
&lt;br /&gt;
=== Les plateformes ===&lt;br /&gt;
Les plateformes Armadeus sont placées dans le sous répertoire &amp;quot;boards&amp;quot; du projet.&lt;br /&gt;
Chaque plateforme est décrite par un fichier XML.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement du programme ===&lt;br /&gt;
Pour rendre le programme le plus simple d&#039;utilisation possible, tout le fonctionnement est basé sur un interpréteur de commandes.&lt;br /&gt;
&lt;br /&gt;
Cet interpréteur est basé sur le module &#039;&#039;&#039;cmd&#039;&#039;&#039; qui fait partie des modules de base de la distribution Python. Cette classe de base a été modifiée/complétée pour supporter:&lt;br /&gt;
* l&#039;utilisation de fichiers scripts,&lt;br /&gt;
* les commentaires,&lt;br /&gt;
* le décodage des arguments,&lt;br /&gt;
* être insensible à la casse.&lt;br /&gt;
&lt;br /&gt;
Le traitement des fichiers XML est fait par &#039;&#039;&#039;ElementTree&#039;&#039;&#039;, qui ne fait pas partie de la distribution Python.&lt;br /&gt;
&lt;br /&gt;
Le traitement des fichiers ZIP est basé sur le module &#039;&#039;&#039;zipfile&#039;&#039;&#039; de la distribution Python. Ce module a été complété et modifié par mes soins pour ajouter:&lt;br /&gt;
* la gestion de la suppression et du remplacement de fichiers dans une archive ZIP,&lt;br /&gt;
* la gestion de fichier ZIP en RAM,&lt;br /&gt;
* l&#039;ajout/suppression de répertoires/sous-répertoires.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=OrchestraPython&amp;diff=3357</id>
		<title>OrchestraPython</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=OrchestraPython&amp;diff=3357"/>
		<updated>2008-02-14T16:10:07Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Les plateformes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Plan de développement ==&lt;br /&gt;
Cette page a pour objectif de clarifier le développement d&#039;Orchestra en Python.&lt;br /&gt;
Pourquoi Python ? Parce que c&#039;est le langage que j&#039;ai choisi pour le développement tout simplement.&lt;br /&gt;
Et aussi parce qu&#039;il:&lt;br /&gt;
* intègre déjà beaucoup de fonctions;&lt;br /&gt;
* est multi-platerforme (Unix/Linux, MacOS, Windows, BSD, etc.);&lt;br /&gt;
* est facilement extensible&lt;br /&gt;
* etc...&lt;br /&gt;
&lt;br /&gt;
Le développement du projet Orchestra se fait sous licence GPL v3 et suivantes.&lt;br /&gt;
&lt;br /&gt;
Après une petite analyse des possibilités du langage Python et divers projets existants, j&#039;ai décidé de découper le développement de cette façon:&lt;br /&gt;
* orchestra.py: ce module est le module principal qui va lancer/initialiser le progamme&lt;br /&gt;
* orchestralib: cette librairie est le coeur de l&#039;application, c&#039;est ici que se situe toute l&#039;intelligence.&lt;br /&gt;
&lt;br /&gt;
La librairie &#039;&#039;&#039;orchestralib&#039;&#039;&#039; est composée des sous-librairies suivantes:&lt;br /&gt;
* core : cette librairie contient toutes les classes de base utilisées par Orchestra&lt;br /&gt;
* components : cette librairie contient toutes les classes nécessaires au traitement des &amp;quot;Armadeus Ready Components&amp;quot;&lt;br /&gt;
* thirdparty : cette librairie contient toutes les librairies tierces utilisées pour le développement et ne faisant pas partie des librairies standards de Python&lt;br /&gt;
* vhdl : cette librairie contient les classes nécessaires pour le traitement des fichiers VHDL&lt;br /&gt;
&lt;br /&gt;
== Convention de codage ==&lt;br /&gt;
Pour le développement des classes, la convention de codage suivante a été utilisée:&lt;br /&gt;
* Tous les noms sont en anglais, courts et le plus expressifs possibles;&lt;br /&gt;
* Le nom des variables est en minuscule avec &#039;_&#039; pour la séparation des mots;&lt;br /&gt;
* Le nom des constantes est en majuscule avec &#039;_&#039; pour la séparation des mots;&lt;br /&gt;
* Le nom des fonctions est en camelCase, avec la première lettre en minuscule;&lt;br /&gt;
* Le nom des classes est en CamelCase, avec la première lettre en majuscule.&lt;br /&gt;
* Utilisation de DocString (en anglais) pour documenter un maximum le code pour garantir la maintenance du code.&lt;br /&gt;
&lt;br /&gt;
== Détails de la mise en oeuvre ==&lt;br /&gt;
=== Les composants Armadeus ===&lt;br /&gt;
Les composants Armadeus sont placés dans le sous répertoire &amp;quot;components&amp;quot; du projet.&lt;br /&gt;
Chaque composant est regroupé dans une archive ZIP et contient:&lt;br /&gt;
* Un fichier XML de description&lt;br /&gt;
* Un ou plusieurs fichiers VHDL/Verilog (l&#039;IP)&lt;br /&gt;
* Un ou plusieurs fichiers C/H (un driver)&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;instant ceux sont uniquement le fichier XML et les fichiers VHDL qui sont traités.&lt;br /&gt;
&lt;br /&gt;
=== Les plateformes ===&lt;br /&gt;
Les plateformes Armadeus sont placées dans le sous répertoire &amp;quot;boards&amp;quot; du projet.&lt;br /&gt;
Chaque plateforme est décrite par un fichier XML.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement du programme ===&lt;br /&gt;
Pour rendre le programme le plus simple d&#039;utilisation possible, tout le fonctionnement est basé sur un interpréteur de commandes.&lt;br /&gt;
Cet interpréteur est basé sur le module &#039;&#039;&#039;cmd&#039;&#039;&#039; qui fait partie des modules de base de la distribution Python. Cette classe de base a été modifiée pour supporter l&#039;utilisation de fichiers scripts, commentaires et le décodage des arguments.&lt;br /&gt;
Le traitement des fichiers XML est fait par ElementTree, qui ne fait pas partie de la distribution Python.&lt;br /&gt;
Le traitement des fichiers ZIP est basé sur le module zipfile de la distribution Python. Ce module a été complété et modifié par mes soins pour ajouter la gestion de la suppression et du remplacement de fichiers dans une archive ZIP.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=OrchestraPython&amp;diff=3356</id>
		<title>OrchestraPython</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=OrchestraPython&amp;diff=3356"/>
		<updated>2008-02-13T21:12:05Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Détails de la mise en oeuvre */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Plan de développement ==&lt;br /&gt;
Cette page a pour objectif de clarifier le développement d&#039;Orchestra en Python.&lt;br /&gt;
Pourquoi Python ? Parce que c&#039;est le langage que j&#039;ai choisi pour le développement tout simplement.&lt;br /&gt;
Et aussi parce qu&#039;il:&lt;br /&gt;
* intègre déjà beaucoup de fonctions;&lt;br /&gt;
* est multi-platerforme (Unix/Linux, MacOS, Windows, BSD, etc.);&lt;br /&gt;
* est facilement extensible&lt;br /&gt;
* etc...&lt;br /&gt;
&lt;br /&gt;
Le développement du projet Orchestra se fait sous licence GPL v3 et suivantes.&lt;br /&gt;
&lt;br /&gt;
Après une petite analyse des possibilités du langage Python et divers projets existants, j&#039;ai décidé de découper le développement de cette façon:&lt;br /&gt;
* orchestra.py: ce module est le module principal qui va lancer/initialiser le progamme&lt;br /&gt;
* orchestralib: cette librairie est le coeur de l&#039;application, c&#039;est ici que se situe toute l&#039;intelligence.&lt;br /&gt;
&lt;br /&gt;
La librairie &#039;&#039;&#039;orchestralib&#039;&#039;&#039; est composée des sous-librairies suivantes:&lt;br /&gt;
* core : cette librairie contient toutes les classes de base utilisées par Orchestra&lt;br /&gt;
* components : cette librairie contient toutes les classes nécessaires au traitement des &amp;quot;Armadeus Ready Components&amp;quot;&lt;br /&gt;
* thirdparty : cette librairie contient toutes les librairies tierces utilisées pour le développement et ne faisant pas partie des librairies standards de Python&lt;br /&gt;
* vhdl : cette librairie contient les classes nécessaires pour le traitement des fichiers VHDL&lt;br /&gt;
&lt;br /&gt;
== Convention de codage ==&lt;br /&gt;
Pour le développement des classes, la convention de codage suivante a été utilisée:&lt;br /&gt;
* Tous les noms sont en anglais, courts et le plus expressifs possibles;&lt;br /&gt;
* Le nom des variables est en minuscule avec &#039;_&#039; pour la séparation des mots;&lt;br /&gt;
* Le nom des constantes est en majuscule avec &#039;_&#039; pour la séparation des mots;&lt;br /&gt;
* Le nom des fonctions est en camelCase, avec la première lettre en minuscule;&lt;br /&gt;
* Le nom des classes est en CamelCase, avec la première lettre en majuscule.&lt;br /&gt;
* Utilisation de DocString (en anglais) pour documenter un maximum le code pour garantir la maintenance du code.&lt;br /&gt;
&lt;br /&gt;
== Détails de la mise en oeuvre ==&lt;br /&gt;
=== Les composants Armadeus ===&lt;br /&gt;
Les composants Armadeus sont placés dans le sous répertoire &amp;quot;components&amp;quot; du projet.&lt;br /&gt;
Chaque composant est regroupé dans une archive ZIP et contient:&lt;br /&gt;
* Un fichier XML de description&lt;br /&gt;
* Un ou plusieurs fichiers VHDL/Verilog (l&#039;IP)&lt;br /&gt;
* Un ou plusieurs fichiers C/H (un driver)&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;instant ceux sont uniquement le fichier XML et les fichiers VHDL qui sont traités.&lt;br /&gt;
&lt;br /&gt;
=== Les plateformes ===&lt;br /&gt;
Les plateformes Armadeus sont placés dans le sous répertoire &amp;quot;boards&amp;quot; du projet.&lt;br /&gt;
Chaque plateforme est décrite par un fichier XML.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement du programme ===&lt;br /&gt;
Pour rendre le programme le plus simple d&#039;utilisation possible, tout le fonctionnement est basé sur un interpréteur de commandes.&lt;br /&gt;
Cet interpréteur est basé sur le module &#039;&#039;&#039;cmd&#039;&#039;&#039; qui fait partie des modules de base de la distribution Python. Cette classe de base a été modifiée pour supporter l&#039;utilisation de fichiers scripts, commentaires et le décodage des arguments.&lt;br /&gt;
Le traitement des fichiers XML est fait par ElementTree, qui ne fait pas partie de la distribution Python.&lt;br /&gt;
Le traitement des fichiers ZIP est basé sur le module zipfile de la distribution Python. Ce module a été complété et modifié par mes soins pour ajouter la gestion de la suppression et du remplacement de fichiers dans une archive ZIP.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=OrchestraPython&amp;diff=3355</id>
		<title>OrchestraPython</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=OrchestraPython&amp;diff=3355"/>
		<updated>2008-02-13T21:11:20Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Plan de développement ==&lt;br /&gt;
Cette page a pour objectif de clarifier le développement d&#039;Orchestra en Python.&lt;br /&gt;
Pourquoi Python ? Parce que c&#039;est le langage que j&#039;ai choisi pour le développement tout simplement.&lt;br /&gt;
Et aussi parce qu&#039;il:&lt;br /&gt;
* intègre déjà beaucoup de fonctions;&lt;br /&gt;
* est multi-platerforme (Unix/Linux, MacOS, Windows, BSD, etc.);&lt;br /&gt;
* est facilement extensible&lt;br /&gt;
* etc...&lt;br /&gt;
&lt;br /&gt;
Le développement du projet Orchestra se fait sous licence GPL v3 et suivantes.&lt;br /&gt;
&lt;br /&gt;
Après une petite analyse des possibilités du langage Python et divers projets existants, j&#039;ai décidé de découper le développement de cette façon:&lt;br /&gt;
* orchestra.py: ce module est le module principal qui va lancer/initialiser le progamme&lt;br /&gt;
* orchestralib: cette librairie est le coeur de l&#039;application, c&#039;est ici que se situe toute l&#039;intelligence.&lt;br /&gt;
&lt;br /&gt;
La librairie &#039;&#039;&#039;orchestralib&#039;&#039;&#039; est composée des sous-librairies suivantes:&lt;br /&gt;
* core : cette librairie contient toutes les classes de base utilisées par Orchestra&lt;br /&gt;
* components : cette librairie contient toutes les classes nécessaires au traitement des &amp;quot;Armadeus Ready Components&amp;quot;&lt;br /&gt;
* thirdparty : cette librairie contient toutes les librairies tierces utilisées pour le développement et ne faisant pas partie des librairies standards de Python&lt;br /&gt;
* vhdl : cette librairie contient les classes nécessaires pour le traitement des fichiers VHDL&lt;br /&gt;
&lt;br /&gt;
== Convention de codage ==&lt;br /&gt;
Pour le développement des classes, la convention de codage suivante a été utilisée:&lt;br /&gt;
* Tous les noms sont en anglais, courts et le plus expressifs possibles;&lt;br /&gt;
* Le nom des variables est en minuscule avec &#039;_&#039; pour la séparation des mots;&lt;br /&gt;
* Le nom des constantes est en majuscule avec &#039;_&#039; pour la séparation des mots;&lt;br /&gt;
* Le nom des fonctions est en camelCase, avec la première lettre en minuscule;&lt;br /&gt;
* Le nom des classes est en CamelCase, avec la première lettre en majuscule.&lt;br /&gt;
* Utilisation de DocString (en anglais) pour documenter un maximum le code pour garantir la maintenance du code.&lt;br /&gt;
&lt;br /&gt;
== Détails ==&lt;br /&gt;
=== Les composants Armadeus ===&lt;br /&gt;
Les composants Armadeus sont placés dans le sous répertoire &amp;quot;components&amp;quot; du projet.&lt;br /&gt;
Chaque composant est regroupé dans une archive ZIP et contient:&lt;br /&gt;
* Un fichier XML de description&lt;br /&gt;
* Un ou plusieurs fichiers VHDL/Verilog (l&#039;IP)&lt;br /&gt;
* Un ou plusieurs fichiers C/H (un driver)&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;instant ceux sont uniquement le fichier XML et les fichiers VHDL qui sont traités.&lt;br /&gt;
&lt;br /&gt;
=== Les plateformes ===&lt;br /&gt;
Les plateformes Armadeus sont placés dans le sous répertoire &amp;quot;boards&amp;quot; du projet.&lt;br /&gt;
Chaque plateforme est décrite par un fichier XML.&lt;br /&gt;
&lt;br /&gt;
=== Fonctionnement du programme ===&lt;br /&gt;
Pour rendre le programme le plus simple d&#039;utilisation possible, tout le fonctionnement est basé sur un interpréteur de commandes.&lt;br /&gt;
Cet interpréteur est basé sur le module &#039;&#039;&#039;cmd&#039;&#039;&#039; qui fait partie des modules de base de la distribution Python. Cette classe de base a été modifiée pour supporter l&#039;utilisation de fichiers scripts, commentaires et le décodage des arguments.&lt;br /&gt;
Le traitement des fichiers XML est fait par ElementTree, qui ne fait pas partie de la distribution Python.&lt;br /&gt;
Le traitement des fichiers ZIP est basé sur le module zipfile de la distribution Python. Ce module a été complété et modifié par mes soins pour ajouter la gestion de la suppression et du remplacement de fichiers dans une archive ZIP.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=OrchestraPython&amp;diff=3350</id>
		<title>OrchestraPython</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=OrchestraPython&amp;diff=3350"/>
		<updated>2008-02-12T08:03:55Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Convention de codage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Plan de développement ==&lt;br /&gt;
Cette page a pour objectif de clarifier le développement d&#039;Orchestra en Python.&lt;br /&gt;
Pourquoi Python ? Parce que c&#039;est le langage que j&#039;ai choisi pour le développement tout simplement.&lt;br /&gt;
Et aussi parce qu&#039;il:&lt;br /&gt;
* intègre déjà beaucoup de fonctions;&lt;br /&gt;
* est multi-platerforme (Unix/Linux, MacOS, Windows, BSD, etc.);&lt;br /&gt;
* est facilement extensible&lt;br /&gt;
* etc...&lt;br /&gt;
&lt;br /&gt;
Après une petite analyse des possibilités du langage Python et divers projets existants, j&#039;ai décidé de découper le développement de cette façon:&lt;br /&gt;
* orchestra.py: ce module est le module principal qui va lancer/initialiser le progamme&lt;br /&gt;
* orchestralib: cette librairie est le coeur de l&#039;application, c&#039;est ici que se situe toute l&#039;intelligence.&lt;br /&gt;
&lt;br /&gt;
La librairie orchestralib est composée des sous-librairies suivantes:&lt;br /&gt;
* core : cette librairie contient toutes les classes de base utilisées par Orchestra&lt;br /&gt;
* components : cette librairie contient toutes les classes nécessaires au traitement des &amp;quot;Armadeus Ready Components&amp;quot;&lt;br /&gt;
* thirdparty : cette librairie contient toutes les librairies tierces utilisées pour le développement et ne faisant pas partie des librairies standards de Python&lt;br /&gt;
* vhdl : cette librairie contient les classes nécessaires pour le traitement des fichiers VHDL&lt;br /&gt;
&lt;br /&gt;
== Convention de codage ==&lt;br /&gt;
Pour le développement des classes, la convention de codage suivante a été utilisée:&lt;br /&gt;
* Tous les noms sont en anglais, courts et le plus expressifs possibles;&lt;br /&gt;
* Le nom des variables est en minuscule avec &#039;_&#039; pour la séparation des mots;&lt;br /&gt;
* Le nom des constantes est en majuscule avec &#039;_&#039; pour la séparation des mots;&lt;br /&gt;
* Le nom des fonctions est en camelCase, avec la première lettre en minuscule;&lt;br /&gt;
* Le nom des classes est en CamelCase, avec la première lettre en majuscule.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=OrchestraPython&amp;diff=3349</id>
		<title>OrchestraPython</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=OrchestraPython&amp;diff=3349"/>
		<updated>2008-02-11T21:23:29Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Plan de développement ==&lt;br /&gt;
Cette page a pour objectif de clarifier le développement d&#039;Orchestra en Python.&lt;br /&gt;
Pourquoi Python ? Parce que c&#039;est le langage que j&#039;ai choisi pour le développement tout simplement.&lt;br /&gt;
Et aussi parce qu&#039;il:&lt;br /&gt;
* intègre déjà beaucoup de fonctions;&lt;br /&gt;
* est multi-platerforme (Unix/Linux, MacOS, Windows, BSD, etc.);&lt;br /&gt;
* est facilement extensible&lt;br /&gt;
* etc...&lt;br /&gt;
&lt;br /&gt;
Après une petite analyse des possibilités du langage Python et divers projets existants, j&#039;ai décidé de découper le développement de cette façon:&lt;br /&gt;
* orchestra.py: ce module est le module principal qui va lancer/initialiser le progamme&lt;br /&gt;
* orchestralib: cette librairie est le coeur de l&#039;application, c&#039;est ici que se situe toute l&#039;intelligence.&lt;br /&gt;
&lt;br /&gt;
La librairie orchestralib est composée des sous-librairies suivantes:&lt;br /&gt;
* core : cette librairie contient toutes les classes de base utilisées par Orchestra&lt;br /&gt;
* components : cette librairie contient toutes les classes nécessaires au traitement des &amp;quot;Armadeus Ready Components&amp;quot;&lt;br /&gt;
* thirdparty : cette librairie contient toutes les librairies tierces utilisées pour le développement et ne faisant pas partie des librairies standards de Python&lt;br /&gt;
* vhdl : cette librairie contient les classes nécessaires pour le traitement des fichiers VHDL&lt;br /&gt;
&lt;br /&gt;
== Convention de codage ==&lt;br /&gt;
Pour le développement des classes, la convention de codage suivante a été utilisée:&lt;br /&gt;
* Tous les noms sont en anglais, courts et le plus expressifs possibles;&lt;br /&gt;
* Le nom des variables est en minuscule avec &#039;_&#039; pour la séparation des mots;&lt;br /&gt;
* Le nom des constantes est en majuscule avec &#039;_&#039; pour la séparation des mots;&lt;br /&gt;
* Le nom des fonction est en camelCase, avec la première lettre en minuscule;&lt;br /&gt;
* Le nom des classes est en CamelCase, avec la première lettre en majuscule.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User_talk:FabriceM&amp;diff=3348</id>
		<title>User talk:FabriceM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User_talk:FabriceM&amp;diff=3348"/>
		<updated>2008-02-11T20:00:23Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Points abordés avec ce projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mon ambition sur ce projet est essentiellement basée sur le FPGA.&lt;br /&gt;
&lt;br /&gt;
== Points abordés avec ce projet ==&lt;br /&gt;
* Analyse du bus Wishbone (en cours... 140 pages pas faciles à absorber :( !)&lt;br /&gt;
* Analyse du soft Wishbone Builder (écrit en Perl, pas trop mal fait mais pas assez modulaire à mon goût)&lt;br /&gt;
* Analyse du bus i.MXL (il me faut encore extraire les infos utiles du databook)&lt;br /&gt;
* [[FpgaArchitecture|Spécification de l&#039;architecture du FPGA]]&lt;br /&gt;
* [[FpgaCodingRules|Spécification des règles de codage]]&lt;br /&gt;
* [[Orchestra|Spécification de l&#039;outil de conception automatique du FPGA]]&lt;br /&gt;
* Elaboration d&#039;une interface i.MXL &amp;lt;-&amp;gt; Wishbone&lt;br /&gt;
* Création d&#039;un banc de test VHDL / ModelSim&lt;br /&gt;
* Création d&#039;un design simple : Interface i.MXL/Wishbone + Registres&lt;br /&gt;
* Création d&#039;un petit programme pour accès aux registres dans le FPGA (langage ?!?)&lt;br /&gt;
* Création d&#039;un cahier des charges pour un outils de conception automatique du FPGA (petite préférence pour python... Il faut bien amortir les livres que j&#039;ai acheté sur le sujet ;-) )&lt;br /&gt;
* [[OrchestraPython|Elaboration du projet Orchestra en Python]]&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
=== Vu d&#039;ensemble ===&lt;br /&gt;
Le bus Wishbone est une spécifications de bus d&#039;interconnexion placé dans le domaine public. Son utilisation est libre de droit. Les [http://www.opencores.org/projects.cgi/web/wishbone/wbspec_b3.pdf|spécification Wishbone Version B3] sont librement accessibles. Le bus Wishbone est entièrement synchrone et définit un certain nombre d&#039;éléments:&lt;br /&gt;
* Des &#039;&#039;&#039;Maitres&#039;&#039;&#039;. Ces composants vont initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des &#039;&#039;&#039;Esclaves&#039;&#039;&#039;. Ces composants vont répondre à des demandes de transfert.&lt;br /&gt;
* Un &#039;&#039;&#039;Syscon&#039;&#039;&#039;. Ce composant va fournir les signaux globaux CLK (horloge système) et RST (reset synchrone)&lt;br /&gt;
* Une ou plusieurs &#039;&#039;&#039;Interconnexions&#039;&#039;&#039;. Ce macro composant prend en charge les connexions entre les différents composants maitres, esclaves et syscon qui composent le système ainsi que le décodage d&#039;adresse.&lt;br /&gt;
* Un ou plusieurs &#039;&#039;&#039;Arbitres&#039;&#039;&#039;. Ce composant va faire la gestion des signaux de contrôle des différents composants du bus pour autoriser les transferts entre maitre et esclave (sélection du maitre actif, contrôle de fin de transfert, etc).&lt;br /&gt;
&lt;br /&gt;
=== Type d&#039;interconnexion ===&lt;br /&gt;
Le bus peut être de type:&lt;br /&gt;
* &#039;&#039;&#039;Point To Point&#039;&#039;&#039;: Un maitre communique avec une esclave&lt;br /&gt;
* &#039;&#039;&#039;DataFlow&#039;&#039;&#039;: Chaque composant du bus possède une interface maitre et une interface esclave et tous les composants sont chainés l&#039;un après l&#039;autre.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;:  Tout les composants sont connectés sur le même bus de communication. Si plusieurs maitres se trouvent sur ce bus, un composant d&#039;arbitrage va faire la sélection du maitre qui aura le droit d&#039;effectuer des opérations sur le bus. Les autres maitres seront placés dans une file d&#039;attente.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: Avec ce type de bus, chaque composant maitre dispose d&#039;un bus de communication. Ceci permet à plusieurs maitres de communiquer en même temps. Lorsque plusieurs maitres sont connecté à un même composant esclave, un composant arbitre est intercalé qui va faire la sélection du maitre qui aura l&#039;accès à l&#039;esclave, les autres seront placés dans une file d&#039;attente.&lt;br /&gt;
&lt;br /&gt;
Mais un bus Wishbone peut être composé d&#039;une combinaison de ces différentes possibilités.&lt;br /&gt;
&lt;br /&gt;
=== Signaux du Wishbone ===&lt;br /&gt;
&lt;br /&gt;
== Le bus iMXL ==&lt;br /&gt;
&lt;br /&gt;
== Interface Wishbone/i.MXL ==&lt;br /&gt;
&lt;br /&gt;
== Wishbone Tools ==&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=MemberList&amp;diff=2831</id>
		<title>MemberList</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=MemberList&amp;diff=2831"/>
		<updated>2007-09-23T14:52:14Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Here is the list of the (active) members and their skills */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Here is the list of the (active) members and their skills==&lt;br /&gt;
&lt;br /&gt;
This list is maintained by the users themself.&lt;br /&gt;
&lt;br /&gt;
*0: Novice&lt;br /&gt;
*1: Notions. At least one successfull experiment&lt;br /&gt;
*2: Confirmed&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; summary=&amp;quot;Signal connections&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#efefef;&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;Name / IRC Nickname&#039;&#039;&#039; || &#039;&#039;&#039;Linux Apps&#039;&#039;&#039;|| &#039;&#039;&#039;Linux Drivers&#039;&#039;&#039;|| &#039;&#039;&#039;FPGA&#039;&#039;&#039; || &#039;&#039;&#039;Board Design&#039;&#039;&#039; || &#039;&#039;&#039;Projet/Domain&#039;&#039;&#039;&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:Salocin68|Nicolas Colombain / Salocin]] || 1 || 1 || 1 || 2 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienB|Julien Boibessot / Artemys]] || 2 || 2 || 0 || 1 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JeanBaptisteM|Jean-Baptiste Mayer]] || 2 || 1 || 1 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:NicolasA|Nicolas Aguirre]] || 2 || 0 || 1 || 1 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BenoitC|Benoît Canet]] || 2 || 0 || 0 || 0 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:SonZerro|Sonzerro]] || 0 || 0 || 1 || 2 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:HenriG|Henri Geist]] || 1 || 1 || 0 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BorredonB|Bernard Borredon]] || 2 || 1 || 0 || 1 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:ThomasB|Thomas Bores]] || 2 || 0 || 0 || 1 || Entertainment&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:FabriceM|Fabrice Mousset / KroMignon]] || 1 || 1 || 2 || 1 || Domotics &amp;amp; multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:AmineH|Amine EL HEDADI]] || 2 || 2 || 0 || 0 || domotics &amp;amp; robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:PhilippeM|Philippe Monteil]] || 2 || 0 || 0 || 0 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:CedricZ|Cédric Zmyj]] || 0 || 0 || 0 || 0 || domotics &amp;amp; robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JeanMichelN|Jean Michel Naimo]] || 2 || 1 || 1 || 1 || Domotics &amp;amp; entertainment&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:OlivierC|Olivier Coutanceau]] || 1 || 0 || 0 || 0 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:ArnaudC|Arnaud COFFINET]] || 0 || 0 || 1 || 2 || multimedia &amp;amp; domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:SylvainP|Sylvain PARRINO]] || 2 || 1 || 0 || 0 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:AurelienH|Aurélien HIRON]] || 2 || 0 || 0 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:GuillaumeT|Guillaume TRANNOY]] || 0 || 0 || 0 || 2 || domotics &amp;amp; robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienN|Julien NICOLAS]] || 2 || 1 || 0 || 1 || multimedia &amp;amp; network&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:StephaneF|Stéphane Falck]] || 0 || 0 || 0 || 0 || multimedia &amp;amp; robotics &amp;amp; domotics&lt;br /&gt;
|----------------&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=MemberList&amp;diff=2282</id>
		<title>MemberList</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=MemberList&amp;diff=2282"/>
		<updated>2007-04-02T09:23:21Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Here is the list of the members and their skills */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Here is the list of the members and their skills==&lt;br /&gt;
&lt;br /&gt;
*0: Novice&lt;br /&gt;
*1: Notions. At least one successfull experiment&lt;br /&gt;
*2: Confirmed&lt;br /&gt;
&lt;br /&gt;
{|border=1 summary=&amp;quot;Member list&amp;quot;&lt;br /&gt;
|----------------&lt;br /&gt;
| &#039;&#039;&#039;Name&#039;&#039;&#039; || &#039;&#039;&#039;Linux Apps&#039;&#039;&#039;|| &#039;&#039;&#039;Linux Drivers&#039;&#039;&#039;|| &#039;&#039;&#039;FPGA&#039;&#039;&#039; || &#039;&#039;&#039;Board Design&#039;&#039;&#039; || &#039;&#039;&#039;Projet/Domain&#039;&#039;&#039;&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:Salocin68|Nicolas Colombain]] || 1 || 1 || 1 || 2 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienB|Julien Boibessot]] || 2 || 2 || 0 || 1 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JeanBaptisteM|Jean-Baptiste Mayer]] || 2 || 1 || 1 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:NicolasA|Nicolas Aguirre]] || 2 || 0 || 1 || 1 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BenoitC|Benoît Canet]] || 2 || 0 || 0 || 0 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:SonZerro|Sonzerro]] || 0 || 0 || 1 || 2 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:HenriG|Henri Geist]] || 1 || 1 || 0 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BorredonB|Bernard Borredon]] || 2 || 1 || 0 || 1 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:ThomasB|Thomas Bores]] || 2 || 0 || 0 || 1 || Entertainment&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:FabriceM|Fabrice Mousset]] || 1 || 1 || 2 || 1 || Domotics &amp;amp; multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:AmineH|Amine EL HEDADI]] || 2 || 2 || 0 || 0 || domotics &amp;amp; robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:PhilippeM|Philippe Monteil]] || 2 || 0 || 0 || 0 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=MemberList&amp;diff=2280</id>
		<title>MemberList</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=MemberList&amp;diff=2280"/>
		<updated>2007-04-02T09:14:34Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Here is the list of the members and their skills */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Here is the list of the members and their skills==&lt;br /&gt;
&lt;br /&gt;
*0: Novice&lt;br /&gt;
*1: Notions. At least one successfull experiment&lt;br /&gt;
*2: Confirmed&lt;br /&gt;
&lt;br /&gt;
{|border=1 summary=&amp;quot;Member list&amp;quot;&lt;br /&gt;
|----------------&lt;br /&gt;
| &#039;&#039;&#039;Name&#039;&#039;&#039; || &#039;&#039;&#039;Linux Apps&#039;&#039;&#039;|| &#039;&#039;&#039;Linux Drivers&#039;&#039;&#039;|| &#039;&#039;&#039;FPGA&#039;&#039;&#039; || &#039;&#039;&#039;Board Design&#039;&#039;&#039; || &#039;&#039;&#039;Projet/Domain&#039;&#039;&#039;&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:Salocin68|Nicolas Colombain]] || 1 || 1 || 1 || 2 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JulienB|Julien Boibessot]] || 2 || 2 || 0 || 1 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:JeanBaptisteM|Jean-Baptiste Mayer]] || 2 || 1 || 1 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:NicolasA|Nicolas Aguirre]] || 2 || 0 || 1 || 1 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BenoitC|Benoît Canet]] || 2 || 0 || 0 || 0 || multimedia&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:SonZerro|Sonzerro]] || 0 || 0 || 1 || 2 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:HenriG|Henri Geist]] || 1 || 1 || 0 || 1 || robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:BorredonB|Bernard Borredon]] || 2 || 1 || 0 || 1 || domotics&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:ThomasB|Thomas Bores]] || 2 || 0 || 0 || 1 || Entertainment&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:FabriceM|Fabrice Mousset]] || 1 || 1 || 2 || 1 || Entertainment&lt;br /&gt;
|----------------&lt;br /&gt;
|[[User:AmineH|Amine EL HEDADI]] || 2 || 2 || 0 || 0 || domotics &amp;amp; robotics&lt;br /&gt;
|----------------&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Orchestra&amp;diff=1881</id>
		<title>Orchestra</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Orchestra&amp;diff=1881"/>
		<updated>2007-01-16T20:46:49Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vue d&#039;ensemble du système Orchestra ==&lt;br /&gt;
&lt;br /&gt;
Une image étant souvent plus explicite qu&#039;un long texte, voici, schématiquement, le principe de fonctionnement retenu pour Orchestra.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Image:orchestra.png|Description fonctionnelle du système]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut reconnaitre de ce schéma, que le système se repose sur:&lt;br /&gt;
* une bibliothèque de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&lt;br /&gt;
* une bibliothèque de plateformes&lt;br /&gt;
* un projet&lt;br /&gt;
* une liste de fichiers modèles&lt;br /&gt;
&lt;br /&gt;
A l&#039;aide des ces composants le &#039;&#039;&#039;&#039;&#039;processeur orchestra&#039;&#039;&#039;&#039;&#039; va générer:&lt;br /&gt;
* un projet Xilinx &#039;&#039;&#039;complet&#039;&#039;&#039;, c&#039;est-à-dire que l&#039;on pourra lancer les outils Xilinx en ligne de commande avec ce projet et générer ainsi les fichiers nécessaires pour le fonctionnement du FPGA. Ce projet pourra également servir de base et être compléter par l&#039;utilisateur pour y inclure d&#039;autres fonctionnalités n&#039;ayant aucun lien avec l&#039;i.MX.&lt;br /&gt;
* un projet &#039;&#039;Device Driver&#039;&#039;, cette sortie est &#039;&#039;&#039;optionnelle&#039;&#039;&#039; et dépendra fortement du type de composants utilisés lors de la construction du système. En effet, ces composants devront inclure une partie driver.&lt;br /&gt;
&lt;br /&gt;
== Format de base des fichiers XML ==&lt;br /&gt;
&lt;br /&gt;
Avant de donner plus de détails sur les fichiers XML traités et/ou générés par Orchestra, voici quelques règles de codage qui seront globalement appliquées :&lt;br /&gt;
* Tous les fichiers XML commencent avec une entête définissant le type de codage utilisé pour les caractères.&lt;br /&gt;
* Toutes les balises et tous les attributs des balises sont en minuscule.&lt;br /&gt;
* Un fichier XML décrit un seul élément, le noeud de base permettra d&#039;identifier le contenu du fichier :&lt;br /&gt;
** &#039;&#039;&#039;component&#039;&#039;&#039;: pour un composant&lt;br /&gt;
** &#039;&#039;&#039;board&#039;&#039;&#039;: pour une plateforme&lt;br /&gt;
** &#039;&#039;&#039;project&#039;&#039;&#039;: pour un projet&lt;br /&gt;
* Le corps d&#039;une balise est utilisé pour la description ou un commentaire relatif à l&#039;élément représenté par la balise. Afin de ne pas avoir de problème liés aux caractères ou séquences d&#039;échappement XML, ces textes seront placés dans une section &#039;&#039;&#039;CDATA&#039;&#039;&#039;. Ainsi il sera possible de saisir du code XML ou HTML pour faire de la mise en page par exemple.&lt;br /&gt;
&lt;br /&gt;
Voici un extrait de fichier XML pour un composant à titre d&#039;illustration&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;component name=&amp;quot;irq_mngr&amp;quot; version=&amp;quot;1.0&amp;quot; category=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;description&amp;gt;&lt;br /&gt;
    &amp;lt;![CDATA[&lt;br /&gt;
      The Interruption Manager is a Wishbone slave component and Armadeus compiliant.&lt;br /&gt;
    ]]&amp;gt;&lt;br /&gt;
  &amp;lt;/description&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/component&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== La bibliothèque de composants ==&lt;br /&gt;
&lt;br /&gt;
Un composant &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; se compose des éléments suivants:&lt;br /&gt;
* un ensemble de fichiers HDL (VHDL ou Verilog)&lt;br /&gt;
* un ensemble de fichiers C et H (optionnel)&lt;br /&gt;
* un fichier XML qui va décrire entièrement le composant&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant nous intéresser au contenu de ce fichier XML et en premier lieu avec les attributs dont dispose le noeud de base &#039;&#039;&#039;component&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039;: le nom du composant (IP), de préférence pas plus de 16 caractères.&lt;br /&gt;
* &#039;&#039;&#039;version&#039;&#039;&#039;: la version du composant&lt;br /&gt;
* &#039;&#039;&#039;category&#039;&#039;&#039;: la catégorie dans laquelle le composant se situe. Par exemple: base, communication, etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;component name=&amp;quot;irq_mngr&amp;quot; version=&amp;quot;1.0&amp;quot; category=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/component&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sous le noeud de base se trouve les éléments suivants:&lt;br /&gt;
* Le noeud &#039;&#039;&#039;description&#039;&#039;&#039; (optionnel) qui va contenir une description plus ou moins détaillée du composant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
  &amp;lt;![CDATA[&lt;br /&gt;
    The Interruption Manager is a Wishbone slave component and Armadeus compiliant.&lt;br /&gt;
  ]]&amp;gt;&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* le noeud &#039;&#039;&#039;hdl_files&#039;&#039;&#039; va contenir la liste des fichiers VHDL ou Verilog qui composent l&#039;IP. Chaque fichier est placé dans une base &#039;&#039;&#039;hdl_file&#039;&#039;&#039; et les attributs suivant sont proposés:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039;&#039;: C&#039;est le nom du fichier. Le chemin vers le fichier est donné en relatif par rapport à l&#039;emplacement du fichier XML de description du composant.&lt;br /&gt;
** &#039;&#039;&#039;scope&#039;&#039;&#039;: Cet attribut va permettre de donner la &#039;&#039;portée&#039;&#039; du fichier, c&#039;est-à-dire pour quel utilisation ce fichier est prévu. Voici quelques valeurs pour cet attribut:&lt;br /&gt;
*** &#039;&#039;&#039;all&#039;&#039;&#039;: le fichier doit toujours être inclus (valeur par défaut)&lt;br /&gt;
*** &#039;&#039;&#039;xilinx&#039;&#039;&#039;: le fichier n&#039;est exploitable que pour des composants/outils de chez Xilinx&lt;br /&gt;
*** &#039;&#039;&#039;altera&#039;&#039;&#039;: le fichier n&#039;est exploitable que pour des composants/outils de chez Altera&lt;br /&gt;
*** &#039;&#039;&#039;tb&#039;&#039;&#039;: le fichier n&#039;est pas synthétisable et ne fonctionne que dans le cadre de bancs de tests.&lt;br /&gt;
** &#039;&#039;&#039;istop&#039;&#039;&#039;: Cet attribut va permettre d&#039;identifier le fichier &#039;&#039;&#039;TOP&#039;&#039;&#039; de l&#039;IP. Il n&#039;y a que 2 valeurs possible 0 (valeur par défaut) ou 1 (pour indiquer le fichier TOP). Il faut définir au moins 1 fichier TOP. Si plusieurs fichiers TOP sont déclarés, par exemple si une IP est spécialisable en fonction du type de carte, toutes les entités des fichiers TOP doivent avoir la même signature.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hdl_files&amp;gt;&lt;br /&gt;
  &amp;lt;hdl_file name=&amp;quot;irq_mgnr.vhd&amp;quot; scope=&amp;quot;all&amp;quot; istop=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/hdl_files&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* le noeud &#039;&#039;&#039;generic_map&#039;&#039;&#039; est utilisé pour &amp;lt;u&amp;gt;contenir la déclaration des paramètres GENERIC disponibles sur l&#039;élément TOP de l&#039;IP &#039;&#039;&#039;si celui-ci est un fichier VHDL&#039;&#039;&#039;&amp;lt;/u&amp;gt;. Chaque entrée GENERIC de l&#039;IP va être représentée par une balise &#039;&#039;&#039;generic&#039;&#039;&#039; qui va entièrement décrire la paramètre à l&#039;aide des attributs suivants:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039;&#039;: C&#039;est le nom du paramètre GENERIC qui doit être identique au nom utilisé dans l&#039;IP&lt;br /&gt;
** &#039;&#039;&#039;type&#039;&#039;&#039;: C&#039;est le type de paramètre, dans un premier temps, uniquement les types suivants sont supportés:&lt;br /&gt;
*** &#039;&#039;&#039;integer&#039;&#039;&#039;: pour définir un nombre entier&lt;br /&gt;
*** &#039;&#039;&#039;std_logic&#039;&#039;&#039;: pour définir un signal&lt;br /&gt;
*** &#039;&#039;&#039;std_logic_vector&#039;&#039;&#039;: pour définir un vecteur&lt;br /&gt;
** &#039;&#039;&#039;valid&#039;&#039;&#039;: Cet attribut va permettre de définir la ou les valeurs ou plages de valeurs valide pour ce paramètre. Le format de ce champ n&#039;est pas encore totalement défini, soit sous forme d&#039;expression régulière soit sous la forme suivante:&lt;br /&gt;
*** &#039;&#039;&#039;1..16&#039;&#039;&#039; ==&amp;gt; de 1 (inclus) à 16 (inclus)&lt;br /&gt;
*** &#039;&#039;&#039;8|16|32&#039;&#039;&#039; ==&amp;gt;  8 &#039;&#039;&#039;ou&#039;&#039;&#039; 16 &#039;&#039;&#039;ou&#039;&#039;&#039; 32&lt;br /&gt;
*** &#039;&#039;&#039;1..16|32&#039;&#039;&#039; ==&amp;gt; de 1 à 16 &#039;&#039;&#039;ou&#039;&#039;&#039; 32&lt;br /&gt;
** &#039;&#039;&#039;value&#039;&#039;&#039;: Cet attribut va permettre de définir la valeur par défaut du paramètre&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;generic_map&amp;gt; &lt;br /&gt;
  &amp;lt;generic name=&amp;quot;irq_count&amp;quot; type=&amp;quot;integer&amp;quot; value=&amp;quot;16&amp;quot; valid=&amp;quot;1..16&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;![CDATA[&lt;br /&gt;
      irq_count gives the maximum allowed interruption sources.&lt;br /&gt;
    ]]&amp;gt;&lt;br /&gt;
  &amp;lt;/generic&amp;gt;&lt;br /&gt;
  &amp;lt;generic name=&amp;quot;irq_level&amp;quot; type=&amp;quot;std_logic&amp;quot; value=&amp;quot;1&amp;quot; valid=&amp;quot;0|1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;![CDATA[&lt;br /&gt;
      irq_level gives the irq output signal active level.&lt;br /&gt;
    ]]&amp;gt;&lt;br /&gt;
  &amp;lt;/generic&amp;gt;&lt;br /&gt;
&amp;lt;/generics&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Les plateformes ==&lt;br /&gt;
&lt;br /&gt;
== Les projets ==&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Orchestra&amp;diff=1880</id>
		<title>Orchestra</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Orchestra&amp;diff=1880"/>
		<updated>2007-01-16T16:58:36Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* La bibliothèque de composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vue d&#039;ensemble du système Orchestra ==&lt;br /&gt;
&lt;br /&gt;
Une image étant souvent plus explicite qu&#039;un long texte, voici, schématiquement, le principe de fonctionnement retenu pour Orchestra.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Image:orchestra.png|Description fonctionnelle du système]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut reconnaitre de ce schéma, que le système se repose sur:&lt;br /&gt;
* une bibliothèque de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&lt;br /&gt;
* une bibliothèque de plateformes&lt;br /&gt;
* un projet&lt;br /&gt;
* une liste de fichiers modèles&lt;br /&gt;
&lt;br /&gt;
A l&#039;aide des ces composants le &#039;&#039;&#039;&#039;&#039;processeur orchestra&#039;&#039;&#039;&#039;&#039; va générer:&lt;br /&gt;
* un projet Xilinx &#039;&#039;&#039;complet&#039;&#039;&#039;, c&#039;est-à-dire que l&#039;on pourra lancer les outils Xilinx en ligne de commande avec ce projet et générer ainsi les fichiers nécessaires pour le fonctionnement du FPGA. Ce projet pourra également servir de base et être compléter par l&#039;utilisateur pour y inclure d&#039;autres fonctionnalités n&#039;ayant aucun lien avec l&#039;i.MX.&lt;br /&gt;
* un projet &#039;&#039;Device Driver&#039;&#039;, cette sortie est &#039;&#039;&#039;optionnelle&#039;&#039;&#039; et dépendra fortement du type de composants utilisés lors de la construction du système. En effet, ces composants devront inclure une partie driver.&lt;br /&gt;
&lt;br /&gt;
== Format de base des fichiers XML ==&lt;br /&gt;
&lt;br /&gt;
Avant de donner plus de détails sur les fichiers XML traités et/ou générés par Orchestra, voici quelques règles de codage qui seront globalement appliquées :&lt;br /&gt;
* Tous les fichiers XML commencent avec une entête définissant le type de codage utilisé pour les caractères.&lt;br /&gt;
* Toutes les balises et tous les attributs des balises sont en minuscule.&lt;br /&gt;
* Un fichier XML décrit un seul élément, le noeud de base permettra d&#039;identifier le contenu du fichier :&lt;br /&gt;
** &#039;&#039;&#039;component&#039;&#039;&#039;: pour un composant&lt;br /&gt;
** &#039;&#039;&#039;board&#039;&#039;&#039;: pour une plateforme&lt;br /&gt;
** &#039;&#039;&#039;project&#039;&#039;&#039;: pour un projet&lt;br /&gt;
* Le corps d&#039;une balise est utilisé pour la description ou un commentaire relatif à l&#039;élément représenté par la balise. Afin de ne pas avoir de problème liés aux caractères ou séquences d&#039;échappement XML, ces textes seront placés dans une section &#039;&#039;&#039;CDATA&#039;&#039;&#039;. Ainsi il sera possible de saisir du code XML ou HTML pour faire de la mise en page par exemple.&lt;br /&gt;
&lt;br /&gt;
Voici un extrait de fichier XML pour un composant à titre d&#039;illustration&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;component name=&amp;quot;irq_mngr&amp;quot; version=&amp;quot;1.0&amp;quot; category=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;description&amp;gt;&lt;br /&gt;
    &amp;lt;![CDATA[&lt;br /&gt;
      The Interruption Manager is a Wishbone slave component and Armadeus compiliant.&lt;br /&gt;
    ]]&amp;gt;&lt;br /&gt;
  &amp;lt;/description&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/component&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== La bibliothèque de composants ==&lt;br /&gt;
&lt;br /&gt;
Un composant &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; se compose des éléments suivants:&lt;br /&gt;
* un ensemble de fichiers HDL (VHDL ou Verilog)&lt;br /&gt;
* un ensemble de fichiers C et H (optionnel)&lt;br /&gt;
* un fichier XML qui va décrire entièrement le composant&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant nous intéresser au contenu de ce fichier XML et en premier lieu avec les attributs dont dispose le noeud de base &#039;&#039;&#039;component&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039;: le nom du composant (IP), de préférence pas plus de 16 caractères.&lt;br /&gt;
* &#039;&#039;&#039;version&#039;&#039;&#039;: la version du composant&lt;br /&gt;
* &#039;&#039;&#039;category&#039;&#039;&#039;: la catégorie dans laquelle le composant se situe. Par exemple: base, communication, etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;component name=&amp;quot;irq_mngr&amp;quot; version=&amp;quot;1.0&amp;quot; category=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/component&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sous le noeud de base se trouve les éléments suivants:&lt;br /&gt;
* Le noeud &#039;&#039;&#039;description&#039;&#039;&#039; (optionnel) qui va contenir une description plus ou moins détaillée du composant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
  &amp;lt;![CDATA[&lt;br /&gt;
    The Interruption Manager is a Wishbone slave component and Armadeus compiliant.&lt;br /&gt;
  ]]&amp;gt;&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* le noeud &#039;&#039;&#039;hdl_files&#039;&#039;&#039; va contenir la liste des fichiers VHDL ou Verilog qui composent l&#039;IP. Chaque fichier est placé dans une base &#039;&#039;&#039;hdl_file&#039;&#039;&#039; et les attributs suivant sont proposés:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039;&#039;: C&#039;est le nom du fichier. Le chemin vers le fichier est donné en relatif par rapport à l&#039;emplacement du fichier XML de description du composant.&lt;br /&gt;
** &#039;&#039;&#039;scope&#039;&#039;&#039;: Cet attribut va permettre de donner la &#039;&#039;portée&#039;&#039; du fichier, c&#039;est-à-dire pour quel utilisation ce fichier est prévu. Voici quelques valeurs pour cet attribut:&lt;br /&gt;
*** &#039;&#039;&#039;all&#039;&#039;&#039;: le fichier doit toujours être inclus (valeur par défaut)&lt;br /&gt;
*** &#039;&#039;&#039;xilinx&#039;&#039;&#039;: le fichier n&#039;est exploitable que pour des composants/outils de chez Xilinx&lt;br /&gt;
*** &#039;&#039;&#039;altera&#039;&#039;&#039;: le fichier n&#039;est exploitable que pour des composants/outils de chez Altera&lt;br /&gt;
*** &#039;&#039;&#039;tb&#039;&#039;&#039;: le fichier n&#039;est pas synthétisable et ne fonctionne que dans le cadre de bancs de tests.&lt;br /&gt;
** &#039;&#039;&#039;istop&#039;&#039;&#039;: Cet attribut va permettre d&#039;identifier le fichier &#039;&#039;&#039;TOP&#039;&#039;&#039; de l&#039;IP. Il n&#039;y a que 2 valeurs possible 0 (valeur par défaut) ou 1 (pour indiquer le fichier TOP). Il faut définir au moins 1 fichier TOP. Si plusieurs fichiers TOP sont déclarés, par exemple si une IP est spécialisable en fonction du type de carte, toutes les entités des fichiers TOP doivent avoir la même signature.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hdl_files&amp;gt;&lt;br /&gt;
  &amp;lt;hdl_file name=&amp;quot;irq_mgnr.vhd&amp;quot; scope=&amp;quot;all&amp;quot; istop=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/hdl_files&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* le noeud &#039;&#039;&#039;generic_map&#039;&#039;&#039; est utilisé pour contenir la déclaration des paramètres GENERIC disponibles sur l&#039;élément TOP de l&#039;IP si celui-ci est un fichier VHDL. Chaque entrée GENERIC de l&#039;IP va être représentée par une balise &#039;&#039;&#039;generic&#039;&#039;&#039; qui va entièrement décrire la paramètre à l&#039;aide des attributs suivants:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039;&#039;: C&#039;est le nom du paramètre GENERIC qui doit être identique au nom utilisé dans l&#039;IP&lt;br /&gt;
** &#039;&#039;&#039;type&#039;&#039;&#039;: C&#039;est le type de paramètre, dans un premier temps, uniquement les types suivants sont supportés:&lt;br /&gt;
*** &#039;&#039;&#039;integer&#039;&#039;&#039;: pour définir un nombre entier&lt;br /&gt;
*** &#039;&#039;&#039;std_logic&#039;&#039;&#039;: pour définir un signal&lt;br /&gt;
*** &#039;&#039;&#039;std_logic_vector&#039;&#039;&#039;: pour définir un vecteur&lt;br /&gt;
** &#039;&#039;&#039;valid&#039;&#039;&#039;: Cet attribut va permettre de définir la ou les valeurs ou plages de valeurs valide pour ce paramètre. Le format de ce champ n&#039;est pas encore totalement défini, soit sous forme d&#039;expression régulière soit sous la forme suivante:&lt;br /&gt;
*** &#039;&#039;&#039;1..16&#039;&#039;&#039; ==&amp;gt; de 1 (inclus) à 16 (inclus)&lt;br /&gt;
*** &#039;&#039;&#039;8|16|32&#039;&#039;&#039; ==&amp;gt;  8 &#039;&#039;&#039;ou&#039;&#039;&#039; 16 &#039;&#039;&#039;ou&#039;&#039;&#039; 32&lt;br /&gt;
*** &#039;&#039;&#039;1..16|32&#039;&#039;&#039; ==&amp;gt; de 1 à 16 &#039;&#039;&#039;ou&#039;&#039;&#039; 32&lt;br /&gt;
** &#039;&#039;&#039;value&#039;&#039;&#039;: Cet attribut va permettre de définir la valeur par défaut du paramètre&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;generic_map&amp;gt; &lt;br /&gt;
  &amp;lt;generic name=&amp;quot;irq_count&amp;quot; type=&amp;quot;integer&amp;quot; value=&amp;quot;16&amp;quot; valid=&amp;quot;1..16&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;![CDATA[&lt;br /&gt;
      irq_count gives the maximum allowed interruption sources.&lt;br /&gt;
    ]]&amp;gt;&lt;br /&gt;
  &amp;lt;/generic&amp;gt;&lt;br /&gt;
  &amp;lt;generic name=&amp;quot;irq_level&amp;quot; type=&amp;quot;std_logic&amp;quot; value=&amp;quot;1&amp;quot; valid=&amp;quot;0|1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;![CDATA[&lt;br /&gt;
      irq_level gives the irq output signal active level.&lt;br /&gt;
    ]]&amp;gt;&lt;br /&gt;
  &amp;lt;/generic&amp;gt;&lt;br /&gt;
&amp;lt;/generics&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Orchestra&amp;diff=1879</id>
		<title>Orchestra</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Orchestra&amp;diff=1879"/>
		<updated>2007-01-16T16:57:36Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vue d&#039;ensemble du système Orchestra ==&lt;br /&gt;
&lt;br /&gt;
Une image étant souvent plus explicite qu&#039;un long texte, voici, schématiquement, le principe de fonctionnement retenu pour Orchestra.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Image:orchestra.png|Description fonctionnelle du système]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut reconnaitre de ce schéma, que le système se repose sur:&lt;br /&gt;
* une bibliothèque de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&lt;br /&gt;
* une bibliothèque de plateformes&lt;br /&gt;
* un projet&lt;br /&gt;
* une liste de fichiers modèles&lt;br /&gt;
&lt;br /&gt;
A l&#039;aide des ces composants le &#039;&#039;&#039;&#039;&#039;processeur orchestra&#039;&#039;&#039;&#039;&#039; va générer:&lt;br /&gt;
* un projet Xilinx &#039;&#039;&#039;complet&#039;&#039;&#039;, c&#039;est-à-dire que l&#039;on pourra lancer les outils Xilinx en ligne de commande avec ce projet et générer ainsi les fichiers nécessaires pour le fonctionnement du FPGA. Ce projet pourra également servir de base et être compléter par l&#039;utilisateur pour y inclure d&#039;autres fonctionnalités n&#039;ayant aucun lien avec l&#039;i.MX.&lt;br /&gt;
* un projet &#039;&#039;Device Driver&#039;&#039;, cette sortie est &#039;&#039;&#039;optionnelle&#039;&#039;&#039; et dépendra fortement du type de composants utilisés lors de la construction du système. En effet, ces composants devront inclure une partie driver.&lt;br /&gt;
&lt;br /&gt;
== Format de base des fichiers XML ==&lt;br /&gt;
&lt;br /&gt;
Avant de donner plus de détails sur les fichiers XML traités et/ou générés par Orchestra, voici quelques règles de codage qui seront globalement appliquées :&lt;br /&gt;
* Tous les fichiers XML commencent avec une entête définissant le type de codage utilisé pour les caractères.&lt;br /&gt;
* Toutes les balises et tous les attributs des balises sont en minuscule.&lt;br /&gt;
* Un fichier XML décrit un seul élément, le noeud de base permettra d&#039;identifier le contenu du fichier :&lt;br /&gt;
** &#039;&#039;&#039;component&#039;&#039;&#039;: pour un composant&lt;br /&gt;
** &#039;&#039;&#039;board&#039;&#039;&#039;: pour une plateforme&lt;br /&gt;
** &#039;&#039;&#039;project&#039;&#039;&#039;: pour un projet&lt;br /&gt;
* Le corps d&#039;une balise est utilisé pour la description ou un commentaire relatif à l&#039;élément représenté par la balise. Afin de ne pas avoir de problème liés aux caractères ou séquences d&#039;échappement XML, ces textes seront placés dans une section &#039;&#039;&#039;CDATA&#039;&#039;&#039;. Ainsi il sera possible de saisir du code XML ou HTML pour faire de la mise en page par exemple.&lt;br /&gt;
&lt;br /&gt;
Voici un extrait de fichier XML pour un composant à titre d&#039;illustration&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;component name=&amp;quot;irq_mngr&amp;quot; version=&amp;quot;1.0&amp;quot; category=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;description&amp;gt;&lt;br /&gt;
    &amp;lt;![CDATA[&lt;br /&gt;
      The Interruption Manager is a Wishbone slave component and Armadeus compiliant.&lt;br /&gt;
    ]]&amp;gt;&lt;br /&gt;
  &amp;lt;/description&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/component&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== La bibliothèque de composants ==&lt;br /&gt;
&lt;br /&gt;
Un composant &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; se compose des éléments suivants:&lt;br /&gt;
* un ensemble de fichiers HDL (VHDL ou Verilog)&lt;br /&gt;
* un ensemble de fichiers C et H (optionnel)&lt;br /&gt;
* un fichier XML qui va décrire entièrement le composant&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant nous intéresser au contenu de ce fichier XML et en premier lieu avec les attributs dont dispose le noeud de base &#039;&#039;&#039;component&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039;: le nom du composant (IP), de préférence pas plus de 16 caractères.&lt;br /&gt;
* &#039;&#039;&#039;version&#039;&#039;&#039;: la version du composant&lt;br /&gt;
* &#039;&#039;&#039;category&#039;&#039;&#039;: la catégorie dans laquelle le composant se situe. Par exemple: base, communication, etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;component name=&amp;quot;irq_mngr&amp;quot; version=&amp;quot;1.0&amp;quot; category=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/component&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sous le noeud de base se trouve les éléments suivants:&lt;br /&gt;
* Le noeud &#039;&#039;&#039;description&#039;&#039;&#039; (optionnel) qui va contenir une description plus ou moins détaillée du composant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
  &amp;lt;![CDATA[&lt;br /&gt;
    The Interruption Manager is a Wishbone slave component and Armadeus compiliant.&lt;br /&gt;
  ]]&amp;gt;&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* le noeud &#039;&#039;&#039;hdl_files&#039;&#039;&#039; va contenir la liste des fichiers VHDL ou Verilog qui composent l&#039;IP. Chaque fichier est placé dans une base &#039;&#039;&#039;hdl_file&#039;&#039;&#039; et les attributs suivant sont proposés:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039;&#039;: C&#039;est le nom du fichier. Le chemin vers le fichier est donné en relatif par rapport à l&#039;emplacement du fichier XML de description du composant.&lt;br /&gt;
** &#039;&#039;&#039;scope&#039;&#039;&#039;: Cet attribut va permettre de donner la &#039;&#039;portée&#039;&#039; du fichier, c&#039;est-à-dire pour quel utilisation ce fichier est prévu. Voici quelques valeurs pour cet attribut:&lt;br /&gt;
*** &#039;&#039;&#039;all&#039;&#039;&#039;: le fichier doit toujours être inclus (valeur par défaut)&lt;br /&gt;
*** &#039;&#039;&#039;xilinx&#039;&#039;&#039;: le fichier n&#039;est exploitable que pour des composants/outils de chez Xilinx&lt;br /&gt;
*** &#039;&#039;&#039;altera&#039;&#039;&#039;: le fichier n&#039;est exploitable que pour des composants/outils de chez Altera&lt;br /&gt;
*** &#039;&#039;&#039;tb&#039;&#039;&#039;: le fichier n&#039;est pas synthétisable et ne fonctionne que dans le cadre de bancs de tests.&lt;br /&gt;
** &#039;&#039;&#039;istop&#039;&#039;&#039;: Cet attribut va permettre d&#039;identifier le fichier &#039;&#039;&#039;TOP&#039;&#039;&#039; de l&#039;IP. Il n&#039;y a que 2 valeurs possible 0 (valeur par défaut) ou 1 (pour indiquer le fichier TOP). Il faut définir au moins 1 fichier TOP. Si plusieurs fichiers TOP sont déclarés, par exemple si une IP est spécialisable en fonction du type de carte, toutes les entités des fichiers TOP doivent avoir la même signature.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hdl_files&amp;gt;&lt;br /&gt;
  &amp;lt;hdl_file name=&amp;quot;irq_mgnr.vhd&amp;quot; scope=&amp;quot;all&amp;quot; istop=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/hdl_files&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* le noeud &#039;&#039;&#039;generic_map&#039;&#039;&#039; est utilisé pour contenir la déclaration des paramètres GENERIC disponibles sur l&#039;élément TOP de l&#039;IP si celui-ci est un fichier VHDL. Chaque entrée GENERIC de l&#039;IP va être représentée par une balise &#039;&#039;&#039;generic&#039;&#039;&#039; qui va entièrement décrire la paramètre à l&#039;aide des attributs suivants:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039;&#039;: C&#039;est le nom du paramètre GENERIC qui doit être identique au nom utilisé dans l&#039;IP&lt;br /&gt;
** &#039;&#039;&#039;type&#039;&#039;&#039;: C&#039;est le type de paramètre, dans un premier temps, uniquement les types suivants sont supportés:&lt;br /&gt;
*** &#039;&#039;&#039;integer&#039;&#039;&#039;: pour définir un nombre entier&lt;br /&gt;
*** &#039;&#039;&#039;std_logic&#039;&#039;&#039;: pour définir un signal&lt;br /&gt;
*** &#039;&#039;&#039;std_logic_vector&#039;&#039;&#039;: pour définir un vecteur&lt;br /&gt;
** &#039;&#039;&#039;valid&#039;&#039;&#039;: Cet attribut va permettre de définir la ou les valeurs ou plages de valeurs valide pour ce paramètre. Le format de ce champ n&#039;est pas encore totalement défini, soit sous forme d&#039;expression régulière soit sous la forme suivante:&lt;br /&gt;
*** &#039;&#039;&#039;1..16&#039;&#039;&#039; ==&amp;gt; de 1 (inclus) à 16 (inclus)&lt;br /&gt;
*** &#039;&#039;&#039;8|16|32&#039;&#039;&#039; ==&amp;gt;  8 &#039;&#039;&#039;ou&#039;&#039;&#039; 16 &#039;&#039;&#039;ou&#039;&#039;&#039; 32&lt;br /&gt;
*** &#039;&#039;&#039;1..16|32&#039;&#039;&#039; ==&amp;gt; de 1 à 16 &#039;&#039;&#039;ou&#039;&#039;&#039; 32&lt;br /&gt;
** &#039;&#039;&#039;value&#039;&#039;&#039;: Cet attribut va permettre de définir la valeur par défaut du paramètre&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;generics&amp;gt; &lt;br /&gt;
  &amp;lt;generic name=&amp;quot;irq_count&amp;quot; type=&amp;quot;integer&amp;quot; value=&amp;quot;16&amp;quot; valid=&amp;quot;1..16&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;![CDATA[&lt;br /&gt;
      irq_count gives the maximum allowed interruption sources.&lt;br /&gt;
    ]]&amp;gt;&lt;br /&gt;
  &amp;lt;/generic&amp;gt;&lt;br /&gt;
  &amp;lt;generic name=&amp;quot;irq_level&amp;quot; type=&amp;quot;std_logic&amp;quot; value=&amp;quot;1&amp;quot; valid=&amp;quot;0|1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;![CDATA[&lt;br /&gt;
      irq_level gives the irq output signal active level.&lt;br /&gt;
    ]]&amp;gt;&lt;br /&gt;
  &amp;lt;/generic&amp;gt;&lt;br /&gt;
&amp;lt;/generics&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Orchestra&amp;diff=1878</id>
		<title>Orchestra</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Orchestra&amp;diff=1878"/>
		<updated>2007-01-16T16:28:47Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* La bibliothèque de composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vue d&#039;ensemble du système Orchestra ==&lt;br /&gt;
&lt;br /&gt;
Une image étant souvent plus explicite qu&#039;un long texte, voici, schématiquement, le principe de fonctionnement retenu pour Orchestra.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Image:orchestra.png|Description fonctionnelle du système]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut reconnaitre de ce schéma, que le système se repose sur:&lt;br /&gt;
* une bibliothèque de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&lt;br /&gt;
* une bibliothèque de plateformes&lt;br /&gt;
* un projet&lt;br /&gt;
* une liste de fichiers modèles&lt;br /&gt;
&lt;br /&gt;
A l&#039;aide des ces composants le &#039;&#039;&#039;&#039;&#039;processeur orchestra&#039;&#039;&#039;&#039;&#039; va générer:&lt;br /&gt;
* un projet Xilinx &#039;&#039;&#039;complet&#039;&#039;&#039;, c&#039;est-à-dire que l&#039;on pourra lancer les outils Xilinx en ligne de commande avec ce projet et générer ainsi les fichiers nécessaires pour le fonctionnement du FPGA. Ce projet pourra également servir de base et être compléter par l&#039;utilisateur pour y inclure d&#039;autres fonctionnalités n&#039;ayant aucun lien avec l&#039;i.MX.&lt;br /&gt;
* un projet &#039;&#039;Device Driver&#039;&#039;, cette sortie est &#039;&#039;&#039;optionnelle&#039;&#039;&#039; et dépendra fortement du type de composants utilisés lors de la construction du système. En effet, ces composants devront inclure une partie driver.&lt;br /&gt;
&lt;br /&gt;
== La bibliothèque de composants ==&lt;br /&gt;
&lt;br /&gt;
Un composant &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; se compose des éléments suivants:&lt;br /&gt;
* un ensemble de fichiers HDL (VHDL ou Verilog)&lt;br /&gt;
* un ensemble de fichiers C et H (optionnel)&lt;br /&gt;
* un fichier XML qui va décrire entièrement le composant&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant nous intéresser au contenu de ce fichier XML qui se compose de différents éléments:&lt;br /&gt;
* l&#039;entête du fichier XML&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* le noeud de base est &#039;&#039;&#039;component&#039;&#039;&#039;, il dispose des attributs suivants:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039;&#039;: le nom du composant (IP), de préférence pas plus de 16 caractères.&lt;br /&gt;
** &#039;&#039;&#039;version&#039;&#039;&#039;: la version du composant&lt;br /&gt;
** &#039;&#039;&#039;category&#039;&#039;&#039;: la catégorie dans laquelle le composant se situe. Par exemple: base, communication, etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;component name=&amp;quot;irq_mngr&amp;quot; version=&amp;quot;1.0&amp;quot; category=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/component&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sous le noeud de base se trouve les éléments suivants:&lt;br /&gt;
* Le noeud &#039;&#039;&#039;description&#039;&#039;&#039; (optionnel) qui va contenir une description plus ou moins détaillée du composant. Pour ne pas limiter la saisie, les données seront placée dans une balise &#039;&#039;&#039;&amp;lt;![CDATA[&#039;&#039;&#039;, ainsi on pourra, par exemple, saisir des balises XML/HTML pour la mise en forme éventuelle du contenu.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
  &amp;lt;![CDATA[&lt;br /&gt;
    The Interruption Manager is a Wishbone slave component and Armadeus compiliant.&lt;br /&gt;
  ]]&amp;gt;&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* le noeud &#039;&#039;&#039;hdl_files&#039;&#039;&#039; va contenir la liste des fichiers VHDL ou Verilog qui composent l&#039;IP. Chaque fichier est placé dans une base &#039;&#039;&#039;hdl_file&#039;&#039;&#039; et les attributs sont proposés:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039;&#039;: C&#039;est le nom du fichier&lt;br /&gt;
** &#039;&#039;&#039;scope&#039;&#039;&#039;: Cet attribut va permettre de donner la &#039;&#039;portée&#039;&#039; du fichier, c&#039;est-à-dire pour quel utilisation ce fichier est prévu. Voici quelques valeurs pour cet attribut:&lt;br /&gt;
*** &#039;&#039;&#039;all&#039;&#039;&#039;: le fichier doit toujours être inclus (valeur par défaut)&lt;br /&gt;
*** &#039;&#039;&#039;xilinx&#039;&#039;&#039;: le fichier n&#039;est exploitable que pour des composants/outils de chez Xilinx&lt;br /&gt;
*** &#039;&#039;&#039;Altera&#039;&#039;&#039;: le fichier n&#039;est exploitable que pour des composants/outils de chez Altera&lt;br /&gt;
*** &#039;&#039;&#039;tb&#039;&#039;&#039;: le fichier n&#039;est pas synthétisable et ne fonctionne que dans le cadre de bancs de tests.&lt;br /&gt;
** &#039;&#039;&#039;istop&#039;&#039;&#039;: Cet attribut va permettre d&#039;identifier le fichier &#039;&#039;&#039;TOP&#039;&#039;&#039; de l&#039;IP. Il n&#039;y a que 2 valeurs possible 0 (valeur par défaut) ou 1 (pour indiquer le fichier TOP).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hdl_files&amp;gt;&lt;br /&gt;
  &amp;lt;hdl_file name=&amp;quot;irq_mgnr.vhd&amp;quot; scope=&amp;quot;all&amp;quot; istop=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/hdl_files&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* le noeud &#039;&#039;&#039;generic_map&#039;&#039;&#039; est utilisé pour contenir la déclaration des paramètres GENERIC disponible sur l&#039;élément TOP de l&#039;IP si celui-ci est un fichier VHDL. Chaque entrée GENERIC de l&#039;IP va être représentée par une balise &#039;&#039;&#039;generic&#039;&#039;&#039; qui va entièrement décrire la paramètre à l&#039;aide des attributs suivants:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039;&#039;: C&#039;est le nom du paramètre GENERIC qui doit être identique au nom utilisé dans l&#039;IP&lt;br /&gt;
** &#039;&#039;&#039;type&#039;&#039;&#039;: C&#039;est le type de paramètre, dans un premier temps, uniquement les types suivants sont supportés:&lt;br /&gt;
*** &#039;&#039;&#039;integer&#039;&#039;&#039;: pour définir un nombre entier&lt;br /&gt;
*** &#039;&#039;&#039;std_logic&#039;&#039;&#039;: pour définir un signal&lt;br /&gt;
*** &#039;&#039;&#039;std_logic_vector&#039;&#039;&#039;: pour définir un vecteur&lt;br /&gt;
** &#039;&#039;&#039;valid&#039;&#039;&#039;: Cet attribut va permettre de définir la ou les valeurs ou plages de valeurs valide pour ce paramètre. Le format de ce champ n&#039;est pas encore totalement défini, soit sous forme d&#039;expression régulière soit sous la forme suivante:&lt;br /&gt;
*** &#039;&#039;&#039;1..16&#039;&#039;&#039; ==&amp;gt; de 1 (inclus) à 16 (inclus)&lt;br /&gt;
*** &#039;&#039;&#039;8|16|32&#039;&#039;&#039; ==&amp;gt;  8 &#039;&#039;&#039;ou&#039;&#039;&#039; 16 &#039;&#039;&#039;ou&#039;&#039;&#039; 32&lt;br /&gt;
*** &#039;&#039;&#039;1..16|32&#039;&#039;&#039; ==&amp;gt; de 1 à 16 &#039;&#039;&#039;ou&#039;&#039;&#039; 32&lt;br /&gt;
** &#039;&#039;&#039;value&#039;&#039;&#039;: Cet attribut va permettre de définir la valeur par défaut du paramètre&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;generics&amp;gt; &lt;br /&gt;
  &amp;lt;generic name=&amp;quot;irq_count&amp;quot; type=&amp;quot;integer&amp;quot; value=&amp;quot;16&amp;quot; valid=&amp;quot;1..16&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;![CDATA[&lt;br /&gt;
      irq_count gives the maximum allowed interruption sources.&lt;br /&gt;
    ]]&amp;gt;&lt;br /&gt;
  &amp;lt;/generic&amp;gt;&lt;br /&gt;
  &amp;lt;generic name=&amp;quot;irq_level&amp;quot; type=&amp;quot;std_logic&amp;quot; value=&amp;quot;1&amp;quot; valid=&amp;quot;0|1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;![CDATA[&lt;br /&gt;
      irq_level gives the irq output signal active level.&lt;br /&gt;
    ]]&amp;gt;&lt;br /&gt;
  &amp;lt;/generic&amp;gt;&lt;br /&gt;
&amp;lt;/generics&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Orchestra&amp;diff=1871</id>
		<title>Orchestra</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Orchestra&amp;diff=1871"/>
		<updated>2007-01-14T21:32:04Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* La bibliothèque de composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vue d&#039;ensemble du système Orchestra ==&lt;br /&gt;
&lt;br /&gt;
Une image étant souvent plus explicite qu&#039;un long texte, voici, schématiquement, le principe de fonctionnement retenu pour Orchestra.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Image:orchestra.png|Description fonctionnelle du système]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut reconnaitre de ce schéma, que le système se repose sur:&lt;br /&gt;
* une bibliothèque de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&lt;br /&gt;
* une bibliothèque de plateformes&lt;br /&gt;
* un projet&lt;br /&gt;
* une liste de fichiers modèles&lt;br /&gt;
&lt;br /&gt;
A l&#039;aide des ces composants le &#039;&#039;&#039;&#039;&#039;processeur orchestra&#039;&#039;&#039;&#039;&#039; va générer:&lt;br /&gt;
* un projet Xilinx &#039;&#039;&#039;complet&#039;&#039;&#039;, c&#039;est-à-dire que l&#039;on pourra lancer les outils Xilinx en ligne de commande avec ce projet et générer ainsi les fichiers nécessaires pour le fonctionnement du FPGA. Ce projet pourra également servir de base et être compléter par l&#039;utilisateur pour y inclure d&#039;autres fonctionnalités n&#039;ayant aucun lien avec l&#039;i.MX.&lt;br /&gt;
* un projet &#039;&#039;Device Driver&#039;&#039;, cette sortie est &#039;&#039;&#039;optionnelle&#039;&#039;&#039; et dépendra fortement du type de composants utilisés lors de la construction du système. En effet, ces composants devront inclure une partie driver.&lt;br /&gt;
&lt;br /&gt;
== La bibliothèque de composants ==&lt;br /&gt;
&lt;br /&gt;
Un composant &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; se compose des éléments suivants:&lt;br /&gt;
* un ensemble de fichiers HDL (VHDL ou Verilog)&lt;br /&gt;
* un ensemble de fichiers C et H (optionnel)&lt;br /&gt;
* un fichier XML qui va décrire entièrement le composant&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant nous intéresser au contenu de ce fichier XML qui se compose de différents éléments:&lt;br /&gt;
* l&#039;entête du fichier XML&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* le noeud de base est &#039;&#039;&#039;component&#039;&#039;&#039;, il dispose des attributs suivants:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039;&#039;: le nom du composant (IP), de préférence pas plus de 16 caractères.&lt;br /&gt;
** &#039;&#039;&#039;version&#039;&#039;&#039;: la version du composant&lt;br /&gt;
** &#039;&#039;&#039;category&#039;&#039;&#039;: la catégorie dans laquelle le composant se situe. Par exemple: base, communication, etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;component name=&amp;quot;irq_mngr&amp;quot; version=&amp;quot;1.0&amp;quot; category=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/component&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sous le noeud de base se trouve les éléments suivants:&lt;br /&gt;
* Le noeud &#039;&#039;&#039;description&#039;&#039;&#039; (optionnel) qui va contenir une description plus ou moins détaillée du composant. Pour ne pas limiter la saisie, les données seront placée dans une balise &#039;&#039;&#039;&amp;lt;![CDATA[&#039;&#039;&#039;, ainsi on pourra, par exemple, saisir des balises XML/HTML pour la mise en forme éventuelle du contenu.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;description&amp;gt;&lt;br /&gt;
  &amp;lt;![CDATA[&lt;br /&gt;
    The Interruption Manager is a Wishbone slave component and Armadeus compiliant.&lt;br /&gt;
  ]]&amp;gt;&lt;br /&gt;
&amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* le noeud &#039;&#039;&#039;hdl_files&#039;&#039;&#039; va contenir la liste des fichiers VHDL ou Verilog qui composent l&#039;IP. Chaque fichier est placé dans une base &#039;&#039;&#039;hdl_file&#039;&#039;&#039; et les attributs sont proposés:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039;&#039;: C&#039;est le nom du fichier&lt;br /&gt;
** &#039;&#039;&#039;scope&#039;&#039;&#039;: Cet attribut va permettre de donner la &#039;&#039;portée&#039;&#039; du fichier, c&#039;est-à-dire pour quel utilisation ce fichier est prévu. Voici quelques valeurs pour cet attribut:&lt;br /&gt;
*** &#039;&#039;&#039;all&#039;&#039;&#039;: le fichier doit toujours être inclus (valeur par défaut)&lt;br /&gt;
*** &#039;&#039;&#039;xilinx&#039;&#039;&#039;: le fichier n&#039;est exploitable que pour des composants/outils de chez Xilinx&lt;br /&gt;
*** &#039;&#039;&#039;Altera&#039;&#039;&#039;: le fichier n&#039;est exploitable que pour des composants/outils de chez Altera&lt;br /&gt;
*** &#039;&#039;&#039;tb&#039;&#039;&#039;: le fichier n&#039;est pas synthétisable et ne fonctionne que dans le cadre de bancs de tests.&lt;br /&gt;
** &#039;&#039;&#039;istop&#039;&#039;&#039;: Cet attribut va permettre d&#039;identifier le fichier &#039;&#039;&#039;TOP&#039;&#039;&#039; de l&#039;IP. Il n&#039;y a que 2 valeurs possible 0 (valeur par défaut) ou 1 (pour indiquer le fichier TOP).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hdl_files&amp;gt;&lt;br /&gt;
  &amp;lt;hdl_file name=&amp;quot;irq_mgnr.vhd&amp;quot; scope=&amp;quot;all&amp;quot; istop=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/hdl_files&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* le noeud &#039;&#039;&#039;generic_map&#039;&#039;&#039; est utilisé pour contenir la déclaration des paramètres GENERIC disponible sur l&#039;élément TOP de l&#039;IP si celui-ci est un fichier VHDL.&amp;lt;br /&amp;gt;&lt;br /&gt;
Chaque entrée GENERIC de l&#039;IP va être représentée par une balise &#039;&#039;&#039;generic&#039;&#039;&#039; qui va entièrement décrire la paramètre à l&#039;aide des attributs suivants:&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039;&#039;: C&#039;est le nom du paramètre GENERIC qui doit être identique au nom utilisé dans l&#039;IP&lt;br /&gt;
** &#039;&#039;&#039;type&#039;&#039;&#039;: C&#039;est le type de paramètre, dans un premier temps, uniquement les types suivants sont supportés:&lt;br /&gt;
*** &#039;&#039;&#039;integer&#039;&#039;&#039;: pour définir un nombre entier&lt;br /&gt;
*** &#039;&#039;&#039;std_logic&#039;&#039;&#039;: pour définir un signal&lt;br /&gt;
*** &#039;&#039;&#039;std_logic_vector&#039;&#039;&#039;: pour définir un vecteur&lt;br /&gt;
** &#039;&#039;&#039;valid&#039;&#039;&#039;: Cet attribut va permettre de définir la ou les valeurs ou plages de valeurs valide pour ce paramètre. Le format de ce champ n&#039;est pas encore totalement défini, soit sous forme d&#039;expression régulière soit sous la forme suivante:&lt;br /&gt;
*** &#039;&#039;&#039;1..16&#039;&#039;&#039; ==&amp;gt; de 1 (inclus) à 16 (inclus)&lt;br /&gt;
*** &#039;&#039;&#039;8|16|32&#039;&#039;&#039; ==&amp;gt;  8 &#039;&#039;&#039;ou&#039;&#039;&#039; 16 &#039;&#039;&#039;ou&#039;&#039;&#039; 32&lt;br /&gt;
*** &#039;&#039;&#039;1..16|32&#039;&#039;&#039; ==&amp;gt; de 1 à 16 &#039;&#039;&#039;ou&#039;&#039;&#039; 32&lt;br /&gt;
** &#039;&#039;&#039;value&#039;&#039;&#039;: Cet attribut va permettre de définir la valeur par défaut du paramètre&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;generics&amp;gt; &lt;br /&gt;
  &amp;lt;generic name=&amp;quot;irq_count&amp;quot; type=&amp;quot;integer&amp;quot; value=&amp;quot;16&amp;quot; valid=&amp;quot;1..16&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;![CDATA[&lt;br /&gt;
      irq_count gives the maximum allowed interruption sources.&lt;br /&gt;
    ]]&amp;gt;&lt;br /&gt;
  &amp;lt;/generic&amp;gt;&lt;br /&gt;
  &amp;lt;generic name=&amp;quot;irq_level&amp;quot; type=&amp;quot;std_logic&amp;quot; value=&amp;quot;1&amp;quot; valid=&amp;quot;0|1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;![CDATA[&lt;br /&gt;
      irq_level gives the irq output signal active level.&lt;br /&gt;
    ]]&amp;gt;&lt;br /&gt;
  &amp;lt;/generic&amp;gt;&lt;br /&gt;
&amp;lt;/generics&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Orchestra&amp;diff=1870</id>
		<title>Orchestra</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Orchestra&amp;diff=1870"/>
		<updated>2007-01-14T20:51:01Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Vue d&amp;#039;ensemble du système Orchestra */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vue d&#039;ensemble du système Orchestra ==&lt;br /&gt;
&lt;br /&gt;
Une image étant souvent plus explicite qu&#039;un long texte, voici, schématiquement, le principe de fonctionnement retenu pour Orchestra.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Image:orchestra.png|Description fonctionnelle du système]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut reconnaitre de ce schéma, que le système se repose sur:&lt;br /&gt;
* une bibliothèque de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&lt;br /&gt;
* une bibliothèque de plateformes&lt;br /&gt;
* un projet&lt;br /&gt;
* une liste de fichiers modèles&lt;br /&gt;
&lt;br /&gt;
A l&#039;aide des ces composants le &#039;&#039;&#039;&#039;&#039;processeur orchestra&#039;&#039;&#039;&#039;&#039; va générer:&lt;br /&gt;
* un projet Xilinx &#039;&#039;&#039;complet&#039;&#039;&#039;, c&#039;est-à-dire que l&#039;on pourra lancer les outils Xilinx en ligne de commande avec ce projet et générer ainsi les fichiers nécessaires pour le fonctionnement du FPGA. Ce projet pourra également servir de base et être compléter par l&#039;utilisateur pour y inclure d&#039;autres fonctionnalités n&#039;ayant aucun lien avec l&#039;i.MX.&lt;br /&gt;
* un projet &#039;&#039;Device Driver&#039;&#039;, cette sortie est &#039;&#039;&#039;optionnelle&#039;&#039;&#039; et dépendra fortement du type de composants utilisés lors de la construction du système. En effet, ces composants devront inclure une partie driver.&lt;br /&gt;
&lt;br /&gt;
== La bibliothèque de composants ==&lt;br /&gt;
&lt;br /&gt;
Un composant &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; se compose des éléments suivants:&lt;br /&gt;
* un ensemble de fichiers HDL (VHDL ou Verilog)&lt;br /&gt;
* un ensemble de fichiers C et H (optionnel)&lt;br /&gt;
* un fichier XML qui va décrire entièrement le composant&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant nous intéresser au contenu de ce fichier XML:&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=Orchestra&amp;diff=1869</id>
		<title>Orchestra</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=Orchestra&amp;diff=1869"/>
		<updated>2007-01-12T15:19:16Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vue d&#039;ensemble du système Orchestra ==&lt;br /&gt;
&lt;br /&gt;
Une image étant souvent plus explicite qu&#039;un long texte, voici, schématiquement, le principe de fonctionnement retenu pour Orchestra.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Image:orchestra.png|Description fonctionnelle du système]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut reconnaitre de ce schéma, que le système se repose sur:&lt;br /&gt;
* une bibliothèque de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&lt;br /&gt;
* une bibliothèque de plateformes&lt;br /&gt;
* un projet&lt;br /&gt;
* une liste de fichiers modèles&lt;br /&gt;
&lt;br /&gt;
A l&#039;aide des ces composant le &#039;&#039;&#039;&#039;&#039;processeur orchestra&#039;&#039;&#039;&#039;&#039; va générer:&lt;br /&gt;
* un projet Xilinx &#039;&#039;&#039;complet&#039;&#039;&#039;, c&#039;est-à-dire que l&#039;on pourra lancer les outils Xilinx en ligne de commande avec ce projet et générer ainsi les fichiers nécessaires pour le fonctionnement du FPGA. Ce projet pourra également servir de base et être compléter par l&#039;utilisateur pour y inclure d&#039;autres fonctionnalités n&#039;ayant aucun lien avec l&#039;i.MX.&lt;br /&gt;
* un projet &#039;&#039;Device Driver&#039;&#039;, cette sortie est &#039;&#039;&#039;optionnelle&#039;&#039;&#039; et dépendra fortement du type de composants utilisés lors de la construction du système. En effet, ces composants devront inclure une partie driver.&lt;br /&gt;
&lt;br /&gt;
== La bibliothèque de composants ==&lt;br /&gt;
&lt;br /&gt;
Un composant &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; se compose des éléments suivants:&lt;br /&gt;
* un ensemble de fichiers HDL (VHDL ou Verilog)&lt;br /&gt;
* un ensemble de fichiers C et H (optionnel)&lt;br /&gt;
* un fichier XML qui va décrire entièrement le composant&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant nous intéresser au contenu de ce fichier XML:&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=File:Orchestra.png&amp;diff=1868</id>
		<title>File:Orchestra.png</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=File:Orchestra.png&amp;diff=1868"/>
		<updated>2007-01-12T14:52:06Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: Description du système orchestra&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Description du système orchestra&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=User_talk:FabriceM&amp;diff=1867</id>
		<title>User talk:FabriceM</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=User_talk:FabriceM&amp;diff=1867"/>
		<updated>2007-01-12T13:44:42Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Points abordés avec ce projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mon ambition sur ce projet est essentiellement basée sur le FPGA.&lt;br /&gt;
&lt;br /&gt;
== Points abordés avec ce projet ==&lt;br /&gt;
* Analyse du bus Wishbone (en cours... 140 pages pas faciles à absorber :( !)&lt;br /&gt;
* Analyse du soft Wishbone Builder (écrit en Perl, pas trop mal fait mais pas assez modulaire à mon goût)&lt;br /&gt;
* Analyse du bus i.MXL (il me faut encore extraire les infos utiles du databook)&lt;br /&gt;
* [[FpgaArchitecture|Spécification de l&#039;architecture du FPGA]]&lt;br /&gt;
* [[FpgaCodingRules|Spécification des règles de codage]]&lt;br /&gt;
* [[Orchestra|Spécification de l&#039;outil de conception automatique du FPGA]]&lt;br /&gt;
* Elaboration d&#039;une interface i.MXL &amp;lt;-&amp;gt; Wishbone&lt;br /&gt;
* Création d&#039;un banc de test VHDL / ModelSim&lt;br /&gt;
* Création d&#039;un design simple : Interface i.MXL/Wishbone + Registres&lt;br /&gt;
* Création d&#039;un petit programme pour accès aux registres dans le FPGA (langage ?!?)&lt;br /&gt;
* Création d&#039;un cahier des charges pour un outils de conception automatique du FPGA (petite préférence pour python... Il faut bien amortir les livres que j&#039;ai acheté sur le sujet ;-) )&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
=== Vu d&#039;ensemble ===&lt;br /&gt;
Le bus Wishbone est une spécifications de bus d&#039;interconnexion placé dans le domaine public. Son utilisation est libre de droit. Les [http://www.opencores.org/projects.cgi/web/wishbone/wbspec_b3.pdf|spécification Wishbone Version B3] sont librement accessibles. Le bus Wishbone est entièrement synchrone et définit un certain nombre d&#039;éléments:&lt;br /&gt;
* Des &#039;&#039;&#039;Maitres&#039;&#039;&#039;. Ces composants vont initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des &#039;&#039;&#039;Esclaves&#039;&#039;&#039;. Ces composants vont répondre à des demandes de transfert.&lt;br /&gt;
* Un &#039;&#039;&#039;Syscon&#039;&#039;&#039;. Ce composant va fournir les signaux globaux CLK (horloge système) et RST (reset synchrone)&lt;br /&gt;
* Une ou plusieurs &#039;&#039;&#039;Interconnexions&#039;&#039;&#039;. Ce macro composant prend en charge les connexions entre les différents composants maitres, esclaves et syscon qui composent le système ainsi que le décodage d&#039;adresse.&lt;br /&gt;
* Un ou plusieurs &#039;&#039;&#039;Arbitres&#039;&#039;&#039;. Ce composant va faire la gestion des signaux de contrôle des différents composants du bus pour autoriser les transferts entre maitre et esclave (sélection du maitre actif, contrôle de fin de transfert, etc).&lt;br /&gt;
&lt;br /&gt;
=== Type d&#039;interconnexion ===&lt;br /&gt;
Le bus peut être de type:&lt;br /&gt;
* &#039;&#039;&#039;Point To Point&#039;&#039;&#039;: Un maitre communique avec une esclave&lt;br /&gt;
* &#039;&#039;&#039;DataFlow&#039;&#039;&#039;: Chaque composant du bus possède une interface maitre et une interface esclave et tous les composants sont chainés l&#039;un après l&#039;autre.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;:  Tout les composants sont connectés sur le même bus de communication. Si plusieurs maitres se trouvent sur ce bus, un composant d&#039;arbitrage va faire la sélection du maitre qui aura le droit d&#039;effectuer des opérations sur le bus. Les autres maitres seront placés dans une file d&#039;attente.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: Avec ce type de bus, chaque composant maitre dispose d&#039;un bus de communication. Ceci permet à plusieurs maitres de communiquer en même temps. Lorsque plusieurs maitres sont connecté à un même composant esclave, un composant arbitre est intercalé qui va faire la sélection du maitre qui aura l&#039;accès à l&#039;esclave, les autres seront placés dans une file d&#039;attente.&lt;br /&gt;
&lt;br /&gt;
Mais un bus Wishbone peut être composé d&#039;une combinaison de ces différentes possibilités.&lt;br /&gt;
&lt;br /&gt;
=== Signaux du Wishbone ===&lt;br /&gt;
&lt;br /&gt;
== Le bus iMXL ==&lt;br /&gt;
&lt;br /&gt;
== Interface Wishbone/i.MXL ==&lt;br /&gt;
&lt;br /&gt;
== Wishbone Tools ==&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1815</id>
		<title>FpgaArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1815"/>
		<updated>2006-12-30T21:46:47Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Syscom */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spécifications de conception du FPGA =&lt;br /&gt;
&lt;br /&gt;
== Evolutions ==&lt;br /&gt;
&lt;br /&gt;
2006/12/29: MAJ de la partie 1.7 pour décrire plus en détail le programme d&#039;assemblage des IP (Orchestra)&lt;br /&gt;
&lt;br /&gt;
2006/12/21: MAJ en fonction des remarques de tout le monde.&lt;br /&gt;
&lt;br /&gt;
== But ==&lt;br /&gt;
&lt;br /&gt;
Cette page a été créée pour permettre à tous les membres de l&#039;association de discuter de l&#039;architecture qui va être mise en place pour le FPGA présent sur la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Cette espace doit être vu comme un espace d&#039;échange d&#039;idées. Tout le monde est convié à y participer. Il est préférable d&#039;avoir quelques connaissances en électronique et sur les langages HDL (VHDL ou Verilog), mais ce n&#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
Bonne lecture et merci pour votre participation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les grandes lignes ==&lt;br /&gt;
&lt;br /&gt;
Le FPGA de la carte APF9328 est là pour offrir le maximum de souplesse au projet &#039;&#039;&#039;Armadeus&#039;&#039;&#039; et permettre d&#039;implanter des fonctionnalités coté &#039;&#039;&#039;matériel&#039;&#039;&#039; qui seraient trop pénalisantes ou impossibles à implanter coté &#039;&#039;&#039;logiciel&#039;&#039;&#039;. Bien entendu, pour que cela soit exploitable, il faut également disposer d&#039;un lien entre le FPGA et le processeur i.MX.&lt;br /&gt;
&lt;br /&gt;
Pour réaliser cela, il faut mettre en place un bus de communication entre le FPGA et l&#039;i.MX. Ce bus de communication va permettre le pilotage des fonctionnalités qui seront implantées dans le FPGA. Bref, il faut recréer à l&#039;intérieur du FPGA un bus tel qu&#039;il existe entre l&#039;i.MX et les différents composants de la carte (RAM, Flash, USB, Ethernet, etc.).&lt;br /&gt;
&lt;br /&gt;
Pour gagner en temps de développement et pour pouvoir récupérer des fonctionnalités ou IP (Intellectual Property) déjà existantes, le bus Wishbone a été retenu. Ce bus, dont les spécification ont été placées dans le domaine public, a été conçu spécifiquement pour ce genre de configuration et sur le site &#039;&#039;&#039;[http://www.opencores.com www.opencores.com]&#039;&#039;&#039; plusieurs IP compatibles avec les spécifications Wishbone sont disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
La spécification Wishbone décrit un certain nombre de composants de base:&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;maitres&#039;&#039;&#039;, ces interfaces sont implantés dans des composants qui seront alors capable d&#039;initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;esclaves&#039;&#039;&#039;, ces interfaces sont implantés dans des composants capables de répondre à des demandes de transferts&lt;br /&gt;
* Un composant &#039;&#039;&#039;syscon&#039;&#039;&#039;, ce composant va générer le signal d&#039;horloge qui sera utilisé par tous les composants/interfaces du bus ainsi que le signal de RESET synchrone.&lt;br /&gt;
* Un macro composant &#039;&#039;&#039;intercon&#039;&#039;&#039;, ce composant va gérer la connexion de toutes les interfaces maitres et esclaves qui composent le bus interne. Il prend en charge :&lt;br /&gt;
** Le décodage/transcodage d&#039;adresse (génération des signaux A0 à A3 selon le mode d&#039;adressage 8/16/32/64 bits)&lt;br /&gt;
** le routage du bus de données entre les différentes interfaces maitres et esclaves (conversion big endian/little endian, etc)&lt;br /&gt;
** le routage/génération des signaux de contrôle du bus (Read, Write, Chip Select, Output Enable, ACK, etc.)&lt;br /&gt;
* Un composant &#039;&#039;&#039;arbitre&#039;&#039;&#039;, ce composant va permettre de partager l&#039;accès au bus ou à un composant de type esclave qui est partagé par plusieurs composants de type maitre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les spécifications du bus Wishbone permettent de créer différents types de bus:&lt;br /&gt;
* &#039;&#039;&#039;Point to Point&#039;&#039;&#039;: C&#039;est le type de bus le plus simple possibl, un composant avec une interface type maitre connecté à un composant avec une interface de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Data Flow&#039;&#039;&#039;: C&#039;est un bus en cascade, à un bout on trouve un composant avec une interface de type maître et à l&#039;autre bout un composant avec une interface de type esclave. Entre les deux composant se trouve une chaine d&#039;un ou plusieurs composants avec une interface de type maitre et de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;: C&#039;est un bus sur lequel plusieurs composants sont connectés dessus. Tous les composants se partagent ce bus. Si plusieurs &#039;&#039;maitres&#039;&#039; sont connectés sur ce bus, un seul pourra initier un transfert à un instant donné.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: C&#039;est également un bus de type partagé, par contre dans se cas, on dispose de plusieurs bus. Chaque maitre utilise sont propre bus pour communiquer avec ces esclaves. On peut donc avoir plusieurs transferts en simultané. Le seul cas de blocage/arbitrage est le transfert de plusieurs maitre avec le même esclave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe également un certain nombre de mécanismes dans la spécification Wishbone pour permettre d&#039;optimiser les temps de transferts sur le bus. Ces optimisations sont de plusieurs nature:&lt;br /&gt;
* utilisation de signaux &#039;&#039;&#039;ACK&#039;&#039;&#039;, &#039;&#039;&#039;ERR&#039;&#039;&#039; et &#039;&#039;&#039;RTY&#039;&#039;&#039; pour signaler la fin de transfert&lt;br /&gt;
* les &#039;&#039;&#039;Registered Feedback Bus Cycles&#039;&#039;&#039;, qui permettent de gagner un cycle d&#039;horloge pour des transferts consécutifs&lt;br /&gt;
* les transferts en mode &#039;&#039;&#039;Burst&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Le lien i.MX &amp;lt;=&amp;gt; FPGA ==&lt;br /&gt;
&lt;br /&gt;
La communication entre l&#039;i.MX et le FPGA passe par les signaux suivants (à vérifier):&lt;br /&gt;
* des signaux de contrôle: &amp;lt;strike&amp;gt;RW_n&amp;lt;/strike&amp;gt;, OE_n, EB_n[3..2] et CS1_n&lt;br /&gt;
* le bus de données sur 16 bits (D[15..0])&lt;br /&gt;
* le bus d&#039;adresses sur 12 bits (A[12..1])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ces signaux sont alors utilisés pour créer une interface Wishbone maitre qui va permettre de communiquer efficacement avec les autres IPs contenus dans le FPGA qui implémenterons une interface wishbone de type esclave.&lt;br /&gt;
&lt;br /&gt;
Etant donné les erratas du composant i.MX  concernant le signal DTACK, il n&#039;est pas possible d&#039;implanter une interface Wishbone maitre &#039;&#039;classique&#039;&#039;. Ceci entraine les limitations suivantes:&lt;br /&gt;
* Pas possible d&#039;utiliser le signal &#039;&#039;&#039;ACK&#039;&#039;&#039; Wishbone pour terminer le transfert entre FPGA et i.MX.&lt;br /&gt;
* Pas possible de mettre en place des optimisations du temps de transfert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce problème, il faudra s&#039;assurer que toutes les interfaces esclaves qui seront connectées à l&#039;interface maitre du composant Wishbone i.MX répondent dans un temps fixe donné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme le bus Wishbone est un bus entièrement synchrone, le temps minimal d&#039;un transfert est de 2 cycles de l&#039;horloge Wishbone. Il faut ajouter à cela, un cycle pour la synchronisation des signaux du bus i.MX. Cela nous fait donc un minimum de 3 cycles Wishbone pour un transfert entre le FPGA et l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
Etant donné les performances des FPGA actuels, on peut tabler sur une fréquence de fonctionnement d&#039;au moins 100MHz pour le bus Wishbone. Cela nous donne donc un taux de transfert approximatif de 66 Moctets/sec (100MHz * 16bits / 3).&lt;br /&gt;
&lt;br /&gt;
== La composition du système Wishbone ==&lt;br /&gt;
&lt;br /&gt;
[[Image:FPGA_Armadeus.png]]&lt;br /&gt;
&lt;br /&gt;
Le système Wishbone qui sera implanté dans le FPGA se compose des éléments suivants:&lt;br /&gt;
* &#039;&#039;&#039;i.MX Wrapper&#039;&#039;&#039;: L&#039;interface i.MX vers le bus Wishbone&lt;br /&gt;
* &#039;&#039;&#039;Syscon&#039;&#039;&#039;: Ce composant va gérer les signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; (généré par une PLL ou directement issu de l&#039;i.MX) et &#039;&#039;&#039;RESET&#039;&#039;&#039; (synchrone).&lt;br /&gt;
* &#039;&#039;&#039;Intercon&#039;&#039;&#039;: Ce composant devra être généré automatiquement par une moulinette, il va faire le lien entre tous les composants faisant parti du &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Gestionnaire d&#039;interruption&#039;&#039;&#039;: Ce composant est un &#039;&#039;&#039;esclave wishbone&#039;&#039;&#039; et va centraliser toutes les demandes d&#039;interruption et les remonter vers l&#039;i.MX.&lt;br /&gt;
* &#039;&#039;&#039;Esclaves whisbone&#039;&#039;&#039;: Ceci représentent tous les autres composants avec une interface wishbone esclave qui sont accessibles via le wrapper i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur le diagramme, il manque un certain nombre de choses:&lt;br /&gt;
* Les signaux &#039;&#039;non wishbone&#039;&#039; en entrée ou en sortie sur les &#039;&#039;&#039;esclaves wishbone&#039;&#039;&#039;&lt;br /&gt;
* Le macro composant &#039;&#039;&#039;système wishbone&#039;&#039;&#039;. Ce macro composant est celui qui sera ensuite instancié dans le design du FPGA. Sur ce composant ne seront visibles que les signaux &#039;&#039;externes&#039;&#039; au système:&lt;br /&gt;
** Les signaux issus de l&#039;i.MX&lt;br /&gt;
** &amp;lt;strike&amp;gt;Le signal RESET (en entrée) qui sera synchronisé sur l&#039;horloge système&amp;lt;/strike&amp;gt; Le signal RESET synchrone du bus Wishbone sera directement généré par le composant syscon à l&#039;aide d&#039;une simple machine d&#039;état.&lt;br /&gt;
** Le signal CLK (en entrée) qui sera l&#039;horloge utilisée pour la génération des signaux Wishbone&lt;br /&gt;
** Le signal IRQ (en sortie) qui sera utilisé pour remonter les demandes d&#039;interruption vers l&#039;i.MX&lt;br /&gt;
** Les signaux d&#039;entrée et de sortie spécifiques aux autres composants connectés sur le bus Wishbone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt de créer le composant &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;, est que cela simplifie la vision dans l&#039;outil conception du FPGA. Il ne suffit plus alors qu&#039;à relier les signaux sur les broches correspondantes du FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== i.MX Wrapper ===&lt;br /&gt;
&lt;br /&gt;
Ce composant est le point d&#039;accès au bus Wishbone pour l&#039;i.MX et sera le seul à disposer d&#039;une interface Wishbone maitre.&lt;br /&gt;
&lt;br /&gt;
Les fonctions de ce composants sont:&lt;br /&gt;
* synchronisation des signaux issus de l&#039;i.MX. Ceci est primordial pour assurer la stabilité de tout le système Wishbone. De plus, le bus de sortie étant asynchrone (l&#039;horloge de génération des signaux n&#039;est pas véhiculée), la resynchronisation des signaux par rapport à l&#039;horloge du bus s&#039;impose.&lt;br /&gt;
* gestion du bus de données en 3 états.&lt;br /&gt;
* conversion des signaux de contrôle du bus i.MX en signaux Wishbone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syscom ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est le composant le plus simple du système &amp;lt;strike&amp;gt;, il ne fait que synchroniser le signal RESET en entrée avec le signal d&#039;horloge du système&amp;lt;/strike&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Il va être en charge de la génération du signal RESET synchrone pour le bus Wishbone.&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;horloge en entrée du composant &#039;&#039;&#039;syscon&#039;&#039;&#039; sera celui utilisé pour le fonctionnement du bus Wishbone. La fréquence du signal d&#039;horloge devra être assez élevée pour permettre le traitement des signaux issus de l&#039;i.MX. Cela va dépendre de la configuration du chip select utilisé (CS1).&lt;br /&gt;
&lt;br /&gt;
La source du signal d&#039;horloge reste encore à définir, les choix possibles sont:&lt;br /&gt;
* directement issu de l&#039;i.MX&lt;br /&gt;
* utilisation d&#039;un DCM du Spartan 3&lt;br /&gt;
&lt;br /&gt;
Le choix définitif dépendra principalement des essais &#039;&#039;grandeur nature&#039;&#039; lors de la génération des premiers systèmes whisbone durant la phase de mise en place des composants de base.&lt;br /&gt;
&lt;br /&gt;
=== Intercon ===&lt;br /&gt;
&lt;br /&gt;
Ce composant a la particularité qu&#039;il sera créé automatiquement par un outil (script ou programme). &#039;&#039;&#039;Intercom&#039;&#039;&#039; a comme fonctionnalités:&lt;br /&gt;
* Le décodage d&#039;adresse pour la sélection des différents esclaves du système&lt;br /&gt;
* Le routage des bus d&#039;adresses et de données vers les différents esclaves&lt;br /&gt;
* La génération des signaux de contrôle pour les différents esclaves.&lt;br /&gt;
&lt;br /&gt;
Etant donné les limitations induites par les erratas de l&#039;i.MX, le composant &#039;&#039;&#039;intercom&#039;&#039;&#039; remplira les fonctionnalités suivantes:&lt;br /&gt;
* le bus de données est figé sur 16 bits&lt;br /&gt;
* les cycles de lecture et d&#039;écriture sont de longueur fixe (à priori 3 cycles d&#039;horloge &#039;&#039;&#039;à valider&#039;&#039;&#039; lors des essais du système de base)&lt;br /&gt;
* une interruption est générée en cas de dépassement du temps de cycle d&#039;écriture ou de lecture&lt;br /&gt;
* le bus sera de type &#039;&#039;&#039;shared&#039;&#039;&#039; avec un seul maitre (le Wrapper i.MX).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les composants esclaves ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;Suite aux divers discussions issues de ce chapitre. L&#039;organisation et la présences des fichiers dans les répertoires &#039;&#039;&#039;doc&#039;&#039;&#039; et &#039;&#039;&#039;HAL&#039;&#039;&#039; n&#039;est pas encore établie. Ce chapitre sera encore à retravailler.&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;une IP puisse être facilement inclue dans le système, il faut une certaine organisation. Sinon, à moyen ou à long terme cette IP est morte parce qu&#039;elle sera difficilement exploitable et encore plus difficilement maintenable.&lt;br /&gt;
&lt;br /&gt;
Ce sont des notions qui ne sont pas simples à prendre en considération lors du développement d&#039;un nouveau projet, mais lorsque l&#039;on doit se replonger dans un travail fait par quelqu&#039;un d&#039;autre ou un projet qu&#039;on a laissé en sommeil pendant quelque temps, on est content d&#039;avoir quelque chose à quoi se raccrocher.&lt;br /&gt;
&lt;br /&gt;
Pour développer efficacement, il faut assurer une organisation logique, figée et compréhensible, et le plus simple dans ce genre de cas est de se baser sur la notion de répertoire. Voici les répertoires qui doivent être utilisés par une IP:&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: Ce répertoire va contenir toute la documentation nécessaire à l&#039;exploitation de l&#039;IP. On y trouvera une notice (&#039;&#039;&#039;readme.txt&#039;&#039;&#039;), un fichier de suivi de modification (&#039;&#039;&#039;ChangeLog.txt&#039;&#039;&#039;), un fichier contenant les évolutions futures prévues (&#039;&#039;&#039;todo.txt&#039;&#039;&#039;) ainsi que tout autre fichier estimé utile par le(s) créateur(s) de l&#039;IP.&lt;br /&gt;
* &#039;&#039;&#039;hdl&#039;&#039;&#039;: Ce répertoire va contenir tous les fichiers VHDL (ou Verilog) qui auront été développés spécifiquement pour cette IP.&lt;br /&gt;
* &#039;&#039;&#039;inc&#039;&#039;&#039;: Ce répertoire va contenir un fichier d&#039;en-tête ANSI C contenant l&#039;adresse de tous les registres interne de l&#039;IP pour permettre de créer simplement un programme en langage C permettant de contrôler l&#039;IP. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HAL&#039;&#039;&#039;: Ce répertoire va contenir un drivers ou un exemple de logiciel de base permettant l&#039;utilisation de l&#039;IP par un microprocesseur/contrôleur. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Ce composant esclave est le premier qui sera créé spécifiquement pour le système. Il sera capable de:&lt;br /&gt;
* prendre en compte jusqu&#039;à 16 sources d&#039;interruptions différentes&lt;br /&gt;
* réaliser l&#039;acquittement de chaque interruption individuellement&lt;br /&gt;
* masquer/autoriser chaque interruption individuellement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le composant disposera des registres suivants:&lt;br /&gt;
* &#039;&#039;&#039;isr_mask&#039;&#039;&#039;: registre d&#039;autorisation des interruptions. Chaque bit correspond à une interruption (bit0 =&amp;gt; IRQ0, bit1 =&amp;gt; IRQ1, etc.). Ce registre sera accessible en lecture et en écriture.&lt;br /&gt;
* &#039;&#039;&#039;isr_pend&#039;&#039;&#039;: ce registre est à double emploi&lt;br /&gt;
** &#039;&#039;&#039;en lecture&#039;&#039;&#039;: Les interruptions en attente de traitement&lt;br /&gt;
** &#039;&#039;&#039;en écriture&#039;&#039;&#039;: Acquittement des interruptions. Chaque bit à 1 va acquitter l&#039;interruption correspondante.&lt;br /&gt;
&lt;br /&gt;
== Le script / programme d&#039;assemblage des IP ==&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant parler du coeur du système, du moins de la partie la plus visible de l&#039;iceberg ;-)&lt;br /&gt;
&lt;br /&gt;
La première des priorités, sera de trouver un nom pour cet outil qui reste un peu dans l&#039;esprit du projet. Voici quelques propositions, à vous de compléter ou de voter pour un nom ou plusieurs noms:&lt;br /&gt;
* Concerto&lt;br /&gt;
* Orchestra&lt;br /&gt;
&lt;br /&gt;
D&#039;après les derniers sondage, &#039;&#039;&#039;Orchestra&#039;&#039;&#039; serait finalement le nom retenu pour ce logiciel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Principe et fonctionnement ===&lt;br /&gt;
&lt;br /&gt;
Afin de de rendre tout ce système utilisable par le plus grand nombre, il faut être capable de proposer des outils qui vont simplifier la vie de l&#039;utilisateur final ainsi que de l&#039;intégrateur.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faudra créer un outil soit sous forme de script(s), soit sous forme de programme(s) qui va permettre de réaliser les tâches suivantes:&lt;br /&gt;
* Création/gestion d&#039;une bibliothèque de composants &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* Gestion d&#039;une liste de &#039;&#039;&#039;hardware Armadeus&#039;&#039;&#039;&lt;br /&gt;
* Edition d&#039;un &#039;&#039;&#039;système Armadeus&#039;&#039;&#039;&lt;br /&gt;
* Gestion d&#039;un projet&lt;br /&gt;
* Génération automatique du composant &#039;&#039;&#039;system&#039;&#039;&#039; qui sera implanté dans le FPGA&lt;br /&gt;
* Génération automatique d&#039;un banc de tests pour permettre la validation par ModelSim (ou autre logiciel de simulation HDL)&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;mapping mémoire&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La bibliothèque de composants ===&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;un composant, c&#039;est-à-dire une IP, soit exploitable par le système, il faut passer par une phase d&#039;intégration qui va permettre de décrire ce composant:&lt;br /&gt;
* Nom de l&#039;IP&lt;br /&gt;
* Description&lt;br /&gt;
* Version&lt;br /&gt;
* Identification des fichiers HDL utilisés (VHDL ou Verilog)&lt;br /&gt;
* Identification du fichier &#039;&#039;&#039;Top&#039;&#039;&#039; (le point d&#039;entrée de l&#039;IP)&lt;br /&gt;
* Identification des paramètres &#039;&#039;&#039;&#039;&#039;GENERIC&#039;&#039;&#039;&#039;&#039; (dans le cas d&#039;une IP en VHDL):&lt;br /&gt;
** Type de paramètre (entier, std_logic, etc)&lt;br /&gt;
** Valeur par défaut&lt;br /&gt;
** Valeurs ou plages de valeurs autorisées&lt;br /&gt;
** Description du paramètre&lt;br /&gt;
* Identification des signaux Wishbone utilisés par le composant&lt;br /&gt;
* Identification du type (maitre ou esclave) et du nombre d&#039;interfaces Wishbone utilisés par ce composant&lt;br /&gt;
* Identification des registres internes&lt;br /&gt;
** Adresse (Offset par rapport à l&#039;adresse de base)&lt;br /&gt;
** Taille (8 ou 16 bits)&lt;br /&gt;
** Nom et/ou description&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toutes ces informations seront alors sauvegardées dans un fichier, de préférence dans un format compréhensible et lisible à l&#039;aide de n&#039;importe quel éditeur de texte (XML, &#039;&#039;fichier INI&#039;&#039; ou &#039;&#039;fichier plat&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque composant identifié par le logiciel se trouvera dans un sous-répertoire (ou dans un fichier archive ?!?) placé dans le répertoire &#039;&#039;&#039;Armadeus Components&#039;&#039;&#039;, chaque sous-répertoire (ou archive) de composant contiendra les données suivantes:&lt;br /&gt;
* Le fichier de description du composant &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* un répertoire &#039;&#039;&#039;HDL&#039;&#039;&#039; avec les fichiers VHDL/Verilog de l&#039;IP&lt;br /&gt;
* un répertoire &#039;&#039;&#039;HAL&#039;&#039;&#039; avec les fichiers d&#039;un drivers de base (pour Linux ou &#039;&#039;générique&#039;&#039; ?!?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le gestionnaire de composants Armadeus doit être capable de réaliser les opérations suivantes:&lt;br /&gt;
* Importer un composant ou une liste de composants&lt;br /&gt;
* Exporter un composant ou une liste de composants&lt;br /&gt;
* Gérer des versions de composants (à voir si cette fonctionnalité est importante/utile)&lt;br /&gt;
* Permettre l&#039;ajout/création de composants&lt;br /&gt;
* Permettre de supprimer un composant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire de plateformes ===&lt;br /&gt;
&lt;br /&gt;
Il faut avoir confiance dans l&#039;avenir, pour l&#039;instant nous ne disposons que d&#039;une seul plateforme de travail, mais ce n&#039;est qu&#039;un début et très certainement d&#039;autres cartes à base de l&#039;i.MX et d&#039;un FPGA vont voir le jour.&lt;br /&gt;
&lt;br /&gt;
Il faut donc prévoir d&#039;ores et déjà cette possibilité et proposer un outil qui va permettre de définir une plateforme. Chaque descripteur de plateforme devra fournir les informations suivantes:&lt;br /&gt;
* Type de FPGA&lt;br /&gt;
* Emplacement (niveau FPGA, c&#039;est-à-dire la broche utilisée), type (sortie i.MX, oscillateur ou quartz) et fréquence (ou plage de fréquence ?!?) des horloges&lt;br /&gt;
* Emplacements/broche du FPGA utilisées ainsi que leur fonctionnalité (signal Wishbone, comme d&#039;un composant externe, signal d&#039;interruption, etc.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toutes ces informations seront utilisées par la suite lors de la création d&#039;un projet &#039;&#039;&#039;Orchestra/Armadeus&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire de projet ===&lt;br /&gt;
&lt;br /&gt;
Le rôle du gestionnaire de projet est de permettre de créer, reprendre ou modifier le plus simplement possible une configuration du FPGA pour une carte donnée. Cette configuration sera appelée par la suite un &#039;&#039;&#039;système&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout &#039;&#039;&#039;système&#039;&#039;&#039; est entièrement décrit par un fichier projet qui contiendra les éléments suivants:&lt;br /&gt;
* Le nom du système (éventuellement le même que le nom du projet ?!?)&lt;br /&gt;
* Une description du système&lt;br /&gt;
* Le type de plateforme utilisé pour ce système&lt;br /&gt;
* La source de la fréquence d&#039;horloge du bus Wishbone (broche du FPGA ou DLL/DCM). On pourra éventuellement imaginer la création d&#039;un &#039;&#039;Wizard&#039;&#039; pour simplifier la configuration du DCM.&lt;br /&gt;
* La liste de tous les composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; inclus dans le système, avec pour chacun de ces composants, les détails suivantes:&lt;br /&gt;
** La référence du composant (par rapport à la bibliothèque de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;)&lt;br /&gt;
** Le nom de l&#039;instance du composant (e.g. UART1, PWM_MOTOR, etc.)&lt;br /&gt;
** La connexion des entrées/sorties (vers une broche du FPGA, non utilisé ou relié &#039;&#039;&#039;manuellement&#039;&#039;&#039;)&lt;br /&gt;
** L&#039;adresse du base de chacune de ses interfaces esclaves connectées au bus Wishbone&lt;br /&gt;
** La valeur de chaque paramètre &#039;&#039;&#039;GENERIC&#039;&#039;&#039; du composant&lt;br /&gt;
** L&#039;horloge utilisée (pour l&#039;instant ce sera toujours celle du bus Wishbone mais peut-être que plus tard ce ne sera plus forcément le cas ;-) )&lt;br /&gt;
** Le numéro d&#039;interruption attribué au composant, s&#039;il est capable de généré une demande d&#039;interruption&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme pour le fichier de description d&#039;un composant Armadeus, le fichier projet devra être dans un format texte compréhensible et lisible à l&#039;aide de n&#039;importe quel éditeur texte (XML, &#039;&#039;fichier INI&#039;&#039; ou &#039;&#039;fichier plat&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le fichier projet est le coeur du système et, à partir de celui-ci ainsi que de la librairie de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; + la librairie de plateforme, toute la partie liée au FPGA doit pouvoir être recrée. Bref c&#039;est le seul fichier dont l&#039;utilisateur final aura à ce soucier (sauvegarde, archivage, etc).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la création d&#039;un nouveau projet, l&#039;utilisateur devra fournir les éléments de base suivants:&lt;br /&gt;
* Le nom du système&lt;br /&gt;
* Une description&lt;br /&gt;
* Le type de plateforme utilisé&lt;br /&gt;
* La source de l&#039;horloge Wishbone (broche du FPGA ou DCM) avec éventuellement un &#039;&#039;wizard&#039;&#039; pour la saisie des informations relatives à la programmation du DCM.&lt;br /&gt;
* La fréquence du bus Wishbone (éventuellement obtenue automatiquement à partir de la sélection de la source de l&#039;horloge)&lt;br /&gt;
* Le nombre de sources d&#039;interruptions autorisées ainsi que l&#039;emplacement en mémoire des registres du gestionnaire d&#039;interruption (par défaut à l&#039;adresse 0x0000).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois que le projet aura été créer, les composants suivants seront ajouté automatiquement au système:&lt;br /&gt;
* Un &#039;&#039;&#039;Wrapper i.MX&#039;&#039;&#039; pour faire le lien avec l&#039;i.MX&lt;br /&gt;
* Un &#039;&#039;&#039;syscon&#039;&#039;&#039; pour la générations des signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; et &#039;&#039;&#039;RESET&#039;&#039;&#039; du bus Wishbone&lt;br /&gt;
* Un &#039;&#039;&#039;Gestionnaire d&#039;interruptions&#039;&#039;&#039; si le système doit être capable de remonter des demandes d&#039;interruption.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par la suite, l&#039;utilisateur pourra modifier le système de base à l&#039;aide des opérations suivantes:&lt;br /&gt;
* choisir dans la librairie un composant pour l&#039;ajouter au système&lt;br /&gt;
* modifier les paramètres d&#039;un composant du système&lt;br /&gt;
* modifier les caractéristiques du projet (nom, fréquence du bus Wishbone, etc.)&lt;br /&gt;
* supprimer un composant du système&lt;br /&gt;
* attribution automatique des adresses de base sur le bus Wishbone&lt;br /&gt;
* attribution automatique des numéros d&#039;interruption&lt;br /&gt;
* annulation des dernières modifications (éventuellement)&lt;br /&gt;
* sauvegarde/restauration d&#039;un fichier projet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Générateur de fichiers ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici que va se trouver la partie la plus ardue du projet &#039;&#039;&#039;Orchestra&#039;&#039;&#039;, et c&#039;est en fonction de ce que l&#039;on sera capable de proposer à l&#039;utilisateur final que se fera l&#039;adhésion au projet ou non.&lt;br /&gt;
&lt;br /&gt;
Une fois que l&#039;on aura créer son projet/système Armadeus, il faut encore pouvoir générer au minimum le fichier &#039;&#039;&#039;bitstream&#039;&#039;&#039; qui va être utiliser pour configurer le FPGA.&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;entre en jeu le générateur de fichiers, qui devra être capable, à l&#039;aide du fichier projet + la librairie de composant + la librairie de plateforme, de générer le fichiers suivants:&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;Intercon&#039;&#039;&#039; reliant tous les composants placés dans le système qui a été créé par l&#039;utilisateur&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;system&#039;&#039;&#039; qui va englober tout le système Wishbone tel qu&#039;il a été défini par l&#039;utilisateur&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;system_tb&#039;&#039;&#039; et un fichier &#039;&#039;&#039;.DO&#039;&#039;&#039; qui vont pouvoir être utilisés pour la simulation à partir de ModelSim&lt;br /&gt;
* un fichier &#039;&#039;&#039;system.h&#039;&#039;&#039; qui va contenir le plan mémoire du système créé&lt;br /&gt;
* un fichier &#039;&#039;&#039;tcl&#039;&#039;&#039; qui va permettre de créer entièrement et de manière automatique le projet dans l&#039;environnement &#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;, c&#039;est-à-dire:&lt;br /&gt;
** sélection du bon FPGA&lt;br /&gt;
** sélection du bon format de sortie (bitstream)&lt;br /&gt;
** saisie du pinout du FPGA (nom de chaque broche par rapport au nom du signal sur le schéma)&lt;br /&gt;
** programmation du DCM le cas échéant&lt;br /&gt;
** définition des signaux d&#039;horloge&lt;br /&gt;
** inclusion des fichiers HDL nécessaires au projet&lt;br /&gt;
** instanciation du fichier HDL &#039;&#039;&#039;sytem&#039;&#039;&#039;&lt;br /&gt;
** connexion des entrées et sorties du composant &#039;&#039;&#039;system&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme on peut le voir, le travail pour &#039;&#039;&#039;Orchestra&#039;&#039;&#039; ne manque pas, reste encore la question du mode de développement ainsi que du langage et la bibliothèque graphique.&lt;br /&gt;
&lt;br /&gt;
Mais ceci est encore une autre histoire, qui pourra être débattu lorsque les premières composants système seront prêt à l&#039;emploi... Peut-être très bientôt :-)&lt;br /&gt;
&lt;br /&gt;
== Gestionnaire d&#039;interruption ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ce chapitre est donné à titre informatif/propositon et ne tiens pas lieu de spécification.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier la vie des programmeurs systèmes, il faut pouvoir offrir un mécanisme simple de mise en place et de gestion des demandes d&#039;interruption du FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour cela, je propose la solution suivante:&lt;br /&gt;
* Mise en place d&#039;un gestionnaire d&#039;interruption générique pour le FPGA. Ce gestionnaire d&#039;interruption sera capable de lire le registre d&#039;interruption (lecture de &#039;&#039;&#039;isr_pend&#039;&#039;&#039;) et de déterminer les interruptions à traiter (via &#039;&#039;&#039;isr_mask&#039;&#039;&#039;). Il va en suite aiguiller l&#039;exécution de la routine d&#039;interruption vers les routines adéquates pour chaque bit d&#039;interruption valide. L&#039;interruption traitée sera alors acquitée (écriture vers &#039;&#039;&#039;isr_pend&#039;&#039;&#039;).&lt;br /&gt;
* Création d&#039;une routine &#039;&#039;&#039;&#039;&#039;d&#039;enregistrement de vecteur d&#039;interruption&#039;&#039;&#039;&#039;&#039;. Cette routine va permettre d&#039;ajouter une routine de traitement d&#039;interruption pour un bit d&#039;interruption donné. Pour cela il faudra lui fournir les informations suivantes (via une structure ?!?):&lt;br /&gt;
** Le numéro du bit d&#039;interruption (0 à 31)&lt;br /&gt;
** La routine de traitement d&#039;interruption pour ce driver&lt;br /&gt;
** Un paramètre additionnel à fournir à la routine de traitement d&#039;interruption (pointeur de type &#039;&#039;&#039;&#039;&#039;void *&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
** Le nom du drivers (optionnel, permet d&#039;identifier/visualiser les drivers installer éventuellement)&lt;br /&gt;
* Création d&#039;une routine de validation d&#039;une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour masquer une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour désinstaller une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine ou méthode pour visualiser tous les drivers Wishbone installés:&lt;br /&gt;
** Leur numéro&lt;br /&gt;
** Leur nom&lt;br /&gt;
** Leur état (validé/masqué)&lt;br /&gt;
** Le nombre de fois qu&#039;ils ont été appelé&lt;br /&gt;
** etc.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1811</id>
		<title>FpgaArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1811"/>
		<updated>2006-12-29T21:44:11Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Générateur de fichiers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spécifications de conception du FPGA =&lt;br /&gt;
&lt;br /&gt;
== Evolutions ==&lt;br /&gt;
&lt;br /&gt;
2006/12/29: MAJ de la partie 1.7 pour décrire plus en détail le programme d&#039;assemblage des IP (Orchestra)&lt;br /&gt;
&lt;br /&gt;
2006/12/21: MAJ en fonction des remarques de tout le monde.&lt;br /&gt;
&lt;br /&gt;
== But ==&lt;br /&gt;
&lt;br /&gt;
Cette page a été créée pour permettre à tous les membres de l&#039;association de discuter de l&#039;architecture qui va être mise en place pour le FPGA présent sur la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Cette espace doit être vu comme un espace d&#039;échange d&#039;idées. Tout le monde est convié à y participer. Il est préférable d&#039;avoir quelques connaissances en électronique et sur les langages HDL (VHDL ou Verilog), mais ce n&#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
Bonne lecture et merci pour votre participation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les grandes lignes ==&lt;br /&gt;
&lt;br /&gt;
Le FPGA de la carte APF9328 est là pour offrir le maximum de souplesse au projet &#039;&#039;&#039;Armadeus&#039;&#039;&#039; et permettre d&#039;implanter des fonctionnalités coté &#039;&#039;&#039;matériel&#039;&#039;&#039; qui seraient trop pénalisantes ou impossibles à implanter coté &#039;&#039;&#039;logiciel&#039;&#039;&#039;. Bien entendu, pour que cela soit exploitable, il faut également disposer d&#039;un lien entre le FPGA et le processeur i.MX.&lt;br /&gt;
&lt;br /&gt;
Pour réaliser cela, il faut mettre en place un bus de communication entre le FPGA et l&#039;i.MX. Ce bus de communication va permettre le pilotage des fonctionnalités qui seront implantées dans le FPGA. Bref, il faut recréer à l&#039;intérieur du FPGA un bus tel qu&#039;il existe entre l&#039;i.MX et les différents composants de la carte (RAM, Flash, USB, Ethernet, etc.).&lt;br /&gt;
&lt;br /&gt;
Pour gagner en temps de développement et pour pouvoir récupérer des fonctionnalités ou IP (Intellectual Property) déjà existantes, le bus Wishbone a été retenu. Ce bus, dont les spécification ont été placées dans le domaine public, a été conçu spécifiquement pour ce genre de configuration et sur le site &#039;&#039;&#039;[http://www.opencores.com www.opencores.com]&#039;&#039;&#039; plusieurs IP compatibles avec les spécifications Wishbone sont disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
La spécification Wishbone décrit un certain nombre de composants de base:&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;maitres&#039;&#039;&#039;, ces interfaces sont implantés dans des composants qui seront alors capable d&#039;initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;esclaves&#039;&#039;&#039;, ces interfaces sont implantés dans des composants capables de répondre à des demandes de transferts&lt;br /&gt;
* Un composant &#039;&#039;&#039;syscon&#039;&#039;&#039;, ce composant va générer le signal d&#039;horloge qui sera utilisé par tous les composants/interfaces du bus ainsi que le signal de RESET synchrone.&lt;br /&gt;
* Un macro composant &#039;&#039;&#039;intercon&#039;&#039;&#039;, ce composant va gérer la connexion de toutes les interfaces maitres et esclaves qui composent le bus interne. Il prend en charge :&lt;br /&gt;
** Le décodage/transcodage d&#039;adresse (génération des signaux A0 à A3 selon le mode d&#039;adressage 8/16/32/64 bits)&lt;br /&gt;
** le routage du bus de données entre les différentes interfaces maitres et esclaves (conversion big endian/little endian, etc)&lt;br /&gt;
** le routage/génération des signaux de contrôle du bus (Read, Write, Chip Select, Output Enable, ACK, etc.)&lt;br /&gt;
* Un composant &#039;&#039;&#039;arbitre&#039;&#039;&#039;, ce composant va permettre de partager l&#039;accès au bus ou à un composant de type esclave qui est partagé par plusieurs composants de type maitre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les spécifications du bus Wishbone permettent de créer différents types de bus:&lt;br /&gt;
* &#039;&#039;&#039;Point to Point&#039;&#039;&#039;: C&#039;est le type de bus le plus simple possibl, un composant avec une interface type maitre connecté à un composant avec une interface de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Data Flow&#039;&#039;&#039;: C&#039;est un bus en cascade, à un bout on trouve un composant avec une interface de type maître et à l&#039;autre bout un composant avec une interface de type esclave. Entre les deux composant se trouve une chaine d&#039;un ou plusieurs composants avec une interface de type maitre et de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;: C&#039;est un bus sur lequel plusieurs composants sont connectés dessus. Tous les composants se partagent ce bus. Si plusieurs &#039;&#039;maitres&#039;&#039; sont connectés sur ce bus, un seul pourra initier un transfert à un instant donné.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: C&#039;est également un bus de type partagé, par contre dans se cas, on dispose de plusieurs bus. Chaque maitre utilise sont propre bus pour communiquer avec ces esclaves. On peut donc avoir plusieurs transferts en simultané. Le seul cas de blocage/arbitrage est le transfert de plusieurs maitre avec le même esclave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe également un certain nombre de mécanismes dans la spécification Wishbone pour permettre d&#039;optimiser les temps de transferts sur le bus. Ces optimisations sont de plusieurs nature:&lt;br /&gt;
* utilisation de signaux &#039;&#039;&#039;ACK&#039;&#039;&#039;, &#039;&#039;&#039;ERR&#039;&#039;&#039; et &#039;&#039;&#039;RTY&#039;&#039;&#039; pour signaler la fin de transfert&lt;br /&gt;
* les &#039;&#039;&#039;Registered Feedback Bus Cycles&#039;&#039;&#039;, qui permettent de gagner un cycle d&#039;horloge pour des transferts consécutifs&lt;br /&gt;
* les transferts en mode &#039;&#039;&#039;Burst&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Le lien i.MX &amp;lt;=&amp;gt; FPGA ==&lt;br /&gt;
&lt;br /&gt;
La communication entre l&#039;i.MX et le FPGA passe par les signaux suivants (à vérifier):&lt;br /&gt;
* des signaux de contrôle: &amp;lt;strike&amp;gt;RW_n&amp;lt;/strike&amp;gt;, OE_n, EB_n[3..2] et CS1_n&lt;br /&gt;
* le bus de données sur 16 bits (D[15..0])&lt;br /&gt;
* le bus d&#039;adresses sur 12 bits (A[12..1])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ces signaux sont alors utilisés pour créer une interface Wishbone maitre qui va permettre de communiquer efficacement avec les autres IPs contenus dans le FPGA qui implémenterons une interface wishbone de type esclave.&lt;br /&gt;
&lt;br /&gt;
Etant donné les erratas du composant i.MX  concernant le signal DTACK, il n&#039;est pas possible d&#039;implanter une interface Wishbone maitre &#039;&#039;classique&#039;&#039;. Ceci entraine les limitations suivantes:&lt;br /&gt;
* Pas possible d&#039;utiliser le signal &#039;&#039;&#039;ACK&#039;&#039;&#039; Wishbone pour terminer le transfert entre FPGA et i.MX.&lt;br /&gt;
* Pas possible de mettre en place des optimisations du temps de transfert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce problème, il faudra s&#039;assurer que toutes les interfaces esclaves qui seront connectées à l&#039;interface maitre du composant Wishbone i.MX répondent dans un temps fixe donné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme le bus Wishbone est un bus entièrement synchrone, le temps minimal d&#039;un transfert est de 2 cycles de l&#039;horloge Wishbone. Il faut ajouter à cela, un cycle pour la synchronisation des signaux du bus i.MX. Cela nous fait donc un minimum de 3 cycles Wishbone pour un transfert entre le FPGA et l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
Etant donné les performances des FPGA actuels, on peut tabler sur une fréquence de fonctionnement d&#039;au moins 100MHz pour le bus Wishbone. Cela nous donne donc un taux de transfert approximatif de 66 Moctets/sec (100MHz * 16bits / 3).&lt;br /&gt;
&lt;br /&gt;
== La composition du système Wishbone ==&lt;br /&gt;
&lt;br /&gt;
[[Image:FPGA_Armadeus.png]]&lt;br /&gt;
&lt;br /&gt;
Le système Wishbone qui sera implanté dans le FPGA se compose des éléments suivants:&lt;br /&gt;
* &#039;&#039;&#039;i.MX Wrapper&#039;&#039;&#039;: L&#039;interface i.MX vers le bus Wishbone&lt;br /&gt;
* &#039;&#039;&#039;Syscon&#039;&#039;&#039;: Ce composant va gérer les signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; (généré par une PLL ou directement issu de l&#039;i.MX) et &#039;&#039;&#039;RESET&#039;&#039;&#039; (synchrone).&lt;br /&gt;
* &#039;&#039;&#039;Intercon&#039;&#039;&#039;: Ce composant devra être généré automatiquement par une moulinette, il va faire le lien entre tous les composants faisant parti du &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Gestionnaire d&#039;interruption&#039;&#039;&#039;: Ce composant est un &#039;&#039;&#039;esclave wishbone&#039;&#039;&#039; et va centraliser toutes les demandes d&#039;interruption et les remonter vers l&#039;i.MX.&lt;br /&gt;
* &#039;&#039;&#039;Esclaves whisbone&#039;&#039;&#039;: Ceci représentent tous les autres composants avec une interface wishbone esclave qui sont accessibles via le wrapper i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur le diagramme, il manque un certain nombre de choses:&lt;br /&gt;
* Les signaux &#039;&#039;non wishbone&#039;&#039; en entrée ou en sortie sur les &#039;&#039;&#039;esclaves wishbone&#039;&#039;&#039;&lt;br /&gt;
* Le macro composant &#039;&#039;&#039;système wishbone&#039;&#039;&#039;. Ce macro composant est celui qui sera ensuite instancié dans le design du FPGA. Sur ce composant ne seront visibles que les signaux &#039;&#039;externes&#039;&#039; au système:&lt;br /&gt;
** Les signaux issus de l&#039;i.MX&lt;br /&gt;
** &amp;lt;strike&amp;gt;Le signal RESET (en entrée) qui sera synchronisé sur l&#039;horloge système&amp;lt;/strike&amp;gt; Le signal RESET synchrone du bus Wishbone sera directement généré par le composant syscon à l&#039;aide d&#039;une simple machine d&#039;état.&lt;br /&gt;
** Le signal CLK (en entrée) qui sera l&#039;horloge utilisée pour la génération des signaux Wishbone&lt;br /&gt;
** Le signal IRQ (en sortie) qui sera utilisé pour remonter les demandes d&#039;interruption vers l&#039;i.MX&lt;br /&gt;
** Les signaux d&#039;entrée et de sortie spécifiques aux autres composants connectés sur le bus Wishbone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt de créer le composant &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;, est que cela simplifie la vision dans l&#039;outil conception du FPGA. Il ne suffit plus alors qu&#039;à relier les signaux sur les broches correspondantes du FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== i.MX Wrapper ===&lt;br /&gt;
&lt;br /&gt;
Ce composant est le point d&#039;accès au bus Wishbone pour l&#039;i.MX et sera le seul à disposer d&#039;une interface Wishbone maitre.&lt;br /&gt;
&lt;br /&gt;
Les fonctions de ce composants sont:&lt;br /&gt;
* synchronisation des signaux issus de l&#039;i.MX. Ceci est primordial pour assurer la stabilité de tout le système Wishbone. De plus, le bus de sortie étant asynchrone (l&#039;horloge de génération des signaux n&#039;est pas véhiculée), la resynchronisation des signaux par rapport à l&#039;horloge du bus s&#039;impose.&lt;br /&gt;
* gestion du bus de données en 3 états.&lt;br /&gt;
* conversion des signaux de contrôle du bus i.MX en signaux Wishbone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syscom ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est le composant le plus simple du système &amp;lt;strike&amp;gt;, il ne fait que synchroniser le signal RESET en entrée avec le signal d&#039;horloge du système&amp;lt;/strike&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Il va être en charge de la génération du signal RESET synchrone pour le bus Wishbone.&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;horloge en entrée du composant &#039;&#039;&#039;syscon&#039;&#039;&#039; sera celui utilisé pour le fonctionnement du bus Wishbone. La fréquence du signal d&#039;horloge devra être assez élevée pour permettre le traitement des signaux issus de l&#039;i.MX. Cela va dépendre de la configuration du chip select utilisé (CS5).&lt;br /&gt;
&lt;br /&gt;
La source du signal d&#039;horloge reste encore à définir, les choix possibles sont:&lt;br /&gt;
* directement issu de l&#039;i.MX&lt;br /&gt;
* utilisation d&#039;un DCM du Spartan 3&lt;br /&gt;
&lt;br /&gt;
Le choix définitif dépendra principalement des essais &#039;&#039;grandeur nature&#039;&#039; lors de la génération des premiers systèmes whisbone durant la phase de mise en place des composants de base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Intercon ===&lt;br /&gt;
&lt;br /&gt;
Ce composant a la particularité qu&#039;il sera créé automatiquement par un outil (script ou programme). &#039;&#039;&#039;Intercom&#039;&#039;&#039; a comme fonctionnalités:&lt;br /&gt;
* Le décodage d&#039;adresse pour la sélection des différents esclaves du système&lt;br /&gt;
* Le routage des bus d&#039;adresses et de données vers les différents esclaves&lt;br /&gt;
* La génération des signaux de contrôle pour les différents esclaves.&lt;br /&gt;
&lt;br /&gt;
Etant donné les limitations induites par les erratas de l&#039;i.MX, le composant &#039;&#039;&#039;intercom&#039;&#039;&#039; remplira les fonctionnalités suivantes:&lt;br /&gt;
* le bus de données est figé sur 16 bits&lt;br /&gt;
* les cycles de lecture et d&#039;écriture sont de longueur fixe (à priori 3 cycles d&#039;horloge &#039;&#039;&#039;à valider&#039;&#039;&#039; lors des essais du système de base)&lt;br /&gt;
* une interruption est générée en cas de dépassement du temps de cycle d&#039;écriture ou de lecture&lt;br /&gt;
* le bus sera de type &#039;&#039;&#039;shared&#039;&#039;&#039; avec un seul maitre (le Wrapper i.MX).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les composants esclaves ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;Suite aux divers discussions issues de ce chapitre. L&#039;organisation et la présences des fichiers dans les répertoires &#039;&#039;&#039;doc&#039;&#039;&#039; et &#039;&#039;&#039;HAL&#039;&#039;&#039; n&#039;est pas encore établie. Ce chapitre sera encore à retravailler.&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;une IP puisse être facilement inclue dans le système, il faut une certaine organisation. Sinon, à moyen ou à long terme cette IP est morte parce qu&#039;elle sera difficilement exploitable et encore plus difficilement maintenable.&lt;br /&gt;
&lt;br /&gt;
Ce sont des notions qui ne sont pas simples à prendre en considération lors du développement d&#039;un nouveau projet, mais lorsque l&#039;on doit se replonger dans un travail fait par quelqu&#039;un d&#039;autre ou un projet qu&#039;on a laissé en sommeil pendant quelque temps, on est content d&#039;avoir quelque chose à quoi se raccrocher.&lt;br /&gt;
&lt;br /&gt;
Pour développer efficacement, il faut assurer une organisation logique, figée et compréhensible, et le plus simple dans ce genre de cas est de se baser sur la notion de répertoire. Voici les répertoires qui doivent être utilisés par une IP:&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: Ce répertoire va contenir toute la documentation nécessaire à l&#039;exploitation de l&#039;IP. On y trouvera une notice (&#039;&#039;&#039;readme.txt&#039;&#039;&#039;), un fichier de suivi de modification (&#039;&#039;&#039;ChangeLog.txt&#039;&#039;&#039;), un fichier contenant les évolutions futures prévues (&#039;&#039;&#039;todo.txt&#039;&#039;&#039;) ainsi que tout autre fichier estimé utile par le(s) créateur(s) de l&#039;IP.&lt;br /&gt;
* &#039;&#039;&#039;hdl&#039;&#039;&#039;: Ce répertoire va contenir tous les fichiers VHDL (ou Verilog) qui auront été développés spécifiquement pour cette IP.&lt;br /&gt;
* &#039;&#039;&#039;inc&#039;&#039;&#039;: Ce répertoire va contenir un fichier d&#039;en-tête ANSI C contenant l&#039;adresse de tous les registres interne de l&#039;IP pour permettre de créer simplement un programme en langage C permettant de contrôler l&#039;IP. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HAL&#039;&#039;&#039;: Ce répertoire va contenir un drivers ou un exemple de logiciel de base permettant l&#039;utilisation de l&#039;IP par un microprocesseur/contrôleur. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Ce composant esclave est le premier qui sera créé spécifiquement pour le système. Il sera capable de:&lt;br /&gt;
* prendre en compte jusqu&#039;à 16 sources d&#039;interruptions différentes&lt;br /&gt;
* réaliser l&#039;acquittement de chaque interruption individuellement&lt;br /&gt;
* masquer/autoriser chaque interruption individuellement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le composant disposera des registres suivants:&lt;br /&gt;
* &#039;&#039;&#039;isr_mask&#039;&#039;&#039;: registre d&#039;autorisation des interruptions. Chaque bit correspond à une interruption (bit0 =&amp;gt; IRQ0, bit1 =&amp;gt; IRQ1, etc.). Ce registre sera accessible en lecture et en écriture.&lt;br /&gt;
* &#039;&#039;&#039;isr_pend&#039;&#039;&#039;: ce registre est à double emploi&lt;br /&gt;
** &#039;&#039;&#039;en lecture&#039;&#039;&#039;: Les interruptions en attente de traitement&lt;br /&gt;
** &#039;&#039;&#039;en écriture&#039;&#039;&#039;: Acquittement des interruptions. Chaque bit à 1 va acquitter l&#039;interruption correspondante.&lt;br /&gt;
&lt;br /&gt;
== Le script / programme d&#039;assemblage des IP ==&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant parler du coeur du système, du moins de la partie la plus visible de l&#039;iceberg ;-)&lt;br /&gt;
&lt;br /&gt;
La première des priorités, sera de trouver un nom pour cet outil qui reste un peu dans l&#039;esprit du projet. Voici quelques propositions, à vous de compléter ou de voter pour un nom ou plusieurs noms:&lt;br /&gt;
* Concerto&lt;br /&gt;
* Orchestra&lt;br /&gt;
&lt;br /&gt;
D&#039;après les derniers sondage, &#039;&#039;&#039;Orchestra&#039;&#039;&#039; serait finalement le nom retenu pour ce logiciel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Principe et fonctionnement ===&lt;br /&gt;
&lt;br /&gt;
Afin de de rendre tout ce système utilisable par le plus grand nombre, il faut être capable de proposer des outils qui vont simplifier la vie de l&#039;utilisateur final ainsi que de l&#039;intégrateur.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faudra créer un outil soit sous forme de script(s), soit sous forme de programme(s) qui va permettre de réaliser les tâches suivantes:&lt;br /&gt;
* Création/gestion d&#039;une bibliothèque de composants &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* Gestion d&#039;une liste de &#039;&#039;&#039;hardware Armadeus&#039;&#039;&#039;&lt;br /&gt;
* Edition d&#039;un &#039;&#039;&#039;système Armadeus&#039;&#039;&#039;&lt;br /&gt;
* Gestion d&#039;un projet&lt;br /&gt;
* Génération automatique du composant &#039;&#039;&#039;system&#039;&#039;&#039; qui sera implanté dans le FPGA&lt;br /&gt;
* Génération automatique d&#039;un banc de tests pour permettre la validation par ModelSim (ou autre logiciel de simulation HDL)&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;mapping mémoire&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La bibliothèque de composants ===&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;un composant, c&#039;est-à-dire une IP, soit exploitable par le système, il faut passer par une phase d&#039;intégration qui va permettre de décrire ce composant:&lt;br /&gt;
* Nom de l&#039;IP&lt;br /&gt;
* Description&lt;br /&gt;
* Version&lt;br /&gt;
* Identification des fichiers HDL utilisés (VHDL ou Verilog)&lt;br /&gt;
* Identification du fichier &#039;&#039;&#039;Top&#039;&#039;&#039; (le point d&#039;entrée de l&#039;IP)&lt;br /&gt;
* Identification des paramètres &#039;&#039;&#039;&#039;&#039;GENERIC&#039;&#039;&#039;&#039;&#039; (dans le cas d&#039;une IP en VHDL):&lt;br /&gt;
** Type de paramètre (entier, std_logic, etc)&lt;br /&gt;
** Valeur par défaut&lt;br /&gt;
** Valeurs ou plages de valeurs autorisées&lt;br /&gt;
** Description du paramètre&lt;br /&gt;
* Identification des signaux Wishbone utilisés par le composant&lt;br /&gt;
* Identification du type (maitre ou esclave) et du nombre d&#039;interfaces Wishbone utilisés par ce composant&lt;br /&gt;
* Identification des registres internes&lt;br /&gt;
** Adresse (Offset par rapport à l&#039;adresse de base)&lt;br /&gt;
** Taille (8 ou 16 bits)&lt;br /&gt;
** Nom et/ou description&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toutes ces informations seront alors sauvegardées dans un fichier, de préférence dans un format compréhensible et lisible à l&#039;aide de n&#039;importe quel éditeur de texte (XML, &#039;&#039;fichier INI&#039;&#039; ou &#039;&#039;fichier plat&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque composant identifié par le logiciel se trouvera dans un sous-répertoire (ou dans un fichier archive ?!?) placé dans le répertoire &#039;&#039;&#039;Armadeus Components&#039;&#039;&#039;, chaque sous-répertoire (ou archive) de composant contiendra les données suivantes:&lt;br /&gt;
* Le fichier de description du composant &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* un répertoire &#039;&#039;&#039;HDL&#039;&#039;&#039; avec les fichiers VHDL/Verilog de l&#039;IP&lt;br /&gt;
* un répertoire &#039;&#039;&#039;HAL&#039;&#039;&#039; avec les fichiers d&#039;un drivers de base (pour Linux ou &#039;&#039;générique&#039;&#039; ?!?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le gestionnaire de composants Armadeus doit être capable de réaliser les opérations suivantes:&lt;br /&gt;
* Importer un composant ou une liste de composants&lt;br /&gt;
* Exporter un composant ou une liste de composants&lt;br /&gt;
* Gérer des versions de composants (à voir si cette fonctionnalité est importante/utile)&lt;br /&gt;
* Permettre l&#039;ajout/création de composants&lt;br /&gt;
* Permettre de supprimer un composant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire de plateformes ===&lt;br /&gt;
&lt;br /&gt;
Il faut avoir confiance dans l&#039;avenir, pour l&#039;instant nous ne disposons que d&#039;une seul plateforme de travail, mais ce n&#039;est qu&#039;un début et très certainement d&#039;autres cartes à base de l&#039;i.MX et d&#039;un FPGA vont voir le jour.&lt;br /&gt;
&lt;br /&gt;
Il faut donc prévoir d&#039;ores et déjà cette possibilité et proposer un outil qui va permettre de définir une plateforme. Chaque descripteur de plateforme devra fournir les informations suivantes:&lt;br /&gt;
* Type de FPGA&lt;br /&gt;
* Emplacement (niveau FPGA, c&#039;est-à-dire la broche utilisée), type (sortie i.MX, oscillateur ou quartz) et fréquence (ou plage de fréquence ?!?) des horloges&lt;br /&gt;
* Emplacements/broche du FPGA utilisées ainsi que leur fonctionnalité (signal Wishbone, comme d&#039;un composant externe, signal d&#039;interruption, etc.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toutes ces informations seront utilisées par la suite lors de la création d&#039;un projet &#039;&#039;&#039;Orchestra/Armadeus&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire de projet ===&lt;br /&gt;
&lt;br /&gt;
Le rôle du gestionnaire de projet est de permettre de créer, reprendre ou modifier le plus simplement possible une configuration du FPGA pour une carte donnée. Cette configuration sera appelée par la suite un &#039;&#039;&#039;système&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout &#039;&#039;&#039;système&#039;&#039;&#039; est entièrement décrit par un fichier projet qui contiendra les éléments suivants:&lt;br /&gt;
* Le nom du système (éventuellement le même que le nom du projet ?!?)&lt;br /&gt;
* Une description du système&lt;br /&gt;
* Le type de plateforme utilisé pour ce système&lt;br /&gt;
* La source de la fréquence d&#039;horloge du bus Wishbone (broche du FPGA ou DLL/DCM). On pourra éventuellement imaginer la création d&#039;un &#039;&#039;Wizard&#039;&#039; pour simplifier la configuration du DCM.&lt;br /&gt;
* La liste de tous les composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; inclus dans le système, avec pour chacun de ces composants, les détails suivantes:&lt;br /&gt;
** La référence du composant (par rapport à la bibliothèque de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;)&lt;br /&gt;
** Le nom de l&#039;instance du composant (e.g. UART1, PWM_MOTOR, etc.)&lt;br /&gt;
** La connexion des entrées/sorties (vers une broche du FPGA, non utilisé ou relié &#039;&#039;&#039;manuellement&#039;&#039;&#039;)&lt;br /&gt;
** L&#039;adresse du base de chacune de ses interfaces esclaves connectées au bus Wishbone&lt;br /&gt;
** La valeur de chaque paramètre &#039;&#039;&#039;GENERIC&#039;&#039;&#039; du composant&lt;br /&gt;
** L&#039;horloge utilisée (pour l&#039;instant ce sera toujours celle du bus Wishbone mais peut-être que plus tard ce ne sera plus forcément le cas ;-) )&lt;br /&gt;
** Le numéro d&#039;interruption attribué au composant, s&#039;il est capable de généré une demande d&#039;interruption&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme pour le fichier de description d&#039;un composant Armadeus, le fichier projet devra être dans un format texte compréhensible et lisible à l&#039;aide de n&#039;importe quel éditeur texte (XML, &#039;&#039;fichier INI&#039;&#039; ou &#039;&#039;fichier plat&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le fichier projet est le coeur du système et, à partir de celui-ci ainsi que de la librairie de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; + la librairie de plateforme, toute la partie liée au FPGA doit pouvoir être recrée. Bref c&#039;est le seul fichier dont l&#039;utilisateur final aura à ce soucier (sauvegarde, archivage, etc).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la création d&#039;un nouveau projet, l&#039;utilisateur devra fournir les éléments de base suivants:&lt;br /&gt;
* Le nom du système&lt;br /&gt;
* Une description&lt;br /&gt;
* Le type de plateforme utilisé&lt;br /&gt;
* La source de l&#039;horloge Wishbone (broche du FPGA ou DCM) avec éventuellement un &#039;&#039;wizard&#039;&#039; pour la saisie des informations relatives à la programmation du DCM.&lt;br /&gt;
* La fréquence du bus Wishbone (éventuellement obtenue automatiquement à partir de la sélection de la source de l&#039;horloge)&lt;br /&gt;
* Le nombre de sources d&#039;interruptions autorisées ainsi que l&#039;emplacement en mémoire des registres du gestionnaire d&#039;interruption (par défaut à l&#039;adresse 0x0000).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois que le projet aura été créer, les composants suivants seront ajouté automatiquement au système:&lt;br /&gt;
* Un &#039;&#039;&#039;Wrapper i.MX&#039;&#039;&#039; pour faire le lien avec l&#039;i.MX&lt;br /&gt;
* Un &#039;&#039;&#039;syscon&#039;&#039;&#039; pour la générations des signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; et &#039;&#039;&#039;RESET&#039;&#039;&#039; du bus Wishbone&lt;br /&gt;
* Un &#039;&#039;&#039;Gestionnaire d&#039;interruptions&#039;&#039;&#039; si le système doit être capable de remonter des demandes d&#039;interruption.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par la suite, l&#039;utilisateur pourra modifier le système de base à l&#039;aide des opérations suivantes:&lt;br /&gt;
* choisir dans la librairie un composant pour l&#039;ajouter au système&lt;br /&gt;
* modifier les paramètres d&#039;un composant du système&lt;br /&gt;
* modifier les caractéristiques du projet (nom, fréquence du bus Wishbone, etc.)&lt;br /&gt;
* supprimer un composant du système&lt;br /&gt;
* attribution automatique des adresses de base sur le bus Wishbone&lt;br /&gt;
* attribution automatique des numéros d&#039;interruption&lt;br /&gt;
* annulation des dernières modifications (éventuellement)&lt;br /&gt;
* sauvegarde/restauration d&#039;un fichier projet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Générateur de fichiers ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici que va se trouver la partie la plus ardue du projet &#039;&#039;&#039;Orchestra&#039;&#039;&#039;, et c&#039;est en fonction de ce que l&#039;on sera capable de proposer à l&#039;utilisateur final que se fera l&#039;adhésion au projet ou non.&lt;br /&gt;
&lt;br /&gt;
Une fois que l&#039;on aura créer son projet/système Armadeus, il faut encore pouvoir générer au minimum le fichier &#039;&#039;&#039;bitstream&#039;&#039;&#039; qui va être utiliser pour configurer le FPGA.&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;entre en jeu le générateur de fichiers, qui devra être capable, à l&#039;aide du fichier projet + la librairie de composant + la librairie de plateforme, de générer le fichiers suivants:&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;Intercon&#039;&#039;&#039; reliant tous les composants placés dans le système qui a été créé par l&#039;utilisateur&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;system&#039;&#039;&#039; qui va englober tout le système Wishbone tel qu&#039;il a été défini par l&#039;utilisateur&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;system_tb&#039;&#039;&#039; et un fichier &#039;&#039;&#039;.DO&#039;&#039;&#039; qui vont pouvoir être utilisés pour la simulation à partir de ModelSim&lt;br /&gt;
* un fichier &#039;&#039;&#039;system.h&#039;&#039;&#039; qui va contenir le plan mémoire du système créé&lt;br /&gt;
* un fichier &#039;&#039;&#039;tcl&#039;&#039;&#039; qui va permettre de créer entièrement et de manière automatique le projet dans l&#039;environnement &#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;, c&#039;est-à-dire:&lt;br /&gt;
** sélection du bon FPGA&lt;br /&gt;
** sélection du bon format de sortie (bitstream)&lt;br /&gt;
** saisie du pinout du FPGA (nom de chaque broche par rapport au nom du signal sur le schéma)&lt;br /&gt;
** programmation du DCM le cas échéant&lt;br /&gt;
** définition des signaux d&#039;horloge&lt;br /&gt;
** inclusion des fichiers HDL nécessaires au projet&lt;br /&gt;
** instanciation du fichier HDL &#039;&#039;&#039;sytem&#039;&#039;&#039;&lt;br /&gt;
** connexion des entrées et sorties du composant &#039;&#039;&#039;system&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme on peut le voir, le travail pour &#039;&#039;&#039;Orchestra&#039;&#039;&#039; ne manque pas, reste encore la question du mode de développement ainsi que du langage et la bibliothèque graphique.&lt;br /&gt;
&lt;br /&gt;
Mais ceci est encore une autre histoire, qui pourra être débattu lorsque les premières composants système seront prêt à l&#039;emploi... Peut-être très bientôt :-)&lt;br /&gt;
&lt;br /&gt;
== Gestionnaire d&#039;interruption ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ce chapitre est donné à titre informatif/propositon et ne tiens pas lieu de spécification.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier la vie des programmeurs systèmes, il faut pouvoir offrir un mécanisme simple de mise en place et de gestion des demandes d&#039;interruption du FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour cela, je propose la solution suivante:&lt;br /&gt;
* Mise en place d&#039;un gestionnaire d&#039;interruption générique pour le FPGA. Ce gestionnaire d&#039;interruption sera capable de lire le registre d&#039;interruption (lecture de &#039;&#039;&#039;isr_pend&#039;&#039;&#039;) et de déterminer les interruptions à traiter (via &#039;&#039;&#039;isr_mask&#039;&#039;&#039;). Il va en suite aiguiller l&#039;exécution de la routine d&#039;interruption vers les routines adéquates pour chaque bit d&#039;interruption valide. L&#039;interruption traitée sera alors acquitée (écriture vers &#039;&#039;&#039;isr_pend&#039;&#039;&#039;).&lt;br /&gt;
* Création d&#039;une routine &#039;&#039;&#039;&#039;&#039;d&#039;enregistrement de vecteur d&#039;interruption&#039;&#039;&#039;&#039;&#039;. Cette routine va permettre d&#039;ajouter une routine de traitement d&#039;interruption pour un bit d&#039;interruption donné. Pour cela il faudra lui fournir les informations suivantes (via une structure ?!?):&lt;br /&gt;
** Le numéro du bit d&#039;interruption (0 à 31)&lt;br /&gt;
** La routine de traitement d&#039;interruption pour ce driver&lt;br /&gt;
** Un paramètre additionnel à fournir à la routine de traitement d&#039;interruption (pointeur de type &#039;&#039;&#039;&#039;&#039;void *&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
** Le nom du drivers (optionnel, permet d&#039;identifier/visualiser les drivers installer éventuellement)&lt;br /&gt;
* Création d&#039;une routine de validation d&#039;une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour masquer une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour désinstaller une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine ou méthode pour visualiser tous les drivers Wishbone installés:&lt;br /&gt;
** Leur numéro&lt;br /&gt;
** Leur nom&lt;br /&gt;
** Leur état (validé/masqué)&lt;br /&gt;
** Le nombre de fois qu&#039;ils ont été appelé&lt;br /&gt;
** etc.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1809</id>
		<title>FpgaArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1809"/>
		<updated>2006-12-29T17:12:14Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Evolutions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spécifications de conception du FPGA =&lt;br /&gt;
&lt;br /&gt;
== Evolutions ==&lt;br /&gt;
&lt;br /&gt;
2006/12/29: MAJ de la partie 1.7 pour décrire plus en détail le programme d&#039;assemblage des IP (Orchestra)&lt;br /&gt;
&lt;br /&gt;
2006/12/21: MAJ en fonction des remarques de tout le monde.&lt;br /&gt;
&lt;br /&gt;
== But ==&lt;br /&gt;
&lt;br /&gt;
Cette page a été créée pour permettre à tous les membres de l&#039;association de discuter de l&#039;architecture qui va être mise en place pour le FPGA présent sur la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Cette espace doit être vu comme un espace d&#039;échange d&#039;idées. Tout le monde est convié à y participer. Il est préférable d&#039;avoir quelques connaissances en électronique et sur les langages HDL (VHDL ou Verilog), mais ce n&#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
Bonne lecture et merci pour votre participation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les grandes lignes ==&lt;br /&gt;
&lt;br /&gt;
Le FPGA de la carte APF9328 est là pour offrir le maximum de souplesse au projet &#039;&#039;&#039;Armadeus&#039;&#039;&#039; et permettre d&#039;implanter des fonctionnalités coté &#039;&#039;&#039;matériel&#039;&#039;&#039; qui seraient trop pénalisantes ou impossibles à implanter coté &#039;&#039;&#039;logiciel&#039;&#039;&#039;. Bien entendu, pour que cela soit exploitable, il faut également disposer d&#039;un lien entre le FPGA et le processeur i.MX.&lt;br /&gt;
&lt;br /&gt;
Pour réaliser cela, il faut mettre en place un bus de communication entre le FPGA et l&#039;i.MX. Ce bus de communication va permettre le pilotage des fonctionnalités qui seront implantées dans le FPGA. Bref, il faut recréer à l&#039;intérieur du FPGA un bus tel qu&#039;il existe entre l&#039;i.MX et les différents composants de la carte (RAM, Flash, USB, Ethernet, etc.).&lt;br /&gt;
&lt;br /&gt;
Pour gagner en temps de développement et pour pouvoir récupérer des fonctionnalités ou IP (Intellectual Property) déjà existantes, le bus Wishbone a été retenu. Ce bus, dont les spécification ont été placées dans le domaine public, a été conçu spécifiquement pour ce genre de configuration et sur le site &#039;&#039;&#039;[http://www.opencores.com www.opencores.com]&#039;&#039;&#039; plusieurs IP compatibles avec les spécifications Wishbone sont disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
La spécification Wishbone décrit un certain nombre de composants de base:&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;maitres&#039;&#039;&#039;, ces interfaces sont implantés dans des composants qui seront alors capable d&#039;initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;esclaves&#039;&#039;&#039;, ces interfaces sont implantés dans des composants capables de répondre à des demandes de transferts&lt;br /&gt;
* Un composant &#039;&#039;&#039;syscon&#039;&#039;&#039;, ce composant va générer le signal d&#039;horloge qui sera utilisé par tous les composants/interfaces du bus ainsi que le signal de RESET synchrone.&lt;br /&gt;
* Un macro composant &#039;&#039;&#039;intercon&#039;&#039;&#039;, ce composant va gérer la connexion de toutes les interfaces maitres et esclaves qui composent le bus interne. Il prend en charge :&lt;br /&gt;
** Le décodage/transcodage d&#039;adresse (génération des signaux A0 à A3 selon le mode d&#039;adressage 8/16/32/64 bits)&lt;br /&gt;
** le routage du bus de données entre les différentes interfaces maitres et esclaves (conversion big endian/little endian, etc)&lt;br /&gt;
** le routage/génération des signaux de contrôle du bus (Read, Write, Chip Select, Output Enable, ACK, etc.)&lt;br /&gt;
* Un composant &#039;&#039;&#039;arbitre&#039;&#039;&#039;, ce composant va permettre de partager l&#039;accès au bus ou à un composant de type esclave qui est partagé par plusieurs composants de type maitre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les spécifications du bus Wishbone permettent de créer différents types de bus:&lt;br /&gt;
* &#039;&#039;&#039;Point to Point&#039;&#039;&#039;: C&#039;est le type de bus le plus simple possibl, un composant avec une interface type maitre connecté à un composant avec une interface de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Data Flow&#039;&#039;&#039;: C&#039;est un bus en cascade, à un bout on trouve un composant avec une interface de type maître et à l&#039;autre bout un composant avec une interface de type esclave. Entre les deux composant se trouve une chaine d&#039;un ou plusieurs composants avec une interface de type maitre et de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;: C&#039;est un bus sur lequel plusieurs composants sont connectés dessus. Tous les composants se partagent ce bus. Si plusieurs &#039;&#039;maitres&#039;&#039; sont connectés sur ce bus, un seul pourra initier un transfert à un instant donné.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: C&#039;est également un bus de type partagé, par contre dans se cas, on dispose de plusieurs bus. Chaque maitre utilise sont propre bus pour communiquer avec ces esclaves. On peut donc avoir plusieurs transferts en simultané. Le seul cas de blocage/arbitrage est le transfert de plusieurs maitre avec le même esclave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe également un certain nombre de mécanismes dans la spécification Wishbone pour permettre d&#039;optimiser les temps de transferts sur le bus. Ces optimisations sont de plusieurs nature:&lt;br /&gt;
* utilisation de signaux &#039;&#039;&#039;ACK&#039;&#039;&#039;, &#039;&#039;&#039;ERR&#039;&#039;&#039; et &#039;&#039;&#039;RTY&#039;&#039;&#039; pour signaler la fin de transfert&lt;br /&gt;
* les &#039;&#039;&#039;Registered Feedback Bus Cycles&#039;&#039;&#039;, qui permettent de gagner un cycle d&#039;horloge pour des transferts consécutifs&lt;br /&gt;
* les transferts en mode &#039;&#039;&#039;Burst&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Le lien i.MX &amp;lt;=&amp;gt; FPGA ==&lt;br /&gt;
&lt;br /&gt;
La communication entre l&#039;i.MX et le FPGA passe par les signaux suivants (à vérifier):&lt;br /&gt;
* des signaux de contrôle: &amp;lt;strike&amp;gt;RW_n&amp;lt;/strike&amp;gt;, OE_n, EB_n[3..2] et CS1_n&lt;br /&gt;
* le bus de données sur 16 bits (D[15..0])&lt;br /&gt;
* le bus d&#039;adresses sur 12 bits (A[12..1])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ces signaux sont alors utilisés pour créer une interface Wishbone maitre qui va permettre de communiquer efficacement avec les autres IPs contenus dans le FPGA qui implémenterons une interface wishbone de type esclave.&lt;br /&gt;
&lt;br /&gt;
Etant donné les erratas du composant i.MX  concernant le signal DTACK, il n&#039;est pas possible d&#039;implanter une interface Wishbone maitre &#039;&#039;classique&#039;&#039;. Ceci entraine les limitations suivantes:&lt;br /&gt;
* Pas possible d&#039;utiliser le signal &#039;&#039;&#039;ACK&#039;&#039;&#039; Wishbone pour terminer le transfert entre FPGA et i.MX.&lt;br /&gt;
* Pas possible de mettre en place des optimisations du temps de transfert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce problème, il faudra s&#039;assurer que toutes les interfaces esclaves qui seront connectées à l&#039;interface maitre du composant Wishbone i.MX répondent dans un temps fixe donné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme le bus Wishbone est un bus entièrement synchrone, le temps minimal d&#039;un transfert est de 2 cycles de l&#039;horloge Wishbone. Il faut ajouter à cela, un cycle pour la synchronisation des signaux du bus i.MX. Cela nous fait donc un minimum de 3 cycles Wishbone pour un transfert entre le FPGA et l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
Etant donné les performances des FPGA actuels, on peut tabler sur une fréquence de fonctionnement d&#039;au moins 100MHz pour le bus Wishbone. Cela nous donne donc un taux de transfert approximatif de 66 Moctets/sec (100MHz * 16bits / 3).&lt;br /&gt;
&lt;br /&gt;
== La composition du système Wishbone ==&lt;br /&gt;
&lt;br /&gt;
[[Image:FPGA_Armadeus.png]]&lt;br /&gt;
&lt;br /&gt;
Le système Wishbone qui sera implanté dans le FPGA se compose des éléments suivants:&lt;br /&gt;
* &#039;&#039;&#039;i.MX Wrapper&#039;&#039;&#039;: L&#039;interface i.MX vers le bus Wishbone&lt;br /&gt;
* &#039;&#039;&#039;Syscon&#039;&#039;&#039;: Ce composant va gérer les signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; (généré par une PLL ou directement issu de l&#039;i.MX) et &#039;&#039;&#039;RESET&#039;&#039;&#039; (synchrone).&lt;br /&gt;
* &#039;&#039;&#039;Intercon&#039;&#039;&#039;: Ce composant devra être généré automatiquement par une moulinette, il va faire le lien entre tous les composants faisant parti du &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Gestionnaire d&#039;interruption&#039;&#039;&#039;: Ce composant est un &#039;&#039;&#039;esclave wishbone&#039;&#039;&#039; et va centraliser toutes les demandes d&#039;interruption et les remonter vers l&#039;i.MX.&lt;br /&gt;
* &#039;&#039;&#039;Esclaves whisbone&#039;&#039;&#039;: Ceci représentent tous les autres composants avec une interface wishbone esclave qui sont accessibles via le wrapper i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur le diagramme, il manque un certain nombre de choses:&lt;br /&gt;
* Les signaux &#039;&#039;non wishbone&#039;&#039; en entrée ou en sortie sur les &#039;&#039;&#039;esclaves wishbone&#039;&#039;&#039;&lt;br /&gt;
* Le macro composant &#039;&#039;&#039;système wishbone&#039;&#039;&#039;. Ce macro composant est celui qui sera ensuite instancié dans le design du FPGA. Sur ce composant ne seront visibles que les signaux &#039;&#039;externes&#039;&#039; au système:&lt;br /&gt;
** Les signaux issus de l&#039;i.MX&lt;br /&gt;
** &amp;lt;strike&amp;gt;Le signal RESET (en entrée) qui sera synchronisé sur l&#039;horloge système&amp;lt;/strike&amp;gt; Le signal RESET synchrone du bus Wishbone sera directement généré par le composant syscon à l&#039;aide d&#039;une simple machine d&#039;état.&lt;br /&gt;
** Le signal CLK (en entrée) qui sera l&#039;horloge utilisée pour la génération des signaux Wishbone&lt;br /&gt;
** Le signal IRQ (en sortie) qui sera utilisé pour remonter les demandes d&#039;interruption vers l&#039;i.MX&lt;br /&gt;
** Les signaux d&#039;entrée et de sortie spécifiques aux autres composants connectés sur le bus Wishbone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt de créer le composant &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;, est que cela simplifie la vision dans l&#039;outil conception du FPGA. Il ne suffit plus alors qu&#039;à relier les signaux sur les broches correspondantes du FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== i.MX Wrapper ===&lt;br /&gt;
&lt;br /&gt;
Ce composant est le point d&#039;accès au bus Wishbone pour l&#039;i.MX et sera le seul à disposer d&#039;une interface Wishbone maitre.&lt;br /&gt;
&lt;br /&gt;
Les fonctions de ce composants sont:&lt;br /&gt;
* synchronisation des signaux issus de l&#039;i.MX. Ceci est primordial pour assurer la stabilité de tout le système Wishbone. De plus, le bus de sortie étant asynchrone (l&#039;horloge de génération des signaux n&#039;est pas véhiculée), la resynchronisation des signaux par rapport à l&#039;horloge du bus s&#039;impose.&lt;br /&gt;
* gestion du bus de données en 3 états.&lt;br /&gt;
* conversion des signaux de contrôle du bus i.MX en signaux Wishbone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syscom ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est le composant le plus simple du système &amp;lt;strike&amp;gt;, il ne fait que synchroniser le signal RESET en entrée avec le signal d&#039;horloge du système&amp;lt;/strike&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Il va être en charge de la génération du signal RESET synchrone pour le bus Wishbone.&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;horloge en entrée du composant &#039;&#039;&#039;syscon&#039;&#039;&#039; sera celui utilisé pour le fonctionnement du bus Wishbone. La fréquence du signal d&#039;horloge devra être assez élevée pour permettre le traitement des signaux issus de l&#039;i.MX. Cela va dépendre de la configuration du chip select utilisé (CS5).&lt;br /&gt;
&lt;br /&gt;
La source du signal d&#039;horloge reste encore à définir, les choix possibles sont:&lt;br /&gt;
* directement issu de l&#039;i.MX&lt;br /&gt;
* utilisation d&#039;un DCM du Spartan 3&lt;br /&gt;
&lt;br /&gt;
Le choix définitif dépendra principalement des essais &#039;&#039;grandeur nature&#039;&#039; lors de la génération des premiers systèmes whisbone durant la phase de mise en place des composants de base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Intercon ===&lt;br /&gt;
&lt;br /&gt;
Ce composant a la particularité qu&#039;il sera créé automatiquement par un outil (script ou programme). &#039;&#039;&#039;Intercom&#039;&#039;&#039; a comme fonctionnalités:&lt;br /&gt;
* Le décodage d&#039;adresse pour la sélection des différents esclaves du système&lt;br /&gt;
* Le routage des bus d&#039;adresses et de données vers les différents esclaves&lt;br /&gt;
* La génération des signaux de contrôle pour les différents esclaves.&lt;br /&gt;
&lt;br /&gt;
Etant donné les limitations induites par les erratas de l&#039;i.MX, le composant &#039;&#039;&#039;intercom&#039;&#039;&#039; remplira les fonctionnalités suivantes:&lt;br /&gt;
* le bus de données est figé sur 16 bits&lt;br /&gt;
* les cycles de lecture et d&#039;écriture sont de longueur fixe (à priori 3 cycles d&#039;horloge &#039;&#039;&#039;à valider&#039;&#039;&#039; lors des essais du système de base)&lt;br /&gt;
* une interruption est générée en cas de dépassement du temps de cycle d&#039;écriture ou de lecture&lt;br /&gt;
* le bus sera de type &#039;&#039;&#039;shared&#039;&#039;&#039; avec un seul maitre (le Wrapper i.MX).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les composants esclaves ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;Suite aux divers discussions issues de ce chapitre. L&#039;organisation et la présences des fichiers dans les répertoires &#039;&#039;&#039;doc&#039;&#039;&#039; et &#039;&#039;&#039;HAL&#039;&#039;&#039; n&#039;est pas encore établie. Ce chapitre sera encore à retravailler.&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;une IP puisse être facilement inclue dans le système, il faut une certaine organisation. Sinon, à moyen ou à long terme cette IP est morte parce qu&#039;elle sera difficilement exploitable et encore plus difficilement maintenable.&lt;br /&gt;
&lt;br /&gt;
Ce sont des notions qui ne sont pas simples à prendre en considération lors du développement d&#039;un nouveau projet, mais lorsque l&#039;on doit se replonger dans un travail fait par quelqu&#039;un d&#039;autre ou un projet qu&#039;on a laissé en sommeil pendant quelque temps, on est content d&#039;avoir quelque chose à quoi se raccrocher.&lt;br /&gt;
&lt;br /&gt;
Pour développer efficacement, il faut assurer une organisation logique, figée et compréhensible, et le plus simple dans ce genre de cas est de se baser sur la notion de répertoire. Voici les répertoires qui doivent être utilisés par une IP:&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: Ce répertoire va contenir toute la documentation nécessaire à l&#039;exploitation de l&#039;IP. On y trouvera une notice (&#039;&#039;&#039;readme.txt&#039;&#039;&#039;), un fichier de suivi de modification (&#039;&#039;&#039;ChangeLog.txt&#039;&#039;&#039;), un fichier contenant les évolutions futures prévues (&#039;&#039;&#039;todo.txt&#039;&#039;&#039;) ainsi que tout autre fichier estimé utile par le(s) créateur(s) de l&#039;IP.&lt;br /&gt;
* &#039;&#039;&#039;hdl&#039;&#039;&#039;: Ce répertoire va contenir tous les fichiers VHDL (ou Verilog) qui auront été développés spécifiquement pour cette IP.&lt;br /&gt;
* &#039;&#039;&#039;inc&#039;&#039;&#039;: Ce répertoire va contenir un fichier d&#039;en-tête ANSI C contenant l&#039;adresse de tous les registres interne de l&#039;IP pour permettre de créer simplement un programme en langage C permettant de contrôler l&#039;IP. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HAL&#039;&#039;&#039;: Ce répertoire va contenir un drivers ou un exemple de logiciel de base permettant l&#039;utilisation de l&#039;IP par un microprocesseur/contrôleur. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Ce composant esclave est le premier qui sera créé spécifiquement pour le système. Il sera capable de:&lt;br /&gt;
* prendre en compte jusqu&#039;à 16 sources d&#039;interruptions différentes&lt;br /&gt;
* réaliser l&#039;acquittement de chaque interruption individuellement&lt;br /&gt;
* masquer/autoriser chaque interruption individuellement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le composant disposera des registres suivants:&lt;br /&gt;
* &#039;&#039;&#039;isr_mask&#039;&#039;&#039;: registre d&#039;autorisation des interruptions. Chaque bit correspond à une interruption (bit0 =&amp;gt; IRQ0, bit1 =&amp;gt; IRQ1, etc.). Ce registre sera accessible en lecture et en écriture.&lt;br /&gt;
* &#039;&#039;&#039;isr_pend&#039;&#039;&#039;: ce registre est à double emploi&lt;br /&gt;
** &#039;&#039;&#039;en lecture&#039;&#039;&#039;: Les interruptions en attente de traitement&lt;br /&gt;
** &#039;&#039;&#039;en écriture&#039;&#039;&#039;: Acquittement des interruptions. Chaque bit à 1 va acquitter l&#039;interruption correspondante.&lt;br /&gt;
&lt;br /&gt;
== Le script / programme d&#039;assemblage des IP ==&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant parler du coeur du système, du moins de la partie la plus visible de l&#039;iceberg ;-)&lt;br /&gt;
&lt;br /&gt;
La première des priorités, sera de trouver un nom pour cet outil qui reste un peu dans l&#039;esprit du projet. Voici quelques propositions, à vous de compléter ou de voter pour un nom ou plusieurs noms:&lt;br /&gt;
* Concerto&lt;br /&gt;
* Orchestra&lt;br /&gt;
&lt;br /&gt;
D&#039;après les derniers sondage, &#039;&#039;&#039;Orchestra&#039;&#039;&#039; serait finalement le nom retenu pour ce logiciel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Principe et fonctionnement ===&lt;br /&gt;
&lt;br /&gt;
Afin de de rendre tout ce système utilisable par le plus grand nombre, il faut être capable de proposer des outils qui vont simplifier la vie de l&#039;utilisateur final ainsi que de l&#039;intégrateur.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faudra créer un outil soit sous forme de script(s), soit sous forme de programme(s) qui va permettre de réaliser les tâches suivantes:&lt;br /&gt;
* Création/gestion d&#039;une bibliothèque de composants &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* Gestion d&#039;une liste de &#039;&#039;&#039;hardware Armadeus&#039;&#039;&#039;&lt;br /&gt;
* Edition d&#039;un &#039;&#039;&#039;système Armadeus&#039;&#039;&#039;&lt;br /&gt;
* Gestion d&#039;un projet&lt;br /&gt;
* Génération automatique du composant &#039;&#039;&#039;system&#039;&#039;&#039; qui sera implanté dans le FPGA&lt;br /&gt;
* Génération automatique d&#039;un banc de tests pour permettre la validation par ModelSim (ou autre logiciel de simulation HDL)&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;mapping mémoire&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La bibliothèque de composants ===&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;un composant, c&#039;est-à-dire une IP, soit exploitable par le système, il faut passer par une phase d&#039;intégration qui va permettre de décrire ce composant:&lt;br /&gt;
* Nom de l&#039;IP&lt;br /&gt;
* Description&lt;br /&gt;
* Version&lt;br /&gt;
* Identification des fichiers HDL utilisés (VHDL ou Verilog)&lt;br /&gt;
* Identification du fichier &#039;&#039;&#039;Top&#039;&#039;&#039; (le point d&#039;entrée de l&#039;IP)&lt;br /&gt;
* Identification des paramètres &#039;&#039;&#039;&#039;&#039;GENERIC&#039;&#039;&#039;&#039;&#039; (dans le cas d&#039;une IP en VHDL):&lt;br /&gt;
** Type de paramètre (entier, std_logic, etc)&lt;br /&gt;
** Valeur par défaut&lt;br /&gt;
** Valeurs ou plages de valeurs autorisées&lt;br /&gt;
** Description du paramètre&lt;br /&gt;
* Identification des signaux Wishbone utilisés par le composant&lt;br /&gt;
* Identification du type (maitre ou esclave) et du nombre d&#039;interfaces Wishbone utilisés par ce composant&lt;br /&gt;
* Identification des registres internes&lt;br /&gt;
** Adresse (Offset par rapport à l&#039;adresse de base)&lt;br /&gt;
** Taille (8 ou 16 bits)&lt;br /&gt;
** Nom et/ou description&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toutes ces informations seront alors sauvegardées dans un fichier, de préférence dans un format compréhensible et lisible à l&#039;aide de n&#039;importe quel éditeur de texte (XML, &#039;&#039;fichier INI&#039;&#039; ou &#039;&#039;fichier plat&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque composant identifié par le logiciel se trouvera dans un sous-répertoire (ou dans un fichier archive ?!?) placé dans le répertoire &#039;&#039;&#039;Armadeus Components&#039;&#039;&#039;, chaque sous-répertoire (ou archive) de composant contiendra les données suivantes:&lt;br /&gt;
* Le fichier de description du composant &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* un répertoire &#039;&#039;&#039;HDL&#039;&#039;&#039; avec les fichiers VHDL/Verilog de l&#039;IP&lt;br /&gt;
* un répertoire &#039;&#039;&#039;HAL&#039;&#039;&#039; avec les fichiers d&#039;un drivers de base (pour Linux ou &#039;&#039;générique&#039;&#039; ?!?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le gestionnaire de composants Armadeus doit être capable de réaliser les opérations suivantes:&lt;br /&gt;
* Importer un composant ou une liste de composants&lt;br /&gt;
* Exporter un composant ou une liste de composants&lt;br /&gt;
* Gérer des versions de composants (à voir si cette fonctionnalité est importante/utile)&lt;br /&gt;
* Permettre l&#039;ajout/création de composants&lt;br /&gt;
* Permettre de supprimer un composant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire de plateformes ===&lt;br /&gt;
&lt;br /&gt;
Il faut avoir confiance dans l&#039;avenir, pour l&#039;instant nous ne disposons que d&#039;une seul plateforme de travail, mais ce n&#039;est qu&#039;un début et très certainement d&#039;autres cartes à base de l&#039;i.MX et d&#039;un FPGA vont voir le jour.&lt;br /&gt;
&lt;br /&gt;
Il faut donc prévoir d&#039;ores et déjà cette possibilité et proposer un outil qui va permettre de définir une plateforme. Chaque descripteur de plateforme devra fournir les informations suivantes:&lt;br /&gt;
* Type de FPGA&lt;br /&gt;
* Emplacement (niveau FPGA, c&#039;est-à-dire la broche utilisée), type (sortie i.MX, oscillateur ou quartz) et fréquence (ou plage de fréquence ?!?) des horloges&lt;br /&gt;
* Emplacements/broche du FPGA utilisées ainsi que leur fonctionnalité (signal Wishbone, comme d&#039;un composant externe, signal d&#039;interruption, etc.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toutes ces informations seront utilisées par la suite lors de la création d&#039;un projet &#039;&#039;&#039;Orchestra/Armadeus&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire de projet ===&lt;br /&gt;
&lt;br /&gt;
Le rôle du gestionnaire de projet est de permettre de créer, reprendre ou modifier le plus simplement possible une configuration du FPGA pour une carte donnée. Cette configuration sera appelée par la suite un &#039;&#039;&#039;système&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout &#039;&#039;&#039;système&#039;&#039;&#039; est entièrement décrit par un fichier projet qui contiendra les éléments suivants:&lt;br /&gt;
* Le nom du système (éventuellement le même que le nom du projet ?!?)&lt;br /&gt;
* Une description du système&lt;br /&gt;
* Le type de plateforme utilisé pour ce système&lt;br /&gt;
* La source de la fréquence d&#039;horloge du bus Wishbone (broche du FPGA ou DLL/DCM). On pourra éventuellement imaginer la création d&#039;un &#039;&#039;Wizard&#039;&#039; pour simplifier la configuration du DCM.&lt;br /&gt;
* La liste de tous les composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; inclus dans le système, avec pour chacun de ces composants, les détails suivantes:&lt;br /&gt;
** La référence du composant (par rapport à la bibliothèque de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;)&lt;br /&gt;
** Le nom de l&#039;instance du composant (e.g. UART1, PWM_MOTOR, etc.)&lt;br /&gt;
** La connexion des entrées/sorties (vers une broche du FPGA, non utilisé ou relié &#039;&#039;&#039;manuellement&#039;&#039;&#039;)&lt;br /&gt;
** L&#039;adresse du base de chacune de ses interfaces esclaves connectées au bus Wishbone&lt;br /&gt;
** La valeur de chaque paramètre &#039;&#039;&#039;GENERIC&#039;&#039;&#039; du composant&lt;br /&gt;
** L&#039;horloge utilisée (pour l&#039;instant ce sera toujours celle du bus Wishbone mais peut-être que plus tard ce ne sera plus forcément le cas ;-) )&lt;br /&gt;
** Le numéro d&#039;interruption attribué au composant, s&#039;il est capable de généré une demande d&#039;interruption&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme pour le fichier de description d&#039;un composant Armadeus, le fichier projet devra être dans un format texte compréhensible et lisible à l&#039;aide de n&#039;importe quel éditeur texte (XML, &#039;&#039;fichier INI&#039;&#039; ou &#039;&#039;fichier plat&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le fichier projet est le coeur du système et, à partir de celui-ci ainsi que de la librairie de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; + la librairie de plateforme, toute la partie liée au FPGA doit pouvoir être recrée. Bref c&#039;est le seul fichier dont l&#039;utilisateur final aura à ce soucier (sauvegarde, archivage, etc).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la création d&#039;un nouveau projet, l&#039;utilisateur devra fournir les éléments de base suivants:&lt;br /&gt;
* Le nom du système&lt;br /&gt;
* Une description&lt;br /&gt;
* Le type de plateforme utilisé&lt;br /&gt;
* La source de l&#039;horloge Wishbone (broche du FPGA ou DCM) avec éventuellement un &#039;&#039;wizard&#039;&#039; pour la saisie des informations relatives à la programmation du DCM.&lt;br /&gt;
* La fréquence du bus Wishbone (éventuellement obtenue automatiquement à partir de la sélection de la source de l&#039;horloge)&lt;br /&gt;
* Le nombre de sources d&#039;interruptions autorisées ainsi que l&#039;emplacement en mémoire des registres du gestionnaire d&#039;interruption (par défaut à l&#039;adresse 0x0000).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois que le projet aura été créer, les composants suivants seront ajouté automatiquement au système:&lt;br /&gt;
* Un &#039;&#039;&#039;Wrapper i.MX&#039;&#039;&#039; pour faire le lien avec l&#039;i.MX&lt;br /&gt;
* Un &#039;&#039;&#039;syscon&#039;&#039;&#039; pour la générations des signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; et &#039;&#039;&#039;RESET&#039;&#039;&#039; du bus Wishbone&lt;br /&gt;
* Un &#039;&#039;&#039;Gestionnaire d&#039;interruptions&#039;&#039;&#039; si le système doit être capable de remonter des demandes d&#039;interruption.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par la suite, l&#039;utilisateur pourra modifier le système de base à l&#039;aide des opérations suivantes:&lt;br /&gt;
* choisir dans la librairie un composant pour l&#039;ajouter au système&lt;br /&gt;
* modifier les paramètres d&#039;un composant du système&lt;br /&gt;
* modifier les caractéristiques du projet (nom, fréquence du bus Wishbone, etc.)&lt;br /&gt;
* supprimer un composant du système&lt;br /&gt;
* attribution automatique des adresses de base sur le bus Wishbone&lt;br /&gt;
* attribution automatique des numéros d&#039;interruption&lt;br /&gt;
* annulation des dernières modifications (éventuellement)&lt;br /&gt;
* sauvegarde/restauration d&#039;un fichier projet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Générateur de fichiers ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici que va se trouver la partie la plus ardue du projet &#039;&#039;&#039;Orchestra&#039;&#039;&#039;, et c&#039;est en fonction de ce que l&#039;on sera capable de proposer à l&#039;utilisateur final que se fera l&#039;adhésion au projet ou non.&lt;br /&gt;
&lt;br /&gt;
Une fois que l&#039;on aura créer son projet/système Armadeus, il faut encore pouvoir générer au minimum le fichier &#039;&#039;&#039;bitstream&#039;&#039;&#039; qui va être utiliser pour configurer le FPGA.&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;entre en jeu le générateur de fichiers, qui devra être capable, à l&#039;aide du fichier projet + la librairie de composant + la librairie de plateforme, de générer le fichiers suivants:&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;Intercon&#039;&#039;&#039; reliant tous les composants placés dans le système qui a été créé par l&#039;utilisateur&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;system&#039;&#039;&#039; qui va englober tout le système Wishbone tel qu&#039;il a été défini par l&#039;utilisateur&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;system_tb&#039;&#039;&#039; et un fichier &#039;&#039;&#039;.DO&#039;&#039;&#039; qui vont pouvoir être utilisés pour la simulation à partir de ModelSim&lt;br /&gt;
* un fichier &#039;&#039;&#039;tcl&#039;&#039;&#039; qui va permettre de créer entièrement et de manière automatique le projet dans l&#039;environnement &#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;, c&#039;est-à-dire:&lt;br /&gt;
** sélection du bon FPGA&lt;br /&gt;
** sélection du bon format de sortie (bitstream)&lt;br /&gt;
** saisie du pinout du FPGA (nom de chaque broche par rapport au nom du signal sur le schéma)&lt;br /&gt;
** programmation du DCM le cas échéant&lt;br /&gt;
** définition des signaux d&#039;horloge&lt;br /&gt;
** inclusion des fichiers HDL nécessaires au projet&lt;br /&gt;
** instanciation du fichier HDL &#039;&#039;&#039;sytem&#039;&#039;&#039;&lt;br /&gt;
** connexion des entrées et sorties du composant &#039;&#039;&#039;system&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme on peut le voir, le travail pour &#039;&#039;&#039;Orchestra&#039;&#039;&#039; ne manque pas, reste encore la question du mode de développement ainsi que du langage et la bibliothèque graphique.&lt;br /&gt;
&lt;br /&gt;
Mais ceci est encore une autre histoire, qui pourra être débattu lorsque les premières composants système seront prêt à l&#039;emploi... Peut-être très bientôt :-)&lt;br /&gt;
&lt;br /&gt;
== Gestionnaire d&#039;interruption ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ce chapitre est donné à titre informatif/propositon et ne tiens pas lieu de spécification.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier la vie des programmeurs systèmes, il faut pouvoir offrir un mécanisme simple de mise en place et de gestion des demandes d&#039;interruption du FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour cela, je propose la solution suivante:&lt;br /&gt;
* Mise en place d&#039;un gestionnaire d&#039;interruption générique pour le FPGA. Ce gestionnaire d&#039;interruption sera capable de lire le registre d&#039;interruption (lecture de &#039;&#039;&#039;isr_pend&#039;&#039;&#039;) et de déterminer les interruptions à traiter (via &#039;&#039;&#039;isr_mask&#039;&#039;&#039;). Il va en suite aiguiller l&#039;exécution de la routine d&#039;interruption vers les routines adéquates pour chaque bit d&#039;interruption valide. L&#039;interruption traitée sera alors acquitée (écriture vers &#039;&#039;&#039;isr_pend&#039;&#039;&#039;).&lt;br /&gt;
* Création d&#039;une routine &#039;&#039;&#039;&#039;&#039;d&#039;enregistrement de vecteur d&#039;interruption&#039;&#039;&#039;&#039;&#039;. Cette routine va permettre d&#039;ajouter une routine de traitement d&#039;interruption pour un bit d&#039;interruption donné. Pour cela il faudra lui fournir les informations suivantes (via une structure ?!?):&lt;br /&gt;
** Le numéro du bit d&#039;interruption (0 à 31)&lt;br /&gt;
** La routine de traitement d&#039;interruption pour ce driver&lt;br /&gt;
** Un paramètre additionnel à fournir à la routine de traitement d&#039;interruption (pointeur de type &#039;&#039;&#039;&#039;&#039;void *&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
** Le nom du drivers (optionnel, permet d&#039;identifier/visualiser les drivers installer éventuellement)&lt;br /&gt;
* Création d&#039;une routine de validation d&#039;une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour masquer une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour désinstaller une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine ou méthode pour visualiser tous les drivers Wishbone installés:&lt;br /&gt;
** Leur numéro&lt;br /&gt;
** Leur nom&lt;br /&gt;
** Leur état (validé/masqué)&lt;br /&gt;
** Le nombre de fois qu&#039;ils ont été appelé&lt;br /&gt;
** etc.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1808</id>
		<title>FpgaArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1808"/>
		<updated>2006-12-29T17:12:00Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Evolutions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spécifications de conception du FPGA =&lt;br /&gt;
&lt;br /&gt;
== Evolutions ==&lt;br /&gt;
&lt;br /&gt;
2006/12/29: MAJ de la partie 1.7 pour décrire plus en détail le programme d&#039;assemblage des IP (Orchestra)&lt;br /&gt;
2006/12/21: MAJ en fonction des remarques de tout le monde.&lt;br /&gt;
&lt;br /&gt;
== But ==&lt;br /&gt;
&lt;br /&gt;
Cette page a été créée pour permettre à tous les membres de l&#039;association de discuter de l&#039;architecture qui va être mise en place pour le FPGA présent sur la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Cette espace doit être vu comme un espace d&#039;échange d&#039;idées. Tout le monde est convié à y participer. Il est préférable d&#039;avoir quelques connaissances en électronique et sur les langages HDL (VHDL ou Verilog), mais ce n&#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
Bonne lecture et merci pour votre participation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les grandes lignes ==&lt;br /&gt;
&lt;br /&gt;
Le FPGA de la carte APF9328 est là pour offrir le maximum de souplesse au projet &#039;&#039;&#039;Armadeus&#039;&#039;&#039; et permettre d&#039;implanter des fonctionnalités coté &#039;&#039;&#039;matériel&#039;&#039;&#039; qui seraient trop pénalisantes ou impossibles à implanter coté &#039;&#039;&#039;logiciel&#039;&#039;&#039;. Bien entendu, pour que cela soit exploitable, il faut également disposer d&#039;un lien entre le FPGA et le processeur i.MX.&lt;br /&gt;
&lt;br /&gt;
Pour réaliser cela, il faut mettre en place un bus de communication entre le FPGA et l&#039;i.MX. Ce bus de communication va permettre le pilotage des fonctionnalités qui seront implantées dans le FPGA. Bref, il faut recréer à l&#039;intérieur du FPGA un bus tel qu&#039;il existe entre l&#039;i.MX et les différents composants de la carte (RAM, Flash, USB, Ethernet, etc.).&lt;br /&gt;
&lt;br /&gt;
Pour gagner en temps de développement et pour pouvoir récupérer des fonctionnalités ou IP (Intellectual Property) déjà existantes, le bus Wishbone a été retenu. Ce bus, dont les spécification ont été placées dans le domaine public, a été conçu spécifiquement pour ce genre de configuration et sur le site &#039;&#039;&#039;[http://www.opencores.com www.opencores.com]&#039;&#039;&#039; plusieurs IP compatibles avec les spécifications Wishbone sont disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
La spécification Wishbone décrit un certain nombre de composants de base:&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;maitres&#039;&#039;&#039;, ces interfaces sont implantés dans des composants qui seront alors capable d&#039;initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;esclaves&#039;&#039;&#039;, ces interfaces sont implantés dans des composants capables de répondre à des demandes de transferts&lt;br /&gt;
* Un composant &#039;&#039;&#039;syscon&#039;&#039;&#039;, ce composant va générer le signal d&#039;horloge qui sera utilisé par tous les composants/interfaces du bus ainsi que le signal de RESET synchrone.&lt;br /&gt;
* Un macro composant &#039;&#039;&#039;intercon&#039;&#039;&#039;, ce composant va gérer la connexion de toutes les interfaces maitres et esclaves qui composent le bus interne. Il prend en charge :&lt;br /&gt;
** Le décodage/transcodage d&#039;adresse (génération des signaux A0 à A3 selon le mode d&#039;adressage 8/16/32/64 bits)&lt;br /&gt;
** le routage du bus de données entre les différentes interfaces maitres et esclaves (conversion big endian/little endian, etc)&lt;br /&gt;
** le routage/génération des signaux de contrôle du bus (Read, Write, Chip Select, Output Enable, ACK, etc.)&lt;br /&gt;
* Un composant &#039;&#039;&#039;arbitre&#039;&#039;&#039;, ce composant va permettre de partager l&#039;accès au bus ou à un composant de type esclave qui est partagé par plusieurs composants de type maitre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les spécifications du bus Wishbone permettent de créer différents types de bus:&lt;br /&gt;
* &#039;&#039;&#039;Point to Point&#039;&#039;&#039;: C&#039;est le type de bus le plus simple possibl, un composant avec une interface type maitre connecté à un composant avec une interface de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Data Flow&#039;&#039;&#039;: C&#039;est un bus en cascade, à un bout on trouve un composant avec une interface de type maître et à l&#039;autre bout un composant avec une interface de type esclave. Entre les deux composant se trouve une chaine d&#039;un ou plusieurs composants avec une interface de type maitre et de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;: C&#039;est un bus sur lequel plusieurs composants sont connectés dessus. Tous les composants se partagent ce bus. Si plusieurs &#039;&#039;maitres&#039;&#039; sont connectés sur ce bus, un seul pourra initier un transfert à un instant donné.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: C&#039;est également un bus de type partagé, par contre dans se cas, on dispose de plusieurs bus. Chaque maitre utilise sont propre bus pour communiquer avec ces esclaves. On peut donc avoir plusieurs transferts en simultané. Le seul cas de blocage/arbitrage est le transfert de plusieurs maitre avec le même esclave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe également un certain nombre de mécanismes dans la spécification Wishbone pour permettre d&#039;optimiser les temps de transferts sur le bus. Ces optimisations sont de plusieurs nature:&lt;br /&gt;
* utilisation de signaux &#039;&#039;&#039;ACK&#039;&#039;&#039;, &#039;&#039;&#039;ERR&#039;&#039;&#039; et &#039;&#039;&#039;RTY&#039;&#039;&#039; pour signaler la fin de transfert&lt;br /&gt;
* les &#039;&#039;&#039;Registered Feedback Bus Cycles&#039;&#039;&#039;, qui permettent de gagner un cycle d&#039;horloge pour des transferts consécutifs&lt;br /&gt;
* les transferts en mode &#039;&#039;&#039;Burst&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Le lien i.MX &amp;lt;=&amp;gt; FPGA ==&lt;br /&gt;
&lt;br /&gt;
La communication entre l&#039;i.MX et le FPGA passe par les signaux suivants (à vérifier):&lt;br /&gt;
* des signaux de contrôle: &amp;lt;strike&amp;gt;RW_n&amp;lt;/strike&amp;gt;, OE_n, EB_n[3..2] et CS1_n&lt;br /&gt;
* le bus de données sur 16 bits (D[15..0])&lt;br /&gt;
* le bus d&#039;adresses sur 12 bits (A[12..1])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ces signaux sont alors utilisés pour créer une interface Wishbone maitre qui va permettre de communiquer efficacement avec les autres IPs contenus dans le FPGA qui implémenterons une interface wishbone de type esclave.&lt;br /&gt;
&lt;br /&gt;
Etant donné les erratas du composant i.MX  concernant le signal DTACK, il n&#039;est pas possible d&#039;implanter une interface Wishbone maitre &#039;&#039;classique&#039;&#039;. Ceci entraine les limitations suivantes:&lt;br /&gt;
* Pas possible d&#039;utiliser le signal &#039;&#039;&#039;ACK&#039;&#039;&#039; Wishbone pour terminer le transfert entre FPGA et i.MX.&lt;br /&gt;
* Pas possible de mettre en place des optimisations du temps de transfert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce problème, il faudra s&#039;assurer que toutes les interfaces esclaves qui seront connectées à l&#039;interface maitre du composant Wishbone i.MX répondent dans un temps fixe donné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme le bus Wishbone est un bus entièrement synchrone, le temps minimal d&#039;un transfert est de 2 cycles de l&#039;horloge Wishbone. Il faut ajouter à cela, un cycle pour la synchronisation des signaux du bus i.MX. Cela nous fait donc un minimum de 3 cycles Wishbone pour un transfert entre le FPGA et l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
Etant donné les performances des FPGA actuels, on peut tabler sur une fréquence de fonctionnement d&#039;au moins 100MHz pour le bus Wishbone. Cela nous donne donc un taux de transfert approximatif de 66 Moctets/sec (100MHz * 16bits / 3).&lt;br /&gt;
&lt;br /&gt;
== La composition du système Wishbone ==&lt;br /&gt;
&lt;br /&gt;
[[Image:FPGA_Armadeus.png]]&lt;br /&gt;
&lt;br /&gt;
Le système Wishbone qui sera implanté dans le FPGA se compose des éléments suivants:&lt;br /&gt;
* &#039;&#039;&#039;i.MX Wrapper&#039;&#039;&#039;: L&#039;interface i.MX vers le bus Wishbone&lt;br /&gt;
* &#039;&#039;&#039;Syscon&#039;&#039;&#039;: Ce composant va gérer les signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; (généré par une PLL ou directement issu de l&#039;i.MX) et &#039;&#039;&#039;RESET&#039;&#039;&#039; (synchrone).&lt;br /&gt;
* &#039;&#039;&#039;Intercon&#039;&#039;&#039;: Ce composant devra être généré automatiquement par une moulinette, il va faire le lien entre tous les composants faisant parti du &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Gestionnaire d&#039;interruption&#039;&#039;&#039;: Ce composant est un &#039;&#039;&#039;esclave wishbone&#039;&#039;&#039; et va centraliser toutes les demandes d&#039;interruption et les remonter vers l&#039;i.MX.&lt;br /&gt;
* &#039;&#039;&#039;Esclaves whisbone&#039;&#039;&#039;: Ceci représentent tous les autres composants avec une interface wishbone esclave qui sont accessibles via le wrapper i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur le diagramme, il manque un certain nombre de choses:&lt;br /&gt;
* Les signaux &#039;&#039;non wishbone&#039;&#039; en entrée ou en sortie sur les &#039;&#039;&#039;esclaves wishbone&#039;&#039;&#039;&lt;br /&gt;
* Le macro composant &#039;&#039;&#039;système wishbone&#039;&#039;&#039;. Ce macro composant est celui qui sera ensuite instancié dans le design du FPGA. Sur ce composant ne seront visibles que les signaux &#039;&#039;externes&#039;&#039; au système:&lt;br /&gt;
** Les signaux issus de l&#039;i.MX&lt;br /&gt;
** &amp;lt;strike&amp;gt;Le signal RESET (en entrée) qui sera synchronisé sur l&#039;horloge système&amp;lt;/strike&amp;gt; Le signal RESET synchrone du bus Wishbone sera directement généré par le composant syscon à l&#039;aide d&#039;une simple machine d&#039;état.&lt;br /&gt;
** Le signal CLK (en entrée) qui sera l&#039;horloge utilisée pour la génération des signaux Wishbone&lt;br /&gt;
** Le signal IRQ (en sortie) qui sera utilisé pour remonter les demandes d&#039;interruption vers l&#039;i.MX&lt;br /&gt;
** Les signaux d&#039;entrée et de sortie spécifiques aux autres composants connectés sur le bus Wishbone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt de créer le composant &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;, est que cela simplifie la vision dans l&#039;outil conception du FPGA. Il ne suffit plus alors qu&#039;à relier les signaux sur les broches correspondantes du FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== i.MX Wrapper ===&lt;br /&gt;
&lt;br /&gt;
Ce composant est le point d&#039;accès au bus Wishbone pour l&#039;i.MX et sera le seul à disposer d&#039;une interface Wishbone maitre.&lt;br /&gt;
&lt;br /&gt;
Les fonctions de ce composants sont:&lt;br /&gt;
* synchronisation des signaux issus de l&#039;i.MX. Ceci est primordial pour assurer la stabilité de tout le système Wishbone. De plus, le bus de sortie étant asynchrone (l&#039;horloge de génération des signaux n&#039;est pas véhiculée), la resynchronisation des signaux par rapport à l&#039;horloge du bus s&#039;impose.&lt;br /&gt;
* gestion du bus de données en 3 états.&lt;br /&gt;
* conversion des signaux de contrôle du bus i.MX en signaux Wishbone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syscom ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est le composant le plus simple du système &amp;lt;strike&amp;gt;, il ne fait que synchroniser le signal RESET en entrée avec le signal d&#039;horloge du système&amp;lt;/strike&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Il va être en charge de la génération du signal RESET synchrone pour le bus Wishbone.&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;horloge en entrée du composant &#039;&#039;&#039;syscon&#039;&#039;&#039; sera celui utilisé pour le fonctionnement du bus Wishbone. La fréquence du signal d&#039;horloge devra être assez élevée pour permettre le traitement des signaux issus de l&#039;i.MX. Cela va dépendre de la configuration du chip select utilisé (CS5).&lt;br /&gt;
&lt;br /&gt;
La source du signal d&#039;horloge reste encore à définir, les choix possibles sont:&lt;br /&gt;
* directement issu de l&#039;i.MX&lt;br /&gt;
* utilisation d&#039;un DCM du Spartan 3&lt;br /&gt;
&lt;br /&gt;
Le choix définitif dépendra principalement des essais &#039;&#039;grandeur nature&#039;&#039; lors de la génération des premiers systèmes whisbone durant la phase de mise en place des composants de base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Intercon ===&lt;br /&gt;
&lt;br /&gt;
Ce composant a la particularité qu&#039;il sera créé automatiquement par un outil (script ou programme). &#039;&#039;&#039;Intercom&#039;&#039;&#039; a comme fonctionnalités:&lt;br /&gt;
* Le décodage d&#039;adresse pour la sélection des différents esclaves du système&lt;br /&gt;
* Le routage des bus d&#039;adresses et de données vers les différents esclaves&lt;br /&gt;
* La génération des signaux de contrôle pour les différents esclaves.&lt;br /&gt;
&lt;br /&gt;
Etant donné les limitations induites par les erratas de l&#039;i.MX, le composant &#039;&#039;&#039;intercom&#039;&#039;&#039; remplira les fonctionnalités suivantes:&lt;br /&gt;
* le bus de données est figé sur 16 bits&lt;br /&gt;
* les cycles de lecture et d&#039;écriture sont de longueur fixe (à priori 3 cycles d&#039;horloge &#039;&#039;&#039;à valider&#039;&#039;&#039; lors des essais du système de base)&lt;br /&gt;
* une interruption est générée en cas de dépassement du temps de cycle d&#039;écriture ou de lecture&lt;br /&gt;
* le bus sera de type &#039;&#039;&#039;shared&#039;&#039;&#039; avec un seul maitre (le Wrapper i.MX).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les composants esclaves ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;Suite aux divers discussions issues de ce chapitre. L&#039;organisation et la présences des fichiers dans les répertoires &#039;&#039;&#039;doc&#039;&#039;&#039; et &#039;&#039;&#039;HAL&#039;&#039;&#039; n&#039;est pas encore établie. Ce chapitre sera encore à retravailler.&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;une IP puisse être facilement inclue dans le système, il faut une certaine organisation. Sinon, à moyen ou à long terme cette IP est morte parce qu&#039;elle sera difficilement exploitable et encore plus difficilement maintenable.&lt;br /&gt;
&lt;br /&gt;
Ce sont des notions qui ne sont pas simples à prendre en considération lors du développement d&#039;un nouveau projet, mais lorsque l&#039;on doit se replonger dans un travail fait par quelqu&#039;un d&#039;autre ou un projet qu&#039;on a laissé en sommeil pendant quelque temps, on est content d&#039;avoir quelque chose à quoi se raccrocher.&lt;br /&gt;
&lt;br /&gt;
Pour développer efficacement, il faut assurer une organisation logique, figée et compréhensible, et le plus simple dans ce genre de cas est de se baser sur la notion de répertoire. Voici les répertoires qui doivent être utilisés par une IP:&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: Ce répertoire va contenir toute la documentation nécessaire à l&#039;exploitation de l&#039;IP. On y trouvera une notice (&#039;&#039;&#039;readme.txt&#039;&#039;&#039;), un fichier de suivi de modification (&#039;&#039;&#039;ChangeLog.txt&#039;&#039;&#039;), un fichier contenant les évolutions futures prévues (&#039;&#039;&#039;todo.txt&#039;&#039;&#039;) ainsi que tout autre fichier estimé utile par le(s) créateur(s) de l&#039;IP.&lt;br /&gt;
* &#039;&#039;&#039;hdl&#039;&#039;&#039;: Ce répertoire va contenir tous les fichiers VHDL (ou Verilog) qui auront été développés spécifiquement pour cette IP.&lt;br /&gt;
* &#039;&#039;&#039;inc&#039;&#039;&#039;: Ce répertoire va contenir un fichier d&#039;en-tête ANSI C contenant l&#039;adresse de tous les registres interne de l&#039;IP pour permettre de créer simplement un programme en langage C permettant de contrôler l&#039;IP. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HAL&#039;&#039;&#039;: Ce répertoire va contenir un drivers ou un exemple de logiciel de base permettant l&#039;utilisation de l&#039;IP par un microprocesseur/contrôleur. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Ce composant esclave est le premier qui sera créé spécifiquement pour le système. Il sera capable de:&lt;br /&gt;
* prendre en compte jusqu&#039;à 16 sources d&#039;interruptions différentes&lt;br /&gt;
* réaliser l&#039;acquittement de chaque interruption individuellement&lt;br /&gt;
* masquer/autoriser chaque interruption individuellement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le composant disposera des registres suivants:&lt;br /&gt;
* &#039;&#039;&#039;isr_mask&#039;&#039;&#039;: registre d&#039;autorisation des interruptions. Chaque bit correspond à une interruption (bit0 =&amp;gt; IRQ0, bit1 =&amp;gt; IRQ1, etc.). Ce registre sera accessible en lecture et en écriture.&lt;br /&gt;
* &#039;&#039;&#039;isr_pend&#039;&#039;&#039;: ce registre est à double emploi&lt;br /&gt;
** &#039;&#039;&#039;en lecture&#039;&#039;&#039;: Les interruptions en attente de traitement&lt;br /&gt;
** &#039;&#039;&#039;en écriture&#039;&#039;&#039;: Acquittement des interruptions. Chaque bit à 1 va acquitter l&#039;interruption correspondante.&lt;br /&gt;
&lt;br /&gt;
== Le script / programme d&#039;assemblage des IP ==&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant parler du coeur du système, du moins de la partie la plus visible de l&#039;iceberg ;-)&lt;br /&gt;
&lt;br /&gt;
La première des priorités, sera de trouver un nom pour cet outil qui reste un peu dans l&#039;esprit du projet. Voici quelques propositions, à vous de compléter ou de voter pour un nom ou plusieurs noms:&lt;br /&gt;
* Concerto&lt;br /&gt;
* Orchestra&lt;br /&gt;
&lt;br /&gt;
D&#039;après les derniers sondage, &#039;&#039;&#039;Orchestra&#039;&#039;&#039; serait finalement le nom retenu pour ce logiciel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Principe et fonctionnement ===&lt;br /&gt;
&lt;br /&gt;
Afin de de rendre tout ce système utilisable par le plus grand nombre, il faut être capable de proposer des outils qui vont simplifier la vie de l&#039;utilisateur final ainsi que de l&#039;intégrateur.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faudra créer un outil soit sous forme de script(s), soit sous forme de programme(s) qui va permettre de réaliser les tâches suivantes:&lt;br /&gt;
* Création/gestion d&#039;une bibliothèque de composants &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* Gestion d&#039;une liste de &#039;&#039;&#039;hardware Armadeus&#039;&#039;&#039;&lt;br /&gt;
* Edition d&#039;un &#039;&#039;&#039;système Armadeus&#039;&#039;&#039;&lt;br /&gt;
* Gestion d&#039;un projet&lt;br /&gt;
* Génération automatique du composant &#039;&#039;&#039;system&#039;&#039;&#039; qui sera implanté dans le FPGA&lt;br /&gt;
* Génération automatique d&#039;un banc de tests pour permettre la validation par ModelSim (ou autre logiciel de simulation HDL)&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;mapping mémoire&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La bibliothèque de composants ===&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;un composant, c&#039;est-à-dire une IP, soit exploitable par le système, il faut passer par une phase d&#039;intégration qui va permettre de décrire ce composant:&lt;br /&gt;
* Nom de l&#039;IP&lt;br /&gt;
* Description&lt;br /&gt;
* Version&lt;br /&gt;
* Identification des fichiers HDL utilisés (VHDL ou Verilog)&lt;br /&gt;
* Identification du fichier &#039;&#039;&#039;Top&#039;&#039;&#039; (le point d&#039;entrée de l&#039;IP)&lt;br /&gt;
* Identification des paramètres &#039;&#039;&#039;&#039;&#039;GENERIC&#039;&#039;&#039;&#039;&#039; (dans le cas d&#039;une IP en VHDL):&lt;br /&gt;
** Type de paramètre (entier, std_logic, etc)&lt;br /&gt;
** Valeur par défaut&lt;br /&gt;
** Valeurs ou plages de valeurs autorisées&lt;br /&gt;
** Description du paramètre&lt;br /&gt;
* Identification des signaux Wishbone utilisés par le composant&lt;br /&gt;
* Identification du type (maitre ou esclave) et du nombre d&#039;interfaces Wishbone utilisés par ce composant&lt;br /&gt;
* Identification des registres internes&lt;br /&gt;
** Adresse (Offset par rapport à l&#039;adresse de base)&lt;br /&gt;
** Taille (8 ou 16 bits)&lt;br /&gt;
** Nom et/ou description&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toutes ces informations seront alors sauvegardées dans un fichier, de préférence dans un format compréhensible et lisible à l&#039;aide de n&#039;importe quel éditeur de texte (XML, &#039;&#039;fichier INI&#039;&#039; ou &#039;&#039;fichier plat&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque composant identifié par le logiciel se trouvera dans un sous-répertoire (ou dans un fichier archive ?!?) placé dans le répertoire &#039;&#039;&#039;Armadeus Components&#039;&#039;&#039;, chaque sous-répertoire (ou archive) de composant contiendra les données suivantes:&lt;br /&gt;
* Le fichier de description du composant &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* un répertoire &#039;&#039;&#039;HDL&#039;&#039;&#039; avec les fichiers VHDL/Verilog de l&#039;IP&lt;br /&gt;
* un répertoire &#039;&#039;&#039;HAL&#039;&#039;&#039; avec les fichiers d&#039;un drivers de base (pour Linux ou &#039;&#039;générique&#039;&#039; ?!?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le gestionnaire de composants Armadeus doit être capable de réaliser les opérations suivantes:&lt;br /&gt;
* Importer un composant ou une liste de composants&lt;br /&gt;
* Exporter un composant ou une liste de composants&lt;br /&gt;
* Gérer des versions de composants (à voir si cette fonctionnalité est importante/utile)&lt;br /&gt;
* Permettre l&#039;ajout/création de composants&lt;br /&gt;
* Permettre de supprimer un composant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire de plateformes ===&lt;br /&gt;
&lt;br /&gt;
Il faut avoir confiance dans l&#039;avenir, pour l&#039;instant nous ne disposons que d&#039;une seul plateforme de travail, mais ce n&#039;est qu&#039;un début et très certainement d&#039;autres cartes à base de l&#039;i.MX et d&#039;un FPGA vont voir le jour.&lt;br /&gt;
&lt;br /&gt;
Il faut donc prévoir d&#039;ores et déjà cette possibilité et proposer un outil qui va permettre de définir une plateforme. Chaque descripteur de plateforme devra fournir les informations suivantes:&lt;br /&gt;
* Type de FPGA&lt;br /&gt;
* Emplacement (niveau FPGA, c&#039;est-à-dire la broche utilisée), type (sortie i.MX, oscillateur ou quartz) et fréquence (ou plage de fréquence ?!?) des horloges&lt;br /&gt;
* Emplacements/broche du FPGA utilisées ainsi que leur fonctionnalité (signal Wishbone, comme d&#039;un composant externe, signal d&#039;interruption, etc.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toutes ces informations seront utilisées par la suite lors de la création d&#039;un projet &#039;&#039;&#039;Orchestra/Armadeus&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire de projet ===&lt;br /&gt;
&lt;br /&gt;
Le rôle du gestionnaire de projet est de permettre de créer, reprendre ou modifier le plus simplement possible une configuration du FPGA pour une carte donnée. Cette configuration sera appelée par la suite un &#039;&#039;&#039;système&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout &#039;&#039;&#039;système&#039;&#039;&#039; est entièrement décrit par un fichier projet qui contiendra les éléments suivants:&lt;br /&gt;
* Le nom du système (éventuellement le même que le nom du projet ?!?)&lt;br /&gt;
* Une description du système&lt;br /&gt;
* Le type de plateforme utilisé pour ce système&lt;br /&gt;
* La source de la fréquence d&#039;horloge du bus Wishbone (broche du FPGA ou DLL/DCM). On pourra éventuellement imaginer la création d&#039;un &#039;&#039;Wizard&#039;&#039; pour simplifier la configuration du DCM.&lt;br /&gt;
* La liste de tous les composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; inclus dans le système, avec pour chacun de ces composants, les détails suivantes:&lt;br /&gt;
** La référence du composant (par rapport à la bibliothèque de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;)&lt;br /&gt;
** Le nom de l&#039;instance du composant (e.g. UART1, PWM_MOTOR, etc.)&lt;br /&gt;
** La connexion des entrées/sorties (vers une broche du FPGA, non utilisé ou relié &#039;&#039;&#039;manuellement&#039;&#039;&#039;)&lt;br /&gt;
** L&#039;adresse du base de chacune de ses interfaces esclaves connectées au bus Wishbone&lt;br /&gt;
** La valeur de chaque paramètre &#039;&#039;&#039;GENERIC&#039;&#039;&#039; du composant&lt;br /&gt;
** L&#039;horloge utilisée (pour l&#039;instant ce sera toujours celle du bus Wishbone mais peut-être que plus tard ce ne sera plus forcément le cas ;-) )&lt;br /&gt;
** Le numéro d&#039;interruption attribué au composant, s&#039;il est capable de généré une demande d&#039;interruption&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme pour le fichier de description d&#039;un composant Armadeus, le fichier projet devra être dans un format texte compréhensible et lisible à l&#039;aide de n&#039;importe quel éditeur texte (XML, &#039;&#039;fichier INI&#039;&#039; ou &#039;&#039;fichier plat&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le fichier projet est le coeur du système et, à partir de celui-ci ainsi que de la librairie de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; + la librairie de plateforme, toute la partie liée au FPGA doit pouvoir être recrée. Bref c&#039;est le seul fichier dont l&#039;utilisateur final aura à ce soucier (sauvegarde, archivage, etc).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la création d&#039;un nouveau projet, l&#039;utilisateur devra fournir les éléments de base suivants:&lt;br /&gt;
* Le nom du système&lt;br /&gt;
* Une description&lt;br /&gt;
* Le type de plateforme utilisé&lt;br /&gt;
* La source de l&#039;horloge Wishbone (broche du FPGA ou DCM) avec éventuellement un &#039;&#039;wizard&#039;&#039; pour la saisie des informations relatives à la programmation du DCM.&lt;br /&gt;
* La fréquence du bus Wishbone (éventuellement obtenue automatiquement à partir de la sélection de la source de l&#039;horloge)&lt;br /&gt;
* Le nombre de sources d&#039;interruptions autorisées ainsi que l&#039;emplacement en mémoire des registres du gestionnaire d&#039;interruption (par défaut à l&#039;adresse 0x0000).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois que le projet aura été créer, les composants suivants seront ajouté automatiquement au système:&lt;br /&gt;
* Un &#039;&#039;&#039;Wrapper i.MX&#039;&#039;&#039; pour faire le lien avec l&#039;i.MX&lt;br /&gt;
* Un &#039;&#039;&#039;syscon&#039;&#039;&#039; pour la générations des signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; et &#039;&#039;&#039;RESET&#039;&#039;&#039; du bus Wishbone&lt;br /&gt;
* Un &#039;&#039;&#039;Gestionnaire d&#039;interruptions&#039;&#039;&#039; si le système doit être capable de remonter des demandes d&#039;interruption.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par la suite, l&#039;utilisateur pourra modifier le système de base à l&#039;aide des opérations suivantes:&lt;br /&gt;
* choisir dans la librairie un composant pour l&#039;ajouter au système&lt;br /&gt;
* modifier les paramètres d&#039;un composant du système&lt;br /&gt;
* modifier les caractéristiques du projet (nom, fréquence du bus Wishbone, etc.)&lt;br /&gt;
* supprimer un composant du système&lt;br /&gt;
* attribution automatique des adresses de base sur le bus Wishbone&lt;br /&gt;
* attribution automatique des numéros d&#039;interruption&lt;br /&gt;
* annulation des dernières modifications (éventuellement)&lt;br /&gt;
* sauvegarde/restauration d&#039;un fichier projet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Générateur de fichiers ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici que va se trouver la partie la plus ardue du projet &#039;&#039;&#039;Orchestra&#039;&#039;&#039;, et c&#039;est en fonction de ce que l&#039;on sera capable de proposer à l&#039;utilisateur final que se fera l&#039;adhésion au projet ou non.&lt;br /&gt;
&lt;br /&gt;
Une fois que l&#039;on aura créer son projet/système Armadeus, il faut encore pouvoir générer au minimum le fichier &#039;&#039;&#039;bitstream&#039;&#039;&#039; qui va être utiliser pour configurer le FPGA.&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;entre en jeu le générateur de fichiers, qui devra être capable, à l&#039;aide du fichier projet + la librairie de composant + la librairie de plateforme, de générer le fichiers suivants:&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;Intercon&#039;&#039;&#039; reliant tous les composants placés dans le système qui a été créé par l&#039;utilisateur&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;system&#039;&#039;&#039; qui va englober tout le système Wishbone tel qu&#039;il a été défini par l&#039;utilisateur&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;system_tb&#039;&#039;&#039; et un fichier &#039;&#039;&#039;.DO&#039;&#039;&#039; qui vont pouvoir être utilisés pour la simulation à partir de ModelSim&lt;br /&gt;
* un fichier &#039;&#039;&#039;tcl&#039;&#039;&#039; qui va permettre de créer entièrement et de manière automatique le projet dans l&#039;environnement &#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;, c&#039;est-à-dire:&lt;br /&gt;
** sélection du bon FPGA&lt;br /&gt;
** sélection du bon format de sortie (bitstream)&lt;br /&gt;
** saisie du pinout du FPGA (nom de chaque broche par rapport au nom du signal sur le schéma)&lt;br /&gt;
** programmation du DCM le cas échéant&lt;br /&gt;
** définition des signaux d&#039;horloge&lt;br /&gt;
** inclusion des fichiers HDL nécessaires au projet&lt;br /&gt;
** instanciation du fichier HDL &#039;&#039;&#039;sytem&#039;&#039;&#039;&lt;br /&gt;
** connexion des entrées et sorties du composant &#039;&#039;&#039;system&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme on peut le voir, le travail pour &#039;&#039;&#039;Orchestra&#039;&#039;&#039; ne manque pas, reste encore la question du mode de développement ainsi que du langage et la bibliothèque graphique.&lt;br /&gt;
&lt;br /&gt;
Mais ceci est encore une autre histoire, qui pourra être débattu lorsque les premières composants système seront prêt à l&#039;emploi... Peut-être très bientôt :-)&lt;br /&gt;
&lt;br /&gt;
== Gestionnaire d&#039;interruption ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ce chapitre est donné à titre informatif/propositon et ne tiens pas lieu de spécification.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier la vie des programmeurs systèmes, il faut pouvoir offrir un mécanisme simple de mise en place et de gestion des demandes d&#039;interruption du FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour cela, je propose la solution suivante:&lt;br /&gt;
* Mise en place d&#039;un gestionnaire d&#039;interruption générique pour le FPGA. Ce gestionnaire d&#039;interruption sera capable de lire le registre d&#039;interruption (lecture de &#039;&#039;&#039;isr_pend&#039;&#039;&#039;) et de déterminer les interruptions à traiter (via &#039;&#039;&#039;isr_mask&#039;&#039;&#039;). Il va en suite aiguiller l&#039;exécution de la routine d&#039;interruption vers les routines adéquates pour chaque bit d&#039;interruption valide. L&#039;interruption traitée sera alors acquitée (écriture vers &#039;&#039;&#039;isr_pend&#039;&#039;&#039;).&lt;br /&gt;
* Création d&#039;une routine &#039;&#039;&#039;&#039;&#039;d&#039;enregistrement de vecteur d&#039;interruption&#039;&#039;&#039;&#039;&#039;. Cette routine va permettre d&#039;ajouter une routine de traitement d&#039;interruption pour un bit d&#039;interruption donné. Pour cela il faudra lui fournir les informations suivantes (via une structure ?!?):&lt;br /&gt;
** Le numéro du bit d&#039;interruption (0 à 31)&lt;br /&gt;
** La routine de traitement d&#039;interruption pour ce driver&lt;br /&gt;
** Un paramètre additionnel à fournir à la routine de traitement d&#039;interruption (pointeur de type &#039;&#039;&#039;&#039;&#039;void *&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
** Le nom du drivers (optionnel, permet d&#039;identifier/visualiser les drivers installer éventuellement)&lt;br /&gt;
* Création d&#039;une routine de validation d&#039;une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour masquer une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour désinstaller une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine ou méthode pour visualiser tous les drivers Wishbone installés:&lt;br /&gt;
** Leur numéro&lt;br /&gt;
** Leur nom&lt;br /&gt;
** Leur état (validé/masqué)&lt;br /&gt;
** Le nombre de fois qu&#039;ils ont été appelé&lt;br /&gt;
** etc.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1807</id>
		<title>FpgaArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1807"/>
		<updated>2006-12-29T17:09:36Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Le script / programme d&amp;#039;assemblage des IP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spécifications de conception du FPGA =&lt;br /&gt;
&lt;br /&gt;
== Evolutions ==&lt;br /&gt;
&lt;br /&gt;
2006/12/21: MAJ en fonction des remarques de tout le monde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== But ==&lt;br /&gt;
&lt;br /&gt;
Cette page a été créée pour permettre à tous les membres de l&#039;association de discuter de l&#039;architecture qui va être mise en place pour le FPGA présent sur la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Cette espace doit être vu comme un espace d&#039;échange d&#039;idées. Tout le monde est convié à y participer. Il est préférable d&#039;avoir quelques connaissances en électronique et sur les langages HDL (VHDL ou Verilog), mais ce n&#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
Bonne lecture et merci pour votre participation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les grandes lignes ==&lt;br /&gt;
&lt;br /&gt;
Le FPGA de la carte APF9328 est là pour offrir le maximum de souplesse au projet &#039;&#039;&#039;Armadeus&#039;&#039;&#039; et permettre d&#039;implanter des fonctionnalités coté &#039;&#039;&#039;matériel&#039;&#039;&#039; qui seraient trop pénalisantes ou impossibles à implanter coté &#039;&#039;&#039;logiciel&#039;&#039;&#039;. Bien entendu, pour que cela soit exploitable, il faut également disposer d&#039;un lien entre le FPGA et le processeur i.MX.&lt;br /&gt;
&lt;br /&gt;
Pour réaliser cela, il faut mettre en place un bus de communication entre le FPGA et l&#039;i.MX. Ce bus de communication va permettre le pilotage des fonctionnalités qui seront implantées dans le FPGA. Bref, il faut recréer à l&#039;intérieur du FPGA un bus tel qu&#039;il existe entre l&#039;i.MX et les différents composants de la carte (RAM, Flash, USB, Ethernet, etc.).&lt;br /&gt;
&lt;br /&gt;
Pour gagner en temps de développement et pour pouvoir récupérer des fonctionnalités ou IP (Intellectual Property) déjà existantes, le bus Wishbone a été retenu. Ce bus, dont les spécification ont été placées dans le domaine public, a été conçu spécifiquement pour ce genre de configuration et sur le site &#039;&#039;&#039;[http://www.opencores.com www.opencores.com]&#039;&#039;&#039; plusieurs IP compatibles avec les spécifications Wishbone sont disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
La spécification Wishbone décrit un certain nombre de composants de base:&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;maitres&#039;&#039;&#039;, ces interfaces sont implantés dans des composants qui seront alors capable d&#039;initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;esclaves&#039;&#039;&#039;, ces interfaces sont implantés dans des composants capables de répondre à des demandes de transferts&lt;br /&gt;
* Un composant &#039;&#039;&#039;syscon&#039;&#039;&#039;, ce composant va générer le signal d&#039;horloge qui sera utilisé par tous les composants/interfaces du bus ainsi que le signal de RESET synchrone.&lt;br /&gt;
* Un macro composant &#039;&#039;&#039;intercon&#039;&#039;&#039;, ce composant va gérer la connexion de toutes les interfaces maitres et esclaves qui composent le bus interne. Il prend en charge :&lt;br /&gt;
** Le décodage/transcodage d&#039;adresse (génération des signaux A0 à A3 selon le mode d&#039;adressage 8/16/32/64 bits)&lt;br /&gt;
** le routage du bus de données entre les différentes interfaces maitres et esclaves (conversion big endian/little endian, etc)&lt;br /&gt;
** le routage/génération des signaux de contrôle du bus (Read, Write, Chip Select, Output Enable, ACK, etc.)&lt;br /&gt;
* Un composant &#039;&#039;&#039;arbitre&#039;&#039;&#039;, ce composant va permettre de partager l&#039;accès au bus ou à un composant de type esclave qui est partagé par plusieurs composants de type maitre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les spécifications du bus Wishbone permettent de créer différents types de bus:&lt;br /&gt;
* &#039;&#039;&#039;Point to Point&#039;&#039;&#039;: C&#039;est le type de bus le plus simple possibl, un composant avec une interface type maitre connecté à un composant avec une interface de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Data Flow&#039;&#039;&#039;: C&#039;est un bus en cascade, à un bout on trouve un composant avec une interface de type maître et à l&#039;autre bout un composant avec une interface de type esclave. Entre les deux composant se trouve une chaine d&#039;un ou plusieurs composants avec une interface de type maitre et de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;: C&#039;est un bus sur lequel plusieurs composants sont connectés dessus. Tous les composants se partagent ce bus. Si plusieurs &#039;&#039;maitres&#039;&#039; sont connectés sur ce bus, un seul pourra initier un transfert à un instant donné.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: C&#039;est également un bus de type partagé, par contre dans se cas, on dispose de plusieurs bus. Chaque maitre utilise sont propre bus pour communiquer avec ces esclaves. On peut donc avoir plusieurs transferts en simultané. Le seul cas de blocage/arbitrage est le transfert de plusieurs maitre avec le même esclave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe également un certain nombre de mécanismes dans la spécification Wishbone pour permettre d&#039;optimiser les temps de transferts sur le bus. Ces optimisations sont de plusieurs nature:&lt;br /&gt;
* utilisation de signaux &#039;&#039;&#039;ACK&#039;&#039;&#039;, &#039;&#039;&#039;ERR&#039;&#039;&#039; et &#039;&#039;&#039;RTY&#039;&#039;&#039; pour signaler la fin de transfert&lt;br /&gt;
* les &#039;&#039;&#039;Registered Feedback Bus Cycles&#039;&#039;&#039;, qui permettent de gagner un cycle d&#039;horloge pour des transferts consécutifs&lt;br /&gt;
* les transferts en mode &#039;&#039;&#039;Burst&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Le lien i.MX &amp;lt;=&amp;gt; FPGA ==&lt;br /&gt;
&lt;br /&gt;
La communication entre l&#039;i.MX et le FPGA passe par les signaux suivants (à vérifier):&lt;br /&gt;
* des signaux de contrôle: &amp;lt;strike&amp;gt;RW_n&amp;lt;/strike&amp;gt;, OE_n, EB_n[3..2] et CS1_n&lt;br /&gt;
* le bus de données sur 16 bits (D[15..0])&lt;br /&gt;
* le bus d&#039;adresses sur 12 bits (A[12..1])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ces signaux sont alors utilisés pour créer une interface Wishbone maitre qui va permettre de communiquer efficacement avec les autres IPs contenus dans le FPGA qui implémenterons une interface wishbone de type esclave.&lt;br /&gt;
&lt;br /&gt;
Etant donné les erratas du composant i.MX  concernant le signal DTACK, il n&#039;est pas possible d&#039;implanter une interface Wishbone maitre &#039;&#039;classique&#039;&#039;. Ceci entraine les limitations suivantes:&lt;br /&gt;
* Pas possible d&#039;utiliser le signal &#039;&#039;&#039;ACK&#039;&#039;&#039; Wishbone pour terminer le transfert entre FPGA et i.MX.&lt;br /&gt;
* Pas possible de mettre en place des optimisations du temps de transfert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce problème, il faudra s&#039;assurer que toutes les interfaces esclaves qui seront connectées à l&#039;interface maitre du composant Wishbone i.MX répondent dans un temps fixe donné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme le bus Wishbone est un bus entièrement synchrone, le temps minimal d&#039;un transfert est de 2 cycles de l&#039;horloge Wishbone. Il faut ajouter à cela, un cycle pour la synchronisation des signaux du bus i.MX. Cela nous fait donc un minimum de 3 cycles Wishbone pour un transfert entre le FPGA et l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
Etant donné les performances des FPGA actuels, on peut tabler sur une fréquence de fonctionnement d&#039;au moins 100MHz pour le bus Wishbone. Cela nous donne donc un taux de transfert approximatif de 66 Moctets/sec (100MHz * 16bits / 3).&lt;br /&gt;
&lt;br /&gt;
== La composition du système Wishbone ==&lt;br /&gt;
&lt;br /&gt;
[[Image:FPGA_Armadeus.png]]&lt;br /&gt;
&lt;br /&gt;
Le système Wishbone qui sera implanté dans le FPGA se compose des éléments suivants:&lt;br /&gt;
* &#039;&#039;&#039;i.MX Wrapper&#039;&#039;&#039;: L&#039;interface i.MX vers le bus Wishbone&lt;br /&gt;
* &#039;&#039;&#039;Syscon&#039;&#039;&#039;: Ce composant va gérer les signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; (généré par une PLL ou directement issu de l&#039;i.MX) et &#039;&#039;&#039;RESET&#039;&#039;&#039; (synchrone).&lt;br /&gt;
* &#039;&#039;&#039;Intercon&#039;&#039;&#039;: Ce composant devra être généré automatiquement par une moulinette, il va faire le lien entre tous les composants faisant parti du &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Gestionnaire d&#039;interruption&#039;&#039;&#039;: Ce composant est un &#039;&#039;&#039;esclave wishbone&#039;&#039;&#039; et va centraliser toutes les demandes d&#039;interruption et les remonter vers l&#039;i.MX.&lt;br /&gt;
* &#039;&#039;&#039;Esclaves whisbone&#039;&#039;&#039;: Ceci représentent tous les autres composants avec une interface wishbone esclave qui sont accessibles via le wrapper i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur le diagramme, il manque un certain nombre de choses:&lt;br /&gt;
* Les signaux &#039;&#039;non wishbone&#039;&#039; en entrée ou en sortie sur les &#039;&#039;&#039;esclaves wishbone&#039;&#039;&#039;&lt;br /&gt;
* Le macro composant &#039;&#039;&#039;système wishbone&#039;&#039;&#039;. Ce macro composant est celui qui sera ensuite instancié dans le design du FPGA. Sur ce composant ne seront visibles que les signaux &#039;&#039;externes&#039;&#039; au système:&lt;br /&gt;
** Les signaux issus de l&#039;i.MX&lt;br /&gt;
** &amp;lt;strike&amp;gt;Le signal RESET (en entrée) qui sera synchronisé sur l&#039;horloge système&amp;lt;/strike&amp;gt; Le signal RESET synchrone du bus Wishbone sera directement généré par le composant syscon à l&#039;aide d&#039;une simple machine d&#039;état.&lt;br /&gt;
** Le signal CLK (en entrée) qui sera l&#039;horloge utilisée pour la génération des signaux Wishbone&lt;br /&gt;
** Le signal IRQ (en sortie) qui sera utilisé pour remonter les demandes d&#039;interruption vers l&#039;i.MX&lt;br /&gt;
** Les signaux d&#039;entrée et de sortie spécifiques aux autres composants connectés sur le bus Wishbone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt de créer le composant &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;, est que cela simplifie la vision dans l&#039;outil conception du FPGA. Il ne suffit plus alors qu&#039;à relier les signaux sur les broches correspondantes du FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== i.MX Wrapper ===&lt;br /&gt;
&lt;br /&gt;
Ce composant est le point d&#039;accès au bus Wishbone pour l&#039;i.MX et sera le seul à disposer d&#039;une interface Wishbone maitre.&lt;br /&gt;
&lt;br /&gt;
Les fonctions de ce composants sont:&lt;br /&gt;
* synchronisation des signaux issus de l&#039;i.MX. Ceci est primordial pour assurer la stabilité de tout le système Wishbone. De plus, le bus de sortie étant asynchrone (l&#039;horloge de génération des signaux n&#039;est pas véhiculée), la resynchronisation des signaux par rapport à l&#039;horloge du bus s&#039;impose.&lt;br /&gt;
* gestion du bus de données en 3 états.&lt;br /&gt;
* conversion des signaux de contrôle du bus i.MX en signaux Wishbone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syscom ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est le composant le plus simple du système &amp;lt;strike&amp;gt;, il ne fait que synchroniser le signal RESET en entrée avec le signal d&#039;horloge du système&amp;lt;/strike&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Il va être en charge de la génération du signal RESET synchrone pour le bus Wishbone.&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;horloge en entrée du composant &#039;&#039;&#039;syscon&#039;&#039;&#039; sera celui utilisé pour le fonctionnement du bus Wishbone. La fréquence du signal d&#039;horloge devra être assez élevée pour permettre le traitement des signaux issus de l&#039;i.MX. Cela va dépendre de la configuration du chip select utilisé (CS5).&lt;br /&gt;
&lt;br /&gt;
La source du signal d&#039;horloge reste encore à définir, les choix possibles sont:&lt;br /&gt;
* directement issu de l&#039;i.MX&lt;br /&gt;
* utilisation d&#039;un DCM du Spartan 3&lt;br /&gt;
&lt;br /&gt;
Le choix définitif dépendra principalement des essais &#039;&#039;grandeur nature&#039;&#039; lors de la génération des premiers systèmes whisbone durant la phase de mise en place des composants de base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Intercon ===&lt;br /&gt;
&lt;br /&gt;
Ce composant a la particularité qu&#039;il sera créé automatiquement par un outil (script ou programme). &#039;&#039;&#039;Intercom&#039;&#039;&#039; a comme fonctionnalités:&lt;br /&gt;
* Le décodage d&#039;adresse pour la sélection des différents esclaves du système&lt;br /&gt;
* Le routage des bus d&#039;adresses et de données vers les différents esclaves&lt;br /&gt;
* La génération des signaux de contrôle pour les différents esclaves.&lt;br /&gt;
&lt;br /&gt;
Etant donné les limitations induites par les erratas de l&#039;i.MX, le composant &#039;&#039;&#039;intercom&#039;&#039;&#039; remplira les fonctionnalités suivantes:&lt;br /&gt;
* le bus de données est figé sur 16 bits&lt;br /&gt;
* les cycles de lecture et d&#039;écriture sont de longueur fixe (à priori 3 cycles d&#039;horloge &#039;&#039;&#039;à valider&#039;&#039;&#039; lors des essais du système de base)&lt;br /&gt;
* une interruption est générée en cas de dépassement du temps de cycle d&#039;écriture ou de lecture&lt;br /&gt;
* le bus sera de type &#039;&#039;&#039;shared&#039;&#039;&#039; avec un seul maitre (le Wrapper i.MX).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les composants esclaves ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;Suite aux divers discussions issues de ce chapitre. L&#039;organisation et la présences des fichiers dans les répertoires &#039;&#039;&#039;doc&#039;&#039;&#039; et &#039;&#039;&#039;HAL&#039;&#039;&#039; n&#039;est pas encore établie. Ce chapitre sera encore à retravailler.&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;une IP puisse être facilement inclue dans le système, il faut une certaine organisation. Sinon, à moyen ou à long terme cette IP est morte parce qu&#039;elle sera difficilement exploitable et encore plus difficilement maintenable.&lt;br /&gt;
&lt;br /&gt;
Ce sont des notions qui ne sont pas simples à prendre en considération lors du développement d&#039;un nouveau projet, mais lorsque l&#039;on doit se replonger dans un travail fait par quelqu&#039;un d&#039;autre ou un projet qu&#039;on a laissé en sommeil pendant quelque temps, on est content d&#039;avoir quelque chose à quoi se raccrocher.&lt;br /&gt;
&lt;br /&gt;
Pour développer efficacement, il faut assurer une organisation logique, figée et compréhensible, et le plus simple dans ce genre de cas est de se baser sur la notion de répertoire. Voici les répertoires qui doivent être utilisés par une IP:&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: Ce répertoire va contenir toute la documentation nécessaire à l&#039;exploitation de l&#039;IP. On y trouvera une notice (&#039;&#039;&#039;readme.txt&#039;&#039;&#039;), un fichier de suivi de modification (&#039;&#039;&#039;ChangeLog.txt&#039;&#039;&#039;), un fichier contenant les évolutions futures prévues (&#039;&#039;&#039;todo.txt&#039;&#039;&#039;) ainsi que tout autre fichier estimé utile par le(s) créateur(s) de l&#039;IP.&lt;br /&gt;
* &#039;&#039;&#039;hdl&#039;&#039;&#039;: Ce répertoire va contenir tous les fichiers VHDL (ou Verilog) qui auront été développés spécifiquement pour cette IP.&lt;br /&gt;
* &#039;&#039;&#039;inc&#039;&#039;&#039;: Ce répertoire va contenir un fichier d&#039;en-tête ANSI C contenant l&#039;adresse de tous les registres interne de l&#039;IP pour permettre de créer simplement un programme en langage C permettant de contrôler l&#039;IP. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HAL&#039;&#039;&#039;: Ce répertoire va contenir un drivers ou un exemple de logiciel de base permettant l&#039;utilisation de l&#039;IP par un microprocesseur/contrôleur. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Ce composant esclave est le premier qui sera créé spécifiquement pour le système. Il sera capable de:&lt;br /&gt;
* prendre en compte jusqu&#039;à 16 sources d&#039;interruptions différentes&lt;br /&gt;
* réaliser l&#039;acquittement de chaque interruption individuellement&lt;br /&gt;
* masquer/autoriser chaque interruption individuellement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le composant disposera des registres suivants:&lt;br /&gt;
* &#039;&#039;&#039;isr_mask&#039;&#039;&#039;: registre d&#039;autorisation des interruptions. Chaque bit correspond à une interruption (bit0 =&amp;gt; IRQ0, bit1 =&amp;gt; IRQ1, etc.). Ce registre sera accessible en lecture et en écriture.&lt;br /&gt;
* &#039;&#039;&#039;isr_pend&#039;&#039;&#039;: ce registre est à double emploi&lt;br /&gt;
** &#039;&#039;&#039;en lecture&#039;&#039;&#039;: Les interruptions en attente de traitement&lt;br /&gt;
** &#039;&#039;&#039;en écriture&#039;&#039;&#039;: Acquittement des interruptions. Chaque bit à 1 va acquitter l&#039;interruption correspondante.&lt;br /&gt;
&lt;br /&gt;
== Le script / programme d&#039;assemblage des IP ==&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant parler du coeur du système, du moins de la partie la plus visible de l&#039;iceberg ;-)&lt;br /&gt;
&lt;br /&gt;
La première des priorités, sera de trouver un nom pour cet outil qui reste un peu dans l&#039;esprit du projet. Voici quelques propositions, à vous de compléter ou de voter pour un nom ou plusieurs noms:&lt;br /&gt;
* Concerto&lt;br /&gt;
* Orchestra&lt;br /&gt;
&lt;br /&gt;
D&#039;après les derniers sondage, &#039;&#039;&#039;Orchestra&#039;&#039;&#039; serait finalement le nom retenu pour ce logiciel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Principe et fonctionnement ===&lt;br /&gt;
&lt;br /&gt;
Afin de de rendre tout ce système utilisable par le plus grand nombre, il faut être capable de proposer des outils qui vont simplifier la vie de l&#039;utilisateur final ainsi que de l&#039;intégrateur.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faudra créer un outil soit sous forme de script(s), soit sous forme de programme(s) qui va permettre de réaliser les tâches suivantes:&lt;br /&gt;
* Création/gestion d&#039;une bibliothèque de composants &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* Gestion d&#039;une liste de &#039;&#039;&#039;hardware Armadeus&#039;&#039;&#039;&lt;br /&gt;
* Edition d&#039;un &#039;&#039;&#039;système Armadeus&#039;&#039;&#039;&lt;br /&gt;
* Gestion d&#039;un projet&lt;br /&gt;
* Génération automatique du composant &#039;&#039;&#039;system&#039;&#039;&#039; qui sera implanté dans le FPGA&lt;br /&gt;
* Génération automatique d&#039;un banc de tests pour permettre la validation par ModelSim (ou autre logiciel de simulation HDL)&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;mapping mémoire&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La bibliothèque de composants ===&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;un composant, c&#039;est-à-dire une IP, soit exploitable par le système, il faut passer par une phase d&#039;intégration qui va permettre de décrire ce composant:&lt;br /&gt;
* Nom de l&#039;IP&lt;br /&gt;
* Description&lt;br /&gt;
* Version&lt;br /&gt;
* Identification des fichiers HDL utilisés (VHDL ou Verilog)&lt;br /&gt;
* Identification du fichier &#039;&#039;&#039;Top&#039;&#039;&#039; (le point d&#039;entrée de l&#039;IP)&lt;br /&gt;
* Identification des paramètres &#039;&#039;&#039;&#039;&#039;GENERIC&#039;&#039;&#039;&#039;&#039; (dans le cas d&#039;une IP en VHDL):&lt;br /&gt;
** Type de paramètre (entier, std_logic, etc)&lt;br /&gt;
** Valeur par défaut&lt;br /&gt;
** Valeurs ou plages de valeurs autorisées&lt;br /&gt;
** Description du paramètre&lt;br /&gt;
* Identification des signaux Wishbone utilisés par le composant&lt;br /&gt;
* Identification du type (maitre ou esclave) et du nombre d&#039;interfaces Wishbone utilisés par ce composant&lt;br /&gt;
* Identification des registres internes&lt;br /&gt;
** Adresse (Offset par rapport à l&#039;adresse de base)&lt;br /&gt;
** Taille (8 ou 16 bits)&lt;br /&gt;
** Nom et/ou description&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toutes ces informations seront alors sauvegardées dans un fichier, de préférence dans un format compréhensible et lisible à l&#039;aide de n&#039;importe quel éditeur de texte (XML, &#039;&#039;fichier INI&#039;&#039; ou &#039;&#039;fichier plat&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque composant identifié par le logiciel se trouvera dans un sous-répertoire (ou dans un fichier archive ?!?) placé dans le répertoire &#039;&#039;&#039;Armadeus Components&#039;&#039;&#039;, chaque sous-répertoire (ou archive) de composant contiendra les données suivantes:&lt;br /&gt;
* Le fichier de description du composant &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* un répertoire &#039;&#039;&#039;HDL&#039;&#039;&#039; avec les fichiers VHDL/Verilog de l&#039;IP&lt;br /&gt;
* un répertoire &#039;&#039;&#039;HAL&#039;&#039;&#039; avec les fichiers d&#039;un drivers de base (pour Linux ou &#039;&#039;générique&#039;&#039; ?!?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le gestionnaire de composants Armadeus doit être capable de réaliser les opérations suivantes:&lt;br /&gt;
* Importer un composant ou une liste de composants&lt;br /&gt;
* Exporter un composant ou une liste de composants&lt;br /&gt;
* Gérer des versions de composants (à voir si cette fonctionnalité est importante/utile)&lt;br /&gt;
* Permettre l&#039;ajout/création de composants&lt;br /&gt;
* Permettre de supprimer un composant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire de plateformes ===&lt;br /&gt;
&lt;br /&gt;
Il faut avoir confiance dans l&#039;avenir, pour l&#039;instant nous ne disposons que d&#039;une seul plateforme de travail, mais ce n&#039;est qu&#039;un début et très certainement d&#039;autres cartes à base de l&#039;i.MX et d&#039;un FPGA vont voir le jour.&lt;br /&gt;
&lt;br /&gt;
Il faut donc prévoir d&#039;ores et déjà cette possibilité et proposer un outil qui va permettre de définir une plateforme. Chaque descripteur de plateforme devra fournir les informations suivantes:&lt;br /&gt;
* Type de FPGA&lt;br /&gt;
* Emplacement (niveau FPGA, c&#039;est-à-dire la broche utilisée), type (sortie i.MX, oscillateur ou quartz) et fréquence (ou plage de fréquence ?!?) des horloges&lt;br /&gt;
* Emplacements/broche du FPGA utilisées ainsi que leur fonctionnalité (signal Wishbone, comme d&#039;un composant externe, signal d&#039;interruption, etc.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toutes ces informations seront utilisées par la suite lors de la création d&#039;un projet &#039;&#039;&#039;Orchestra/Armadeus&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire de projet ===&lt;br /&gt;
&lt;br /&gt;
Le rôle du gestionnaire de projet est de permettre de créer, reprendre ou modifier le plus simplement possible une configuration du FPGA pour une carte donnée. Cette configuration sera appelée par la suite un &#039;&#039;&#039;système&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tout &#039;&#039;&#039;système&#039;&#039;&#039; est entièrement décrit par un fichier projet qui contiendra les éléments suivants:&lt;br /&gt;
* Le nom du système (éventuellement le même que le nom du projet ?!?)&lt;br /&gt;
* Une description du système&lt;br /&gt;
* Le type de plateforme utilisé pour ce système&lt;br /&gt;
* La source de la fréquence d&#039;horloge du bus Wishbone (broche du FPGA ou DLL/DCM). On pourra éventuellement imaginer la création d&#039;un &#039;&#039;Wizard&#039;&#039; pour simplifier la configuration du DCM.&lt;br /&gt;
* La liste de tous les composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; inclus dans le système, avec pour chacun de ces composants, les détails suivantes:&lt;br /&gt;
** La référence du composant (par rapport à la bibliothèque de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;)&lt;br /&gt;
** Le nom de l&#039;instance du composant (e.g. UART1, PWM_MOTOR, etc.)&lt;br /&gt;
** La connexion des entrées/sorties (vers une broche du FPGA, non utilisé ou relié &#039;&#039;&#039;manuellement&#039;&#039;&#039;)&lt;br /&gt;
** L&#039;adresse du base de chacune de ses interfaces esclaves connectées au bus Wishbone&lt;br /&gt;
** La valeur de chaque paramètre &#039;&#039;&#039;GENERIC&#039;&#039;&#039; du composant&lt;br /&gt;
** L&#039;horloge utilisée (pour l&#039;instant ce sera toujours celle du bus Wishbone mais peut-être que plus tard ce ne sera plus forcément le cas ;-) )&lt;br /&gt;
** Le numéro d&#039;interruption attribué au composant, s&#039;il est capable de généré une demande d&#039;interruption&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme pour le fichier de description d&#039;un composant Armadeus, le fichier projet devra être dans un format texte compréhensible et lisible à l&#039;aide de n&#039;importe quel éditeur texte (XML, &#039;&#039;fichier INI&#039;&#039; ou &#039;&#039;fichier plat&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le fichier projet est le coeur du système et, à partir de celui-ci ainsi que de la librairie de composants &#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039; + la librairie de plateforme, toute la partie liée au FPGA doit pouvoir être recrée. Bref c&#039;est le seul fichier dont l&#039;utilisateur final aura à ce soucier (sauvegarde, archivage, etc).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la création d&#039;un nouveau projet, l&#039;utilisateur devra fournir les éléments de base suivants:&lt;br /&gt;
* Le nom du système&lt;br /&gt;
* Une description&lt;br /&gt;
* Le type de plateforme utilisé&lt;br /&gt;
* La source de l&#039;horloge Wishbone (broche du FPGA ou DCM) avec éventuellement un &#039;&#039;wizard&#039;&#039; pour la saisie des informations relatives à la programmation du DCM.&lt;br /&gt;
* La fréquence du bus Wishbone (éventuellement obtenue automatiquement à partir de la sélection de la source de l&#039;horloge)&lt;br /&gt;
* Le nombre de sources d&#039;interruptions autorisées ainsi que l&#039;emplacement en mémoire des registres du gestionnaire d&#039;interruption (par défaut à l&#039;adresse 0x0000).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois que le projet aura été créer, les composants suivants seront ajouté automatiquement au système:&lt;br /&gt;
* Un &#039;&#039;&#039;Wrapper i.MX&#039;&#039;&#039; pour faire le lien avec l&#039;i.MX&lt;br /&gt;
* Un &#039;&#039;&#039;syscon&#039;&#039;&#039; pour la générations des signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; et &#039;&#039;&#039;RESET&#039;&#039;&#039; du bus Wishbone&lt;br /&gt;
* Un &#039;&#039;&#039;Gestionnaire d&#039;interruptions&#039;&#039;&#039; si le système doit être capable de remonter des demandes d&#039;interruption.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par la suite, l&#039;utilisateur pourra modifier le système de base à l&#039;aide des opérations suivantes:&lt;br /&gt;
* choisir dans la librairie un composant pour l&#039;ajouter au système&lt;br /&gt;
* modifier les paramètres d&#039;un composant du système&lt;br /&gt;
* modifier les caractéristiques du projet (nom, fréquence du bus Wishbone, etc.)&lt;br /&gt;
* supprimer un composant du système&lt;br /&gt;
* attribution automatique des adresses de base sur le bus Wishbone&lt;br /&gt;
* attribution automatique des numéros d&#039;interruption&lt;br /&gt;
* annulation des dernières modifications (éventuellement)&lt;br /&gt;
* sauvegarde/restauration d&#039;un fichier projet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Générateur de fichiers ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici que va se trouver la partie la plus ardue du projet &#039;&#039;&#039;Orchestra&#039;&#039;&#039;, et c&#039;est en fonction de ce que l&#039;on sera capable de proposer à l&#039;utilisateur final que se fera l&#039;adhésion au projet ou non.&lt;br /&gt;
&lt;br /&gt;
Une fois que l&#039;on aura créer son projet/système Armadeus, il faut encore pouvoir générer au minimum le fichier &#039;&#039;&#039;bitstream&#039;&#039;&#039; qui va être utiliser pour configurer le FPGA.&lt;br /&gt;
&lt;br /&gt;
C&#039;est ici qu&#039;entre en jeu le générateur de fichiers, qui devra être capable, à l&#039;aide du fichier projet + la librairie de composant + la librairie de plateforme, de générer le fichiers suivants:&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;Intercon&#039;&#039;&#039; reliant tous les composants placés dans le système qui a été créé par l&#039;utilisateur&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;system&#039;&#039;&#039; qui va englober tout le système Wishbone tel qu&#039;il a été défini par l&#039;utilisateur&lt;br /&gt;
* un fichier HDL &#039;&#039;&#039;system_tb&#039;&#039;&#039; et un fichier &#039;&#039;&#039;.DO&#039;&#039;&#039; qui vont pouvoir être utilisés pour la simulation à partir de ModelSim&lt;br /&gt;
* un fichier &#039;&#039;&#039;tcl&#039;&#039;&#039; qui va permettre de créer entièrement et de manière automatique le projet dans l&#039;environnement &#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;, c&#039;est-à-dire:&lt;br /&gt;
** sélection du bon FPGA&lt;br /&gt;
** sélection du bon format de sortie (bitstream)&lt;br /&gt;
** saisie du pinout du FPGA (nom de chaque broche par rapport au nom du signal sur le schéma)&lt;br /&gt;
** programmation du DCM le cas échéant&lt;br /&gt;
** définition des signaux d&#039;horloge&lt;br /&gt;
** inclusion des fichiers HDL nécessaires au projet&lt;br /&gt;
** instanciation du fichier HDL &#039;&#039;&#039;sytem&#039;&#039;&#039;&lt;br /&gt;
** connexion des entrées et sorties du composant &#039;&#039;&#039;system&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme on peut le voir, le travail pour &#039;&#039;&#039;Orchestra&#039;&#039;&#039; ne manque pas, reste encore la question du mode de développement ainsi que du langage et la bibliothèque graphique.&lt;br /&gt;
&lt;br /&gt;
Mais ceci est encore une autre histoire, qui pourra être débattu lorsque les premières composants système seront prêt à l&#039;emploi... Peut-être très bientôt :-)&lt;br /&gt;
&lt;br /&gt;
== Gestionnaire d&#039;interruption ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ce chapitre est donné à titre informatif/propositon et ne tiens pas lieu de spécification.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier la vie des programmeurs systèmes, il faut pouvoir offrir un mécanisme simple de mise en place et de gestion des demandes d&#039;interruption du FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour cela, je propose la solution suivante:&lt;br /&gt;
* Mise en place d&#039;un gestionnaire d&#039;interruption générique pour le FPGA. Ce gestionnaire d&#039;interruption sera capable de lire le registre d&#039;interruption (lecture de &#039;&#039;&#039;isr_pend&#039;&#039;&#039;) et de déterminer les interruptions à traiter (via &#039;&#039;&#039;isr_mask&#039;&#039;&#039;). Il va en suite aiguiller l&#039;exécution de la routine d&#039;interruption vers les routines adéquates pour chaque bit d&#039;interruption valide. L&#039;interruption traitée sera alors acquitée (écriture vers &#039;&#039;&#039;isr_pend&#039;&#039;&#039;).&lt;br /&gt;
* Création d&#039;une routine &#039;&#039;&#039;&#039;&#039;d&#039;enregistrement de vecteur d&#039;interruption&#039;&#039;&#039;&#039;&#039;. Cette routine va permettre d&#039;ajouter une routine de traitement d&#039;interruption pour un bit d&#039;interruption donné. Pour cela il faudra lui fournir les informations suivantes (via une structure ?!?):&lt;br /&gt;
** Le numéro du bit d&#039;interruption (0 à 31)&lt;br /&gt;
** La routine de traitement d&#039;interruption pour ce driver&lt;br /&gt;
** Un paramètre additionnel à fournir à la routine de traitement d&#039;interruption (pointeur de type &#039;&#039;&#039;&#039;&#039;void *&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
** Le nom du drivers (optionnel, permet d&#039;identifier/visualiser les drivers installer éventuellement)&lt;br /&gt;
* Création d&#039;une routine de validation d&#039;une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour masquer une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour désinstaller une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine ou méthode pour visualiser tous les drivers Wishbone installés:&lt;br /&gt;
** Leur numéro&lt;br /&gt;
** Leur nom&lt;br /&gt;
** Leur état (validé/masqué)&lt;br /&gt;
** Le nombre de fois qu&#039;ils ont été appelé&lt;br /&gt;
** etc.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1806</id>
		<title>FpgaArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1806"/>
		<updated>2006-12-28T22:14:01Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Le script / programme d&amp;#039;assemblage des IP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spécifications de conception du FPGA =&lt;br /&gt;
&lt;br /&gt;
== Evolutions ==&lt;br /&gt;
&lt;br /&gt;
2006/12/21: MAJ en fonction des remarques de tout le monde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== But ==&lt;br /&gt;
&lt;br /&gt;
Cette page a été créée pour permettre à tous les membres de l&#039;association de discuter de l&#039;architecture qui va être mise en place pour le FPGA présent sur la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Cette espace doit être vu comme un espace d&#039;échange d&#039;idées. Tout le monde est convié à y participer. Il est préférable d&#039;avoir quelques connaissances en électronique et sur les langages HDL (VHDL ou Verilog), mais ce n&#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
Bonne lecture et merci pour votre participation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les grandes lignes ==&lt;br /&gt;
&lt;br /&gt;
Le FPGA de la carte APF9328 est là pour offrir le maximum de souplesse au projet &#039;&#039;&#039;Armadeus&#039;&#039;&#039; et permettre d&#039;implanter des fonctionnalités coté &#039;&#039;&#039;matériel&#039;&#039;&#039; qui seraient trop pénalisantes ou impossibles à implanter coté &#039;&#039;&#039;logiciel&#039;&#039;&#039;. Bien entendu, pour que cela soit exploitable, il faut également disposer d&#039;un lien entre le FPGA et le processeur i.MX.&lt;br /&gt;
&lt;br /&gt;
Pour réaliser cela, il faut mettre en place un bus de communication entre le FPGA et l&#039;i.MX. Ce bus de communication va permettre le pilotage des fonctionnalités qui seront implantées dans le FPGA. Bref, il faut recréer à l&#039;intérieur du FPGA un bus tel qu&#039;il existe entre l&#039;i.MX et les différents composants de la carte (RAM, Flash, USB, Ethernet, etc.).&lt;br /&gt;
&lt;br /&gt;
Pour gagner en temps de développement et pour pouvoir récupérer des fonctionnalités ou IP (Intellectual Property) déjà existantes, le bus Wishbone a été retenu. Ce bus, dont les spécification ont été placées dans le domaine public, a été conçu spécifiquement pour ce genre de configuration et sur le site &#039;&#039;&#039;[http://www.opencores.com www.opencores.com]&#039;&#039;&#039; plusieurs IP compatibles avec les spécifications Wishbone sont disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
La spécification Wishbone décrit un certain nombre de composants de base:&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;maitres&#039;&#039;&#039;, ces interfaces sont implantés dans des composants qui seront alors capable d&#039;initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;esclaves&#039;&#039;&#039;, ces interfaces sont implantés dans des composants capables de répondre à des demandes de transferts&lt;br /&gt;
* Un composant &#039;&#039;&#039;syscon&#039;&#039;&#039;, ce composant va générer le signal d&#039;horloge qui sera utilisé par tous les composants/interfaces du bus ainsi que le signal de RESET synchrone.&lt;br /&gt;
* Un macro composant &#039;&#039;&#039;intercon&#039;&#039;&#039;, ce composant va gérer la connexion de toutes les interfaces maitres et esclaves qui composent le bus interne. Il prend en charge :&lt;br /&gt;
** Le décodage/transcodage d&#039;adresse (génération des signaux A0 à A3 selon le mode d&#039;adressage 8/16/32/64 bits)&lt;br /&gt;
** le routage du bus de données entre les différentes interfaces maitres et esclaves (conversion big endian/little endian, etc)&lt;br /&gt;
** le routage/génération des signaux de contrôle du bus (Read, Write, Chip Select, Output Enable, ACK, etc.)&lt;br /&gt;
* Un composant &#039;&#039;&#039;arbitre&#039;&#039;&#039;, ce composant va permettre de partager l&#039;accès au bus ou à un composant de type esclave qui est partagé par plusieurs composants de type maitre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les spécifications du bus Wishbone permettent de créer différents types de bus:&lt;br /&gt;
* &#039;&#039;&#039;Point to Point&#039;&#039;&#039;: C&#039;est le type de bus le plus simple possibl, un composant avec une interface type maitre connecté à un composant avec une interface de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Data Flow&#039;&#039;&#039;: C&#039;est un bus en cascade, à un bout on trouve un composant avec une interface de type maître et à l&#039;autre bout un composant avec une interface de type esclave. Entre les deux composant se trouve une chaine d&#039;un ou plusieurs composants avec une interface de type maitre et de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;: C&#039;est un bus sur lequel plusieurs composants sont connectés dessus. Tous les composants se partagent ce bus. Si plusieurs &#039;&#039;maitres&#039;&#039; sont connectés sur ce bus, un seul pourra initier un transfert à un instant donné.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: C&#039;est également un bus de type partagé, par contre dans se cas, on dispose de plusieurs bus. Chaque maitre utilise sont propre bus pour communiquer avec ces esclaves. On peut donc avoir plusieurs transferts en simultané. Le seul cas de blocage/arbitrage est le transfert de plusieurs maitre avec le même esclave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe également un certain nombre de mécanismes dans la spécification Wishbone pour permettre d&#039;optimiser les temps de transferts sur le bus. Ces optimisations sont de plusieurs nature:&lt;br /&gt;
* utilisation de signaux &#039;&#039;&#039;ACK&#039;&#039;&#039;, &#039;&#039;&#039;ERR&#039;&#039;&#039; et &#039;&#039;&#039;RTY&#039;&#039;&#039; pour signaler la fin de transfert&lt;br /&gt;
* les &#039;&#039;&#039;Registered Feedback Bus Cycles&#039;&#039;&#039;, qui permettent de gagner un cycle d&#039;horloge pour des transferts consécutifs&lt;br /&gt;
* les transferts en mode &#039;&#039;&#039;Burst&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Le lien i.MX &amp;lt;=&amp;gt; FPGA ==&lt;br /&gt;
&lt;br /&gt;
La communication entre l&#039;i.MX et le FPGA passe par les signaux suivants (à vérifier):&lt;br /&gt;
* des signaux de contrôle: &amp;lt;strike&amp;gt;RW_n&amp;lt;/strike&amp;gt;, OE_n, EB_n[3..2] et CS1_n&lt;br /&gt;
* le bus de données sur 16 bits (D[15..0])&lt;br /&gt;
* le bus d&#039;adresses sur 12 bits (A[12..1])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ces signaux sont alors utilisés pour créer une interface Wishbone maitre qui va permettre de communiquer efficacement avec les autres IPs contenus dans le FPGA qui implémenterons une interface wishbone de type esclave.&lt;br /&gt;
&lt;br /&gt;
Etant donné les erratas du composant i.MX  concernant le signal DTACK, il n&#039;est pas possible d&#039;implanter une interface Wishbone maitre &#039;&#039;classique&#039;&#039;. Ceci entraine les limitations suivantes:&lt;br /&gt;
* Pas possible d&#039;utiliser le signal &#039;&#039;&#039;ACK&#039;&#039;&#039; Wishbone pour terminer le transfert entre FPGA et i.MX.&lt;br /&gt;
* Pas possible de mettre en place des optimisations du temps de transfert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce problème, il faudra s&#039;assurer que toutes les interfaces esclaves qui seront connectées à l&#039;interface maitre du composant Wishbone i.MX répondent dans un temps fixe donné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme le bus Wishbone est un bus entièrement synchrone, le temps minimal d&#039;un transfert est de 2 cycles de l&#039;horloge Wishbone. Il faut ajouter à cela, un cycle pour la synchronisation des signaux du bus i.MX. Cela nous fait donc un minimum de 3 cycles Wishbone pour un transfert entre le FPGA et l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
Etant donné les performances des FPGA actuels, on peut tabler sur une fréquence de fonctionnement d&#039;au moins 100MHz pour le bus Wishbone. Cela nous donne donc un taux de transfert approximatif de 66 Moctets/sec (100MHz * 16bits / 3).&lt;br /&gt;
&lt;br /&gt;
== La composition du système Wishbone ==&lt;br /&gt;
&lt;br /&gt;
[[Image:FPGA_Armadeus.png]]&lt;br /&gt;
&lt;br /&gt;
Le système Wishbone qui sera implanté dans le FPGA se compose des éléments suivants:&lt;br /&gt;
* &#039;&#039;&#039;i.MX Wrapper&#039;&#039;&#039;: L&#039;interface i.MX vers le bus Wishbone&lt;br /&gt;
* &#039;&#039;&#039;Syscon&#039;&#039;&#039;: Ce composant va gérer les signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; (généré par une PLL ou directement issu de l&#039;i.MX) et &#039;&#039;&#039;RESET&#039;&#039;&#039; (synchrone).&lt;br /&gt;
* &#039;&#039;&#039;Intercon&#039;&#039;&#039;: Ce composant devra être généré automatiquement par une moulinette, il va faire le lien entre tous les composants faisant parti du &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Gestionnaire d&#039;interruption&#039;&#039;&#039;: Ce composant est un &#039;&#039;&#039;esclave wishbone&#039;&#039;&#039; et va centraliser toutes les demandes d&#039;interruption et les remonter vers l&#039;i.MX.&lt;br /&gt;
* &#039;&#039;&#039;Esclaves whisbone&#039;&#039;&#039;: Ceci représentent tous les autres composants avec une interface wishbone esclave qui sont accessibles via le wrapper i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur le diagramme, il manque un certain nombre de choses:&lt;br /&gt;
* Les signaux &#039;&#039;non wishbone&#039;&#039; en entrée ou en sortie sur les &#039;&#039;&#039;esclaves wishbone&#039;&#039;&#039;&lt;br /&gt;
* Le macro composant &#039;&#039;&#039;système wishbone&#039;&#039;&#039;. Ce macro composant est celui qui sera ensuite instancié dans le design du FPGA. Sur ce composant ne seront visibles que les signaux &#039;&#039;externes&#039;&#039; au système:&lt;br /&gt;
** Les signaux issus de l&#039;i.MX&lt;br /&gt;
** &amp;lt;strike&amp;gt;Le signal RESET (en entrée) qui sera synchronisé sur l&#039;horloge système&amp;lt;/strike&amp;gt; Le signal RESET synchrone du bus Wishbone sera directement généré par le composant syscon à l&#039;aide d&#039;une simple machine d&#039;état.&lt;br /&gt;
** Le signal CLK (en entrée) qui sera l&#039;horloge utilisée pour la génération des signaux Wishbone&lt;br /&gt;
** Le signal IRQ (en sortie) qui sera utilisé pour remonter les demandes d&#039;interruption vers l&#039;i.MX&lt;br /&gt;
** Les signaux d&#039;entrée et de sortie spécifiques aux autres composants connectés sur le bus Wishbone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt de créer le composant &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;, est que cela simplifie la vision dans l&#039;outil conception du FPGA. Il ne suffit plus alors qu&#039;à relier les signaux sur les broches correspondantes du FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== i.MX Wrapper ===&lt;br /&gt;
&lt;br /&gt;
Ce composant est le point d&#039;accès au bus Wishbone pour l&#039;i.MX et sera le seul à disposer d&#039;une interface Wishbone maitre.&lt;br /&gt;
&lt;br /&gt;
Les fonctions de ce composants sont:&lt;br /&gt;
* synchronisation des signaux issus de l&#039;i.MX. Ceci est primordial pour assurer la stabilité de tout le système Wishbone. De plus, le bus de sortie étant asynchrone (l&#039;horloge de génération des signaux n&#039;est pas véhiculée), la resynchronisation des signaux par rapport à l&#039;horloge du bus s&#039;impose.&lt;br /&gt;
* gestion du bus de données en 3 états.&lt;br /&gt;
* conversion des signaux de contrôle du bus i.MX en signaux Wishbone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syscom ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est le composant le plus simple du système &amp;lt;strike&amp;gt;, il ne fait que synchroniser le signal RESET en entrée avec le signal d&#039;horloge du système&amp;lt;/strike&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Il va être en charge de la génération du signal RESET synchrone pour le bus Wishbone.&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;horloge en entrée du composant &#039;&#039;&#039;syscon&#039;&#039;&#039; sera celui utilisé pour le fonctionnement du bus Wishbone. La fréquence du signal d&#039;horloge devra être assez élevée pour permettre le traitement des signaux issus de l&#039;i.MX. Cela va dépendre de la configuration du chip select utilisé (CS5).&lt;br /&gt;
&lt;br /&gt;
La source du signal d&#039;horloge reste encore à définir, les choix possibles sont:&lt;br /&gt;
* directement issu de l&#039;i.MX&lt;br /&gt;
* utilisation d&#039;un DCM du Spartan 3&lt;br /&gt;
&lt;br /&gt;
Le choix définitif dépendra principalement des essais &#039;&#039;grandeur nature&#039;&#039; lors de la génération des premiers systèmes whisbone durant la phase de mise en place des composants de base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Intercon ===&lt;br /&gt;
&lt;br /&gt;
Ce composant a la particularité qu&#039;il sera créé automatiquement par un outil (script ou programme). &#039;&#039;&#039;Intercom&#039;&#039;&#039; a comme fonctionnalités:&lt;br /&gt;
* Le décodage d&#039;adresse pour la sélection des différents esclaves du système&lt;br /&gt;
* Le routage des bus d&#039;adresses et de données vers les différents esclaves&lt;br /&gt;
* La génération des signaux de contrôle pour les différents esclaves.&lt;br /&gt;
&lt;br /&gt;
Etant donné les limitations induites par les erratas de l&#039;i.MX, le composant &#039;&#039;&#039;intercom&#039;&#039;&#039; remplira les fonctionnalités suivantes:&lt;br /&gt;
* le bus de données est figé sur 16 bits&lt;br /&gt;
* les cycles de lecture et d&#039;écriture sont de longueur fixe (à priori 3 cycles d&#039;horloge &#039;&#039;&#039;à valider&#039;&#039;&#039; lors des essais du système de base)&lt;br /&gt;
* une interruption est générée en cas de dépassement du temps de cycle d&#039;écriture ou de lecture&lt;br /&gt;
* le bus sera de type &#039;&#039;&#039;shared&#039;&#039;&#039; avec un seul maitre (le Wrapper i.MX).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les composants esclaves ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;Suite aux divers discussions issues de ce chapitre. L&#039;organisation et la présences des fichiers dans les répertoires &#039;&#039;&#039;doc&#039;&#039;&#039; et &#039;&#039;&#039;HAL&#039;&#039;&#039; n&#039;est pas encore établie. Ce chapitre sera encore à retravailler.&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;une IP puisse être facilement inclue dans le système, il faut une certaine organisation. Sinon, à moyen ou à long terme cette IP est morte parce qu&#039;elle sera difficilement exploitable et encore plus difficilement maintenable.&lt;br /&gt;
&lt;br /&gt;
Ce sont des notions qui ne sont pas simples à prendre en considération lors du développement d&#039;un nouveau projet, mais lorsque l&#039;on doit se replonger dans un travail fait par quelqu&#039;un d&#039;autre ou un projet qu&#039;on a laissé en sommeil pendant quelque temps, on est content d&#039;avoir quelque chose à quoi se raccrocher.&lt;br /&gt;
&lt;br /&gt;
Pour développer efficacement, il faut assurer une organisation logique, figée et compréhensible, et le plus simple dans ce genre de cas est de se baser sur la notion de répertoire. Voici les répertoires qui doivent être utilisés par une IP:&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: Ce répertoire va contenir toute la documentation nécessaire à l&#039;exploitation de l&#039;IP. On y trouvera une notice (&#039;&#039;&#039;readme.txt&#039;&#039;&#039;), un fichier de suivi de modification (&#039;&#039;&#039;ChangeLog.txt&#039;&#039;&#039;), un fichier contenant les évolutions futures prévues (&#039;&#039;&#039;todo.txt&#039;&#039;&#039;) ainsi que tout autre fichier estimé utile par le(s) créateur(s) de l&#039;IP.&lt;br /&gt;
* &#039;&#039;&#039;hdl&#039;&#039;&#039;: Ce répertoire va contenir tous les fichiers VHDL (ou Verilog) qui auront été développés spécifiquement pour cette IP.&lt;br /&gt;
* &#039;&#039;&#039;inc&#039;&#039;&#039;: Ce répertoire va contenir un fichier d&#039;en-tête ANSI C contenant l&#039;adresse de tous les registres interne de l&#039;IP pour permettre de créer simplement un programme en langage C permettant de contrôler l&#039;IP. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HAL&#039;&#039;&#039;: Ce répertoire va contenir un drivers ou un exemple de logiciel de base permettant l&#039;utilisation de l&#039;IP par un microprocesseur/contrôleur. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Ce composant esclave est le premier qui sera créé spécifiquement pour le système. Il sera capable de:&lt;br /&gt;
* prendre en compte jusqu&#039;à 16 sources d&#039;interruptions différentes&lt;br /&gt;
* réaliser l&#039;acquittement de chaque interruption individuellement&lt;br /&gt;
* masquer/autoriser chaque interruption individuellement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le composant disposera des registres suivants:&lt;br /&gt;
* &#039;&#039;&#039;isr_mask&#039;&#039;&#039;: registre d&#039;autorisation des interruptions. Chaque bit correspond à une interruption (bit0 =&amp;gt; IRQ0, bit1 =&amp;gt; IRQ1, etc.). Ce registre sera accessible en lecture et en écriture.&lt;br /&gt;
* &#039;&#039;&#039;isr_pend&#039;&#039;&#039;: ce registre est à double emploi&lt;br /&gt;
** &#039;&#039;&#039;en lecture&#039;&#039;&#039;: Les interruptions en attente de traitement&lt;br /&gt;
** &#039;&#039;&#039;en écriture&#039;&#039;&#039;: Acquittement des interruptions. Chaque bit à 1 va acquitter l&#039;interruption correspondante.&lt;br /&gt;
&lt;br /&gt;
== Le script / programme d&#039;assemblage des IP ==&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant parler du coeur du système, du moins de la partie la plus visible de l&#039;iceberg ;-)&lt;br /&gt;
&lt;br /&gt;
La première des priorités, sera de trouver un nom pour cet outil qui reste un peu dans l&#039;esprit du projet. Voici quelques propositions, à vous de compléter ou de voter pour un nom ou plusieurs noms:&lt;br /&gt;
* Concerto&lt;br /&gt;
* Orchestra&lt;br /&gt;
&lt;br /&gt;
D&#039;après les derniers sondage, &#039;&#039;&#039;Orchestra&#039;&#039;&#039; serait finalement le nom retenu pour ce logiciel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Principe et fonctionnement ===&lt;br /&gt;
&lt;br /&gt;
Afin de de rendre tout ce système utilisable par le plus grand nombre, il faut être capable de proposer des outils qui vont simplifier la vie de l&#039;utilisateur final ainsi que de l&#039;intégrateur.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faudra créer un outil soit sous forme de script(s), soit sous forme de programme(s) qui va permettre de réaliser les tâches suivantes:&lt;br /&gt;
* Création/gestion d&#039;une bibliothèque de composants &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* Gestion d&#039;une liste de &#039;&#039;&#039;hardware Armadeus&#039;&#039;&#039;&lt;br /&gt;
* Edition d&#039;un &#039;&#039;&#039;système Armadeus&#039;&#039;&#039;&lt;br /&gt;
* Gestion d&#039;un projet&lt;br /&gt;
* Génération automatique du composant &#039;&#039;&#039;system&#039;&#039;&#039; qui sera implanté dans le FPGA&lt;br /&gt;
* Génération automatique d&#039;un banc de tests pour permettre la validation par ModelSim (ou autre logiciel de simulation HDL)&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;mapping mémoire&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La bibliothèque de composants ===&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;un composant, c&#039;est-à-dire une IP, soit exploitable par le système, il faut passer par une phase d&#039;intégration qui va permettre de décrire ce composant:&lt;br /&gt;
* Nom de l&#039;IP&lt;br /&gt;
* Description&lt;br /&gt;
* Version&lt;br /&gt;
* Identification des fichiers HDL utilisés (VHDL ou Verilog)&lt;br /&gt;
* Identification du fichier &#039;&#039;&#039;Top&#039;&#039;&#039; (le point d&#039;entrée de l&#039;IP)&lt;br /&gt;
* Identification des paramètres &#039;&#039;&#039;&#039;&#039;GENERIC&#039;&#039;&#039;&#039;&#039; (dans le cas d&#039;une IP en VHDL):&lt;br /&gt;
** Type de paramètre (entier, std_logic, etc)&lt;br /&gt;
** Valeur par défaut&lt;br /&gt;
** Valeurs ou plages de valeurs autorisées&lt;br /&gt;
** Description du paramètre&lt;br /&gt;
* Identification des signaux Wishbone utilisés par le composant&lt;br /&gt;
* Identification du type (maitre ou esclave) et du nombre d&#039;interfaces Wishbone utilisés par ce composant&lt;br /&gt;
* Identification des registres internes&lt;br /&gt;
** Adresse (Offset par rapport à l&#039;adresse de base)&lt;br /&gt;
** Taille (8 ou 16 bits)&lt;br /&gt;
** Nom et/ou description&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toutes ces informations seront alors sauvegardées dans un fichier, de préférence dans un format compréhensible à l&#039;aide de n&#039;importe quel éditeur de texte (XML, &#039;&#039;fichier INI&#039;&#039; ou &#039;&#039;fichier plat&#039;&#039;). qui se trouvera dans la racine du répertoire utilisé pour ce composant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Chaque composant identifié par le logiciel se trouvera dans un sous-répertoire (ou dans un fichier archive ?!?) placé dans le répertoire &#039;&#039;&#039;Armadeus Components&#039;&#039;&#039;, chaque sous-répertoire (ou archive) de composant contiendra les données suivantes:&lt;br /&gt;
* Le fichier de description du composant &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* un répertoire &#039;&#039;&#039;HDL&#039;&#039;&#039; avec les fichiers VHDL/Verilog de l&#039;IP&lt;br /&gt;
* un répertoire &#039;&#039;&#039;HAL&#039;&#039;&#039; avec les fichiers d&#039;un drivers de base (pour Linux ou &#039;&#039;générique&#039;&#039; ?!?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le gestionnaire de composants Armadeus doit être capable de réaliser les opérations suivantes:&lt;br /&gt;
* Importer un composant ou une liste de composants&lt;br /&gt;
* Exporter un composant ou une liste de composants&lt;br /&gt;
* Gérer des versions de composants (à voir si cette fonctionnalité est importante/utile)&lt;br /&gt;
* Permettre l&#039;ajout/création de composants&lt;br /&gt;
* Permettre de supprimer un composant&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire de plateformes ===&lt;br /&gt;
&lt;br /&gt;
Il faut avoir confiance dans l&#039;avenir, pour l&#039;instant nous ne disposons que d&#039;une seul plateforme de travail, mais ce n&#039;est qu&#039;un début et très certainement d&#039;autres cartes à base de l&#039;i.MX et d&#039;un FPGA vont voir le jour.&lt;br /&gt;
&lt;br /&gt;
Il faut donc prévoir d&#039;ores et déjà cette possibilité et proposer un outil qui va permettre de définir une plateforme. Chaque descripteur de plateforme devra fournir les informations suivantes:&lt;br /&gt;
* Type de FPGA&lt;br /&gt;
* Emplacement (niveau FPGA, c&#039;est-à-dire la broche utilisée), type (sortie i.MX, oscillateur ou quartz) et fréquence (ou plage de fréquence ?!?) des horloges&lt;br /&gt;
* Emplacements/broche du FPGA utilisées ainsi que leur fonctionnalité (signal Wishbone, comme d&#039;un composant externe, signal d&#039;interruption, etc.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toutes ces informations seront utilisées par la suite lors de la création d&#039;un projet &#039;&#039;&#039;Orchestra/Armadeus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire de projet ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Générateur de fichiers ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gestionnaire d&#039;interruption ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ce chapitre est donné à titre informatif/propositon et ne tiens pas lieu de spécification.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier la vie des programmeurs systèmes, il faut pouvoir offrir un mécanisme simple de mise en place et de gestion des demandes d&#039;interruption du FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour cela, je propose la solution suivante:&lt;br /&gt;
* Mise en place d&#039;un gestionnaire d&#039;interruption générique pour le FPGA. Ce gestionnaire d&#039;interruption sera capable de lire le registre d&#039;interruption (lecture de &#039;&#039;&#039;isr_pend&#039;&#039;&#039;) et de déterminer les interruptions à traiter (via &#039;&#039;&#039;isr_mask&#039;&#039;&#039;). Il va en suite aiguiller l&#039;exécution de la routine d&#039;interruption vers les routines adéquates pour chaque bit d&#039;interruption valide. L&#039;interruption traitée sera alors acquitée (écriture vers &#039;&#039;&#039;isr_pend&#039;&#039;&#039;).&lt;br /&gt;
* Création d&#039;une routine &#039;&#039;&#039;&#039;&#039;d&#039;enregistrement de vecteur d&#039;interruption&#039;&#039;&#039;&#039;&#039;. Cette routine va permettre d&#039;ajouter une routine de traitement d&#039;interruption pour un bit d&#039;interruption donné. Pour cela il faudra lui fournir les informations suivantes (via une structure ?!?):&lt;br /&gt;
** Le numéro du bit d&#039;interruption (0 à 31)&lt;br /&gt;
** La routine de traitement d&#039;interruption pour ce driver&lt;br /&gt;
** Un paramètre additionnel à fournir à la routine de traitement d&#039;interruption (pointeur de type &#039;&#039;&#039;&#039;&#039;void *&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
** Le nom du drivers (optionnel, permet d&#039;identifier/visualiser les drivers installer éventuellement)&lt;br /&gt;
* Création d&#039;une routine de validation d&#039;une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour masquer une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour désinstaller une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine ou méthode pour visualiser tous les drivers Wishbone installés:&lt;br /&gt;
** Leur numéro&lt;br /&gt;
** Leur nom&lt;br /&gt;
** Leur état (validé/masqué)&lt;br /&gt;
** Le nombre de fois qu&#039;ils ont été appelé&lt;br /&gt;
** etc.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1800</id>
		<title>FpgaArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1800"/>
		<updated>2006-12-22T22:18:28Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Les composants esclaves */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spécifications de conception du FPGA =&lt;br /&gt;
&lt;br /&gt;
== Evolutions ==&lt;br /&gt;
&lt;br /&gt;
2006/12/21: MAJ en fonction des remarques de tout le monde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== But ==&lt;br /&gt;
&lt;br /&gt;
Cette page a été créée pour permettre à tous les membres de l&#039;association de discuter de l&#039;architecture qui va être mise en place pour le FPGA présent sur la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Cette espace doit être vu comme un espace d&#039;échange d&#039;idées. Tout le monde est convié à y participer. Il est préférable d&#039;avoir quelques connaissances en électronique et sur les langages HDL (VHDL ou Verilog), mais ce n&#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
Bonne lecture et merci pour votre participation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les grandes lignes ==&lt;br /&gt;
&lt;br /&gt;
Le FPGA de la carte APF9328 est là pour offrir le maximum de souplesse au projet &#039;&#039;&#039;Armadeus&#039;&#039;&#039; et permettre d&#039;implanter des fonctionnalités coté &#039;&#039;&#039;matériel&#039;&#039;&#039; qui seraient trop pénalisantes ou impossibles à implanter coté &#039;&#039;&#039;logiciel&#039;&#039;&#039;. Bien entendu, pour que cela soit exploitable, il faut également disposer d&#039;un lien entre le FPGA et le processeur i.MX.&lt;br /&gt;
&lt;br /&gt;
Pour réaliser cela, il faut mettre en place un bus de communication entre le FPGA et l&#039;i.MX. Ce bus de communication va permettre le pilotage des fonctionnalités qui seront implantées dans le FPGA. Bref, il faut recréer à l&#039;intérieur du FPGA un bus tel qu&#039;il existe entre l&#039;i.MX et les différents composants de la carte (RAM, Flash, USB, Ethernet, etc.).&lt;br /&gt;
&lt;br /&gt;
Pour gagner en temps de développement et pour pouvoir récupérer des fonctionnalités ou IP (Intellectual Property) déjà existantes, le bus Wishbone a été retenu. Ce bus, dont les spécification ont été placées dans le domaine public, a été conçu spécifiquement pour ce genre de configuration et sur le site &#039;&#039;&#039;[http://www.opencores.com www.opencores.com]&#039;&#039;&#039; plusieurs IP compatibles avec les spécifications Wishbone sont disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
La spécification Wishbone décrit un certain nombre de composants de base:&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;maitres&#039;&#039;&#039;, ces interfaces sont implantés dans des composants qui seront alors capable d&#039;initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;esclaves&#039;&#039;&#039;, ces interfaces sont implantés dans des composants capables de répondre à des demandes de transferts&lt;br /&gt;
* Un composant &#039;&#039;&#039;syscon&#039;&#039;&#039;, ce composant va générer le signal d&#039;horloge qui sera utilisé par tous les composants/interfaces du bus ainsi que le signal de RESET synchrone.&lt;br /&gt;
* Un macro composant &#039;&#039;&#039;intercon&#039;&#039;&#039;, ce composant va gérer la connexion de toutes les interfaces maitres et esclaves qui composent le bus interne. Il prend en charge :&lt;br /&gt;
** Le décodage/transcodage d&#039;adresse (génération des signaux A0 à A3 selon le mode d&#039;adressage 8/16/32/64 bits)&lt;br /&gt;
** le routage du bus de données entre les différentes interfaces maitres et esclaves (conversion big endian/little endian, etc)&lt;br /&gt;
** le routage/génération des signaux de contrôle du bus (Read, Write, Chip Select, Output Enable, ACK, etc.)&lt;br /&gt;
* Un composant &#039;&#039;&#039;arbitre&#039;&#039;&#039;, ce composant va permettre de partager l&#039;accès au bus ou à un composant de type esclave qui est partagé par plusieurs composants de type maitre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les spécifications du bus Wishbone permettent de créer différents types de bus:&lt;br /&gt;
* &#039;&#039;&#039;Point to Point&#039;&#039;&#039;: C&#039;est le type de bus le plus simple possibl, un composant avec une interface type maitre connecté à un composant avec une interface de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Data Flow&#039;&#039;&#039;: C&#039;est un bus en cascade, à un bout on trouve un composant avec une interface de type maître et à l&#039;autre bout un composant avec une interface de type esclave. Entre les deux composant se trouve une chaine d&#039;un ou plusieurs composants avec une interface de type maitre et de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;: C&#039;est un bus sur lequel plusieurs composants sont connectés dessus. Tous les composants se partagent ce bus. Si plusieurs &#039;&#039;maitres&#039;&#039; sont connectés sur ce bus, un seul pourra initier un transfert à un instant donné.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: C&#039;est également un bus de type partagé, par contre dans se cas, on dispose de plusieurs bus. Chaque maitre utilise sont propre bus pour communiquer avec ces esclaves. On peut donc avoir plusieurs transferts en simultané. Le seul cas de blocage/arbitrage est le transfert de plusieurs maitre avec le même esclave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe également un certain nombre de mécanismes dans la spécification Wishbone pour permettre d&#039;optimiser les temps de transferts sur le bus. Ces optimisations sont de plusieurs nature:&lt;br /&gt;
* utilisation de signaux &#039;&#039;&#039;ACK&#039;&#039;&#039;, &#039;&#039;&#039;ERR&#039;&#039;&#039; et &#039;&#039;&#039;RTY&#039;&#039;&#039; pour signaler la fin de transfert&lt;br /&gt;
* les &#039;&#039;&#039;Registered Feedback Bus Cycles&#039;&#039;&#039;, qui permettent de gagner un cycle d&#039;horloge pour des transferts consécutifs&lt;br /&gt;
* les transferts en mode &#039;&#039;&#039;Burst&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Le lien i.MX &amp;lt;=&amp;gt; FPGA ==&lt;br /&gt;
&lt;br /&gt;
La communication entre l&#039;i.MX et le FPGA passe par les signaux suivants (à vérifier):&lt;br /&gt;
* des signaux de contrôle: &amp;lt;strike&amp;gt;RW_n&amp;lt;/strike&amp;gt;, OE_n, EB_n[3..2] et CS1_n&lt;br /&gt;
* le bus de données sur 16 bits (D[15..0])&lt;br /&gt;
* le bus d&#039;adresses sur 12 bits (A[12..1])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ces signaux sont alors utilisés pour créer une interface Wishbone maitre qui va permettre de communiquer efficacement avec les autres IPs contenus dans le FPGA qui implémenterons une interface wishbone de type esclave.&lt;br /&gt;
&lt;br /&gt;
Etant donné les erratas du composant i.MX  concernant le signal DTACK, il n&#039;est pas possible d&#039;implanter une interface Wishbone maitre &#039;&#039;classique&#039;&#039;. Ceci entraine les limitations suivantes:&lt;br /&gt;
* Pas possible d&#039;utiliser le signal &#039;&#039;&#039;ACK&#039;&#039;&#039; Wishbone pour terminer le transfert entre FPGA et i.MX.&lt;br /&gt;
* Pas possible de mettre en place des optimisations du temps de transfert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce problème, il faudra s&#039;assurer que toutes les interfaces esclaves qui seront connectées à l&#039;interface maitre du composant Wishbone i.MX répondent dans un temps fixe donné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme le bus Wishbone est un bus entièrement synchrone, le temps minimal d&#039;un transfert est de 2 cycles de l&#039;horloge Wishbone. Il faut ajouter à cela, un cycle pour la synchronisation des signaux du bus i.MX. Cela nous fait donc un minimum de 3 cycles Wishbone pour un transfert entre le FPGA et l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
Etant donné les performances des FPGA actuels, on peut tabler sur une fréquence de fonctionnement d&#039;au moins 100MHz pour le bus Wishbone. Cela nous donne donc un taux de transfert approximatif de 66 Moctets/sec (100MHz * 16bits / 3).&lt;br /&gt;
&lt;br /&gt;
== La composition du système Wishbone ==&lt;br /&gt;
&lt;br /&gt;
[[Image:FPGA_Armadeus.png]]&lt;br /&gt;
&lt;br /&gt;
Le système Wishbone qui sera implanté dans le FPGA se compose des éléments suivants:&lt;br /&gt;
* &#039;&#039;&#039;i.MX Wrapper&#039;&#039;&#039;: L&#039;interface i.MX vers le bus Wishbone&lt;br /&gt;
* &#039;&#039;&#039;Syscon&#039;&#039;&#039;: Ce composant va gérer les signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; (généré par une PLL ou directement issu de l&#039;i.MX) et &#039;&#039;&#039;RESET&#039;&#039;&#039; (synchrone).&lt;br /&gt;
* &#039;&#039;&#039;Intercon&#039;&#039;&#039;: Ce composant devra être généré automatiquement par une moulinette, il va faire le lien entre tous les composants faisant parti du &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Gestionnaire d&#039;interruption&#039;&#039;&#039;: Ce composant est un &#039;&#039;&#039;esclave wishbone&#039;&#039;&#039; et va centraliser toutes les demandes d&#039;interruption et les remonter vers l&#039;i.MX.&lt;br /&gt;
* &#039;&#039;&#039;Esclaves whisbone&#039;&#039;&#039;: Ceci représentent tous les autres composants avec une interface wishbone esclave qui sont accessibles via le wrapper i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur le diagramme, il manque un certain nombre de choses:&lt;br /&gt;
* Les signaux &#039;&#039;non wishbone&#039;&#039; en entrée ou en sortie sur les &#039;&#039;&#039;esclaves wishbone&#039;&#039;&#039;&lt;br /&gt;
* Le macro composant &#039;&#039;&#039;système wishbone&#039;&#039;&#039;. Ce macro composant est celui qui sera ensuite instancié dans le design du FPGA. Sur ce composant ne seront visibles que les signaux &#039;&#039;externes&#039;&#039; au système:&lt;br /&gt;
** Les signaux issus de l&#039;i.MX&lt;br /&gt;
** &amp;lt;strike&amp;gt;Le signal RESET (en entrée) qui sera synchronisé sur l&#039;horloge système&amp;lt;/strike&amp;gt; Le signal RESET synchrone du bus Wishbone sera directement généré par le composant syscon à l&#039;aide d&#039;une simple machine d&#039;état.&lt;br /&gt;
** Le signal CLK (en entrée) qui sera l&#039;horloge utilisée pour la génération des signaux Wishbone&lt;br /&gt;
** Le signal IRQ (en sortie) qui sera utilisé pour remonter les demandes d&#039;interruption vers l&#039;i.MX&lt;br /&gt;
** Les signaux d&#039;entrée et de sortie spécifiques aux autres composants connectés sur le bus Wishbone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt de créer le composant &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;, est que cela simplifie la vision dans l&#039;outil conception du FPGA. Il ne suffit plus alors qu&#039;à relier les signaux sur les broches correspondantes du FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== i.MX Wrapper ===&lt;br /&gt;
&lt;br /&gt;
Ce composant est le point d&#039;accès au bus Wishbone pour l&#039;i.MX et sera le seul à disposer d&#039;une interface Wishbone maitre.&lt;br /&gt;
&lt;br /&gt;
Les fonctions de ce composants sont:&lt;br /&gt;
* synchronisation des signaux issus de l&#039;i.MX. Ceci est primordial pour assurer la stabilité de tout le système Wishbone. De plus, le bus de sortie étant asynchrone (l&#039;horloge de génération des signaux n&#039;est pas véhiculée), la resynchronisation des signaux par rapport à l&#039;horloge du bus s&#039;impose.&lt;br /&gt;
* gestion du bus de données en 3 états.&lt;br /&gt;
* conversion des signaux de contrôle du bus i.MX en signaux Wishbone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syscom ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est le composant le plus simple du système &amp;lt;strike&amp;gt;, il ne fait que synchroniser le signal RESET en entrée avec le signal d&#039;horloge du système&amp;lt;/strike&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Il va être en charge de la génération du signal RESET synchrone pour le bus Wishbone.&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;horloge en entrée du composant &#039;&#039;&#039;syscon&#039;&#039;&#039; sera celui utilisé pour le fonctionnement du bus Wishbone. La fréquence du signal d&#039;horloge devra être assez élevée pour permettre le traitement des signaux issus de l&#039;i.MX. Cela va dépendre de la configuration du chip select utilisé (CS5).&lt;br /&gt;
&lt;br /&gt;
La source du signal d&#039;horloge reste encore à définir, les choix possibles sont:&lt;br /&gt;
* directement issu de l&#039;i.MX&lt;br /&gt;
* utilisation d&#039;un DCM du Spartan 3&lt;br /&gt;
&lt;br /&gt;
Le choix définitif dépendra principalement des essais &#039;&#039;grandeur nature&#039;&#039; lors de la génération des premiers systèmes whisbone durant la phase de mise en place des composants de base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Intercon ===&lt;br /&gt;
&lt;br /&gt;
Ce composant a la particularité qu&#039;il sera créé automatiquement par un outil (script ou programme). &#039;&#039;&#039;Intercom&#039;&#039;&#039; a comme fonctionnalités:&lt;br /&gt;
* Le décodage d&#039;adresse pour la sélection des différents esclaves du système&lt;br /&gt;
* Le routage des bus d&#039;adresses et de données vers les différents esclaves&lt;br /&gt;
* La génération des signaux de contrôle pour les différents esclaves.&lt;br /&gt;
&lt;br /&gt;
Etant donné les limitations induites par les erratas de l&#039;i.MX, le composant &#039;&#039;&#039;intercom&#039;&#039;&#039; remplira les fonctionnalités suivantes:&lt;br /&gt;
* le bus de données est figé sur 16 bits&lt;br /&gt;
* les cycles de lecture et d&#039;écriture sont de longueur fixe (à priori 3 cycles d&#039;horloge &#039;&#039;&#039;à valider&#039;&#039;&#039; lors des essais du système de base)&lt;br /&gt;
* une interruption est générée en cas de dépassement du temps de cycle d&#039;écriture ou de lecture&lt;br /&gt;
* le bus sera de type &#039;&#039;&#039;shared&#039;&#039;&#039; avec un seul maitre (le Wrapper i.MX).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les composants esclaves ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;Suite aux divers discussions issues de ce chapitre. L&#039;organisation et la présences des fichiers dans les répertoires &#039;&#039;&#039;doc&#039;&#039;&#039; et &#039;&#039;&#039;HAL&#039;&#039;&#039; n&#039;est pas encore établie. Ce chapitre sera encore à retravailler.&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;une IP puisse être facilement inclue dans le système, il faut une certaine organisation. Sinon, à moyen ou à long terme cette IP est morte parce qu&#039;elle sera difficilement exploitable et encore plus difficilement maintenable.&lt;br /&gt;
&lt;br /&gt;
Ce sont des notions qui ne sont pas simples à prendre en considération lors du développement d&#039;un nouveau projet, mais lorsque l&#039;on doit se replonger dans un travail fait par quelqu&#039;un d&#039;autre ou un projet qu&#039;on a laissé en sommeil pendant quelque temps, on est content d&#039;avoir quelque chose à quoi se raccrocher.&lt;br /&gt;
&lt;br /&gt;
Pour développer efficacement, il faut assurer une organisation logique, figée et compréhensible, et le plus simple dans ce genre de cas est de se baser sur la notion de répertoire. Voici les répertoires qui doivent être utilisés par une IP:&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: Ce répertoire va contenir toute la documentation nécessaire à l&#039;exploitation de l&#039;IP. On y trouvera une notice (&#039;&#039;&#039;readme.txt&#039;&#039;&#039;), un fichier de suivi de modification (&#039;&#039;&#039;ChangeLog.txt&#039;&#039;&#039;), un fichier contenant les évolutions futures prévues (&#039;&#039;&#039;todo.txt&#039;&#039;&#039;) ainsi que tout autre fichier estimé utile par le(s) créateur(s) de l&#039;IP.&lt;br /&gt;
* &#039;&#039;&#039;hdl&#039;&#039;&#039;: Ce répertoire va contenir tous les fichiers VHDL (ou Verilog) qui auront été développés spécifiquement pour cette IP.&lt;br /&gt;
* &#039;&#039;&#039;inc&#039;&#039;&#039;: Ce répertoire va contenir un fichier d&#039;en-tête ANSI C contenant l&#039;adresse de tous les registres interne de l&#039;IP pour permettre de créer simplement un programme en langage C permettant de contrôler l&#039;IP. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HAL&#039;&#039;&#039;: Ce répertoire va contenir un drivers ou un exemple de logiciel de base permettant l&#039;utilisation de l&#039;IP par un microprocesseur/contrôleur. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Ce composant esclave est le premier qui sera créé spécifiquement pour le système. Il sera capable de:&lt;br /&gt;
* prendre en compte jusqu&#039;à 16 sources d&#039;interruptions différentes&lt;br /&gt;
* réaliser l&#039;acquittement de chaque interruption individuellement&lt;br /&gt;
* masquer/autoriser chaque interruption individuellement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le composant disposera des registres suivants:&lt;br /&gt;
* &#039;&#039;&#039;isr_mask&#039;&#039;&#039;: registre d&#039;autorisation des interruptions. Chaque bit correspond à une interruption (bit0 =&amp;gt; IRQ0, bit1 =&amp;gt; IRQ1, etc.). Ce registre sera accessible en lecture et en écriture.&lt;br /&gt;
* &#039;&#039;&#039;isr_pend&#039;&#039;&#039;: ce registre est à double emploi&lt;br /&gt;
** &#039;&#039;&#039;en lecture&#039;&#039;&#039;: Les interruptions en attente de traitement&lt;br /&gt;
** &#039;&#039;&#039;en écriture&#039;&#039;&#039;: Acquittement des interruptions. Chaque bit à 1 va acquitter l&#039;interruption correspondante.&lt;br /&gt;
&lt;br /&gt;
== Le script / programme d&#039;assemblage des IP ==&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant parler du coeur du système, du moins de la partie la plus visible de l&#039;iceberg ;-)&lt;br /&gt;
&lt;br /&gt;
La première des priorités, sera de trouver un nom pour cet outil qui reste un peu dans l&#039;esprit du projet. Voici quelques propositions, à vous de compléter ou de voter pour un nom ou plusieurs noms:&lt;br /&gt;
* Concerto&lt;br /&gt;
* Orchestra&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Principe et fonctionnement ===&lt;br /&gt;
&lt;br /&gt;
Afin de de rendre tout ce système utilisable par le plus grand nombre, il faut être capable de proposer des outils qui vont simplifier la vie de l&#039;utilisateur final ainsi que de l&#039;intégrateur.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faudra créer un outil soit sous forme de script(s), soit sous forme de programme(s) qui va permettre de réaliser les tâches suivantes:&lt;br /&gt;
* Edition d&#039;un &#039;&#039;&#039;système wishbone&#039;&#039;&#039;, c&#039;est-à-dire&lt;br /&gt;
** Ajout/suppression de composants &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039; (c&#039;est comme HD Ready mais en mieux ;-) ).&lt;br /&gt;
** Spécification de la valeur des paramètres &#039;&#039;&#039;GENERIC&#039;&#039;&#039; de chaque composant s&#039;il y en a.&lt;br /&gt;
** Configuration des adresses de base de chaque composant placé sur le bus Wishbone. La plage d&#039;adresses étant donné par la taille du bus d&#039;adresses du composant.&lt;br /&gt;
** Affectation du bit d&#039;interruption pour chaque composant ayant besoin de générer une interruption.&lt;br /&gt;
** Affectation des signaux non wishbone d&#039;entrée et de sortie des composants aux broches du FPGA si cela est possible&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;&#039;&#039;mapping&#039;&#039;&#039;&#039;&#039; contenant:&lt;br /&gt;
** Un &#039;&#039;Time Stamp&#039;&#039; pour connaitre la date de création/génération du système&lt;br /&gt;
** Le fréquence de base du bus Wishbone&lt;br /&gt;
** L&#039;adresse de base de chaque composant&lt;br /&gt;
** Le niveau d&#039;interruption affecté à chaque composant&lt;br /&gt;
* Génération du macro composant &#039;&#039;&#039;syscon&#039;&#039;&#039; qui va faire le lien (routage) entre les différents composants sus le bus Wishbone.&lt;br /&gt;
* Génération du composant &#039;&#039;&#039;system&#039;&#039;&#039; qui va regrouper toutes les connexions internes au système que l&#039;on est en train de créer dans un seul fichier HDL (VHDL ou Verilog). C&#039;est ce fichier qui sera alors instancier dans &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039; avec éventuellement d&#039;autres IP qui n&#039;ont pas de lien direct avec l&#039;i.MX&lt;br /&gt;
* Génération d&#039;un fichier script &#039;&#039;&#039;tcl&#039;&#039;&#039; pour la création du projet de base pour &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039;. Ceci va éviter les erreurs de connexions sur les broches du FPGA, au moins pour la partie relative à l&#039;i.MX. Ce script sera directement exécutable par l&#039;outil fourni par Xilinx.&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;Makefile&#039;&#039;&#039; pour la création des --?? DLL ?? (&amp;lt;- tu veux dire drivers Linux ?)-- &#039;&#039;&#039;&#039;&#039;host drivers&#039;&#039;&#039;&#039;&#039; d&#039;accès au système via programme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ce chapitre est donné à titre informatif/propositon et ne tiens pas lieu de spécification.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier la vie des programmeurs systèmes, il faut pouvoir offrir un mécanisme simple de mise en place et de gestion des demandes d&#039;interruption du FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour cela, je propose la solution suivante:&lt;br /&gt;
* Mise en place d&#039;un gestionnaire d&#039;interruption générique pour le FPGA. Ce gestionnaire d&#039;interruption sera capable de lire le registre d&#039;interruption (lecture de &#039;&#039;&#039;isr_pend&#039;&#039;&#039;) et de déterminer les interruptions à traiter (via &#039;&#039;&#039;isr_mask&#039;&#039;&#039;). Il va en suite aiguiller l&#039;exécution de la routine d&#039;interruption vers les routines adéquates pour chaque bit d&#039;interruption valide. L&#039;interruption traitée sera alors acquitée (écriture vers &#039;&#039;&#039;isr_pend&#039;&#039;&#039;).&lt;br /&gt;
* Création d&#039;une routine &#039;&#039;&#039;&#039;&#039;d&#039;enregistrement de vecteur d&#039;interruption&#039;&#039;&#039;&#039;&#039;. Cette routine va permettre d&#039;ajouter une routine de traitement d&#039;interruption pour un bit d&#039;interruption donné. Pour cela il faudra lui fournir les informations suivantes (via une structure ?!?):&lt;br /&gt;
** Le numéro du bit d&#039;interruption (0 à 31)&lt;br /&gt;
** La routine de traitement d&#039;interruption pour ce driver&lt;br /&gt;
** Un paramètre additionnel à fournir à la routine de traitement d&#039;interruption (pointeur de type &#039;&#039;&#039;&#039;&#039;void *&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
** Le nom du drivers (optionnel, permet d&#039;identifier/visualiser les drivers installer éventuellement)&lt;br /&gt;
* Création d&#039;une routine de validation d&#039;une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour masquer une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour désinstaller une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine ou méthode pour visualiser tous les drivers Wishbone installés:&lt;br /&gt;
** Leur numéro&lt;br /&gt;
** Leur nom&lt;br /&gt;
** Leur état (validé/masqué)&lt;br /&gt;
** Le nombre de fois qu&#039;ils ont été appelé&lt;br /&gt;
** etc.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1799</id>
		<title>FpgaArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1799"/>
		<updated>2006-12-22T21:35:17Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* La composition du système Wishbone */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spécifications de conception du FPGA =&lt;br /&gt;
&lt;br /&gt;
== Evolutions ==&lt;br /&gt;
&lt;br /&gt;
2006/12/21: MAJ en fonction des remarques de tout le monde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== But ==&lt;br /&gt;
&lt;br /&gt;
Cette page a été créée pour permettre à tous les membres de l&#039;association de discuter de l&#039;architecture qui va être mise en place pour le FPGA présent sur la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Cette espace doit être vu comme un espace d&#039;échange d&#039;idées. Tout le monde est convié à y participer. Il est préférable d&#039;avoir quelques connaissances en électronique et sur les langages HDL (VHDL ou Verilog), mais ce n&#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
Bonne lecture et merci pour votre participation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les grandes lignes ==&lt;br /&gt;
&lt;br /&gt;
Le FPGA de la carte APF9328 est là pour offrir le maximum de souplesse au projet &#039;&#039;&#039;Armadeus&#039;&#039;&#039; et permettre d&#039;implanter des fonctionnalités coté &#039;&#039;&#039;matériel&#039;&#039;&#039; qui seraient trop pénalisantes ou impossibles à implanter coté &#039;&#039;&#039;logiciel&#039;&#039;&#039;. Bien entendu, pour que cela soit exploitable, il faut également disposer d&#039;un lien entre le FPGA et le processeur i.MX.&lt;br /&gt;
&lt;br /&gt;
Pour réaliser cela, il faut mettre en place un bus de communication entre le FPGA et l&#039;i.MX. Ce bus de communication va permettre le pilotage des fonctionnalités qui seront implantées dans le FPGA. Bref, il faut recréer à l&#039;intérieur du FPGA un bus tel qu&#039;il existe entre l&#039;i.MX et les différents composants de la carte (RAM, Flash, USB, Ethernet, etc.).&lt;br /&gt;
&lt;br /&gt;
Pour gagner en temps de développement et pour pouvoir récupérer des fonctionnalités ou IP (Intellectual Property) déjà existantes, le bus Wishbone a été retenu. Ce bus, dont les spécification ont été placées dans le domaine public, a été conçu spécifiquement pour ce genre de configuration et sur le site &#039;&#039;&#039;[http://www.opencores.com www.opencores.com]&#039;&#039;&#039; plusieurs IP compatibles avec les spécifications Wishbone sont disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
La spécification Wishbone décrit un certain nombre de composants de base:&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;maitres&#039;&#039;&#039;, ces interfaces sont implantés dans des composants qui seront alors capable d&#039;initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;esclaves&#039;&#039;&#039;, ces interfaces sont implantés dans des composants capables de répondre à des demandes de transferts&lt;br /&gt;
* Un composant &#039;&#039;&#039;syscon&#039;&#039;&#039;, ce composant va générer le signal d&#039;horloge qui sera utilisé par tous les composants/interfaces du bus ainsi que le signal de RESET synchrone.&lt;br /&gt;
* Un macro composant &#039;&#039;&#039;intercon&#039;&#039;&#039;, ce composant va gérer la connexion de toutes les interfaces maitres et esclaves qui composent le bus interne. Il prend en charge :&lt;br /&gt;
** Le décodage/transcodage d&#039;adresse (génération des signaux A0 à A3 selon le mode d&#039;adressage 8/16/32/64 bits)&lt;br /&gt;
** le routage du bus de données entre les différentes interfaces maitres et esclaves (conversion big endian/little endian, etc)&lt;br /&gt;
** le routage/génération des signaux de contrôle du bus (Read, Write, Chip Select, Output Enable, ACK, etc.)&lt;br /&gt;
* Un composant &#039;&#039;&#039;arbitre&#039;&#039;&#039;, ce composant va permettre de partager l&#039;accès au bus ou à un composant de type esclave qui est partagé par plusieurs composants de type maitre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les spécifications du bus Wishbone permettent de créer différents types de bus:&lt;br /&gt;
* &#039;&#039;&#039;Point to Point&#039;&#039;&#039;: C&#039;est le type de bus le plus simple possibl, un composant avec une interface type maitre connecté à un composant avec une interface de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Data Flow&#039;&#039;&#039;: C&#039;est un bus en cascade, à un bout on trouve un composant avec une interface de type maître et à l&#039;autre bout un composant avec une interface de type esclave. Entre les deux composant se trouve une chaine d&#039;un ou plusieurs composants avec une interface de type maitre et de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;: C&#039;est un bus sur lequel plusieurs composants sont connectés dessus. Tous les composants se partagent ce bus. Si plusieurs &#039;&#039;maitres&#039;&#039; sont connectés sur ce bus, un seul pourra initier un transfert à un instant donné.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: C&#039;est également un bus de type partagé, par contre dans se cas, on dispose de plusieurs bus. Chaque maitre utilise sont propre bus pour communiquer avec ces esclaves. On peut donc avoir plusieurs transferts en simultané. Le seul cas de blocage/arbitrage est le transfert de plusieurs maitre avec le même esclave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe également un certain nombre de mécanismes dans la spécification Wishbone pour permettre d&#039;optimiser les temps de transferts sur le bus. Ces optimisations sont de plusieurs nature:&lt;br /&gt;
* utilisation de signaux &#039;&#039;&#039;ACK&#039;&#039;&#039;, &#039;&#039;&#039;ERR&#039;&#039;&#039; et &#039;&#039;&#039;RTY&#039;&#039;&#039; pour signaler la fin de transfert&lt;br /&gt;
* les &#039;&#039;&#039;Registered Feedback Bus Cycles&#039;&#039;&#039;, qui permettent de gagner un cycle d&#039;horloge pour des transferts consécutifs&lt;br /&gt;
* les transferts en mode &#039;&#039;&#039;Burst&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Le lien i.MX &amp;lt;=&amp;gt; FPGA ==&lt;br /&gt;
&lt;br /&gt;
La communication entre l&#039;i.MX et le FPGA passe par les signaux suivants (à vérifier):&lt;br /&gt;
* des signaux de contrôle: &amp;lt;strike&amp;gt;RW_n&amp;lt;/strike&amp;gt;, OE_n, EB_n[3..2] et CS1_n&lt;br /&gt;
* le bus de données sur 16 bits (D[15..0])&lt;br /&gt;
* le bus d&#039;adresses sur 12 bits (A[12..1])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ces signaux sont alors utilisés pour créer une interface Wishbone maitre qui va permettre de communiquer efficacement avec les autres IPs contenus dans le FPGA qui implémenterons une interface wishbone de type esclave.&lt;br /&gt;
&lt;br /&gt;
Etant donné les erratas du composant i.MX  concernant le signal DTACK, il n&#039;est pas possible d&#039;implanter une interface Wishbone maitre &#039;&#039;classique&#039;&#039;. Ceci entraine les limitations suivantes:&lt;br /&gt;
* Pas possible d&#039;utiliser le signal &#039;&#039;&#039;ACK&#039;&#039;&#039; Wishbone pour terminer le transfert entre FPGA et i.MX.&lt;br /&gt;
* Pas possible de mettre en place des optimisations du temps de transfert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce problème, il faudra s&#039;assurer que toutes les interfaces esclaves qui seront connectées à l&#039;interface maitre du composant Wishbone i.MX répondent dans un temps fixe donné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme le bus Wishbone est un bus entièrement synchrone, le temps minimal d&#039;un transfert est de 2 cycles de l&#039;horloge Wishbone. Il faut ajouter à cela, un cycle pour la synchronisation des signaux du bus i.MX. Cela nous fait donc un minimum de 3 cycles Wishbone pour un transfert entre le FPGA et l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
Etant donné les performances des FPGA actuels, on peut tabler sur une fréquence de fonctionnement d&#039;au moins 100MHz pour le bus Wishbone. Cela nous donne donc un taux de transfert approximatif de 66 Moctets/sec (100MHz * 16bits / 3).&lt;br /&gt;
&lt;br /&gt;
== La composition du système Wishbone ==&lt;br /&gt;
&lt;br /&gt;
[[Image:FPGA_Armadeus.png]]&lt;br /&gt;
&lt;br /&gt;
Le système Wishbone qui sera implanté dans le FPGA se compose des éléments suivants:&lt;br /&gt;
* &#039;&#039;&#039;i.MX Wrapper&#039;&#039;&#039;: L&#039;interface i.MX vers le bus Wishbone&lt;br /&gt;
* &#039;&#039;&#039;Syscon&#039;&#039;&#039;: Ce composant va gérer les signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; (généré par une PLL ou directement issu de l&#039;i.MX) et &#039;&#039;&#039;RESET&#039;&#039;&#039; (synchrone).&lt;br /&gt;
* &#039;&#039;&#039;Intercon&#039;&#039;&#039;: Ce composant devra être généré automatiquement par une moulinette, il va faire le lien entre tous les composants faisant parti du &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Gestionnaire d&#039;interruption&#039;&#039;&#039;: Ce composant est un &#039;&#039;&#039;esclave wishbone&#039;&#039;&#039; et va centraliser toutes les demandes d&#039;interruption et les remonter vers l&#039;i.MX.&lt;br /&gt;
* &#039;&#039;&#039;Esclaves whisbone&#039;&#039;&#039;: Ceci représentent tous les autres composants avec une interface wishbone esclave qui sont accessibles via le wrapper i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur le diagramme, il manque un certain nombre de choses:&lt;br /&gt;
* Les signaux &#039;&#039;non wishbone&#039;&#039; en entrée ou en sortie sur les &#039;&#039;&#039;esclaves wishbone&#039;&#039;&#039;&lt;br /&gt;
* Le macro composant &#039;&#039;&#039;système wishbone&#039;&#039;&#039;. Ce macro composant est celui qui sera ensuite instancié dans le design du FPGA. Sur ce composant ne seront visibles que les signaux &#039;&#039;externes&#039;&#039; au système:&lt;br /&gt;
** Les signaux issus de l&#039;i.MX&lt;br /&gt;
** &amp;lt;strike&amp;gt;Le signal RESET (en entrée) qui sera synchronisé sur l&#039;horloge système&amp;lt;/strike&amp;gt; Le signal RESET synchrone du bus Wishbone sera directement généré par le composant syscon à l&#039;aide d&#039;une simple machine d&#039;état.&lt;br /&gt;
** Le signal CLK (en entrée) qui sera l&#039;horloge utilisée pour la génération des signaux Wishbone&lt;br /&gt;
** Le signal IRQ (en sortie) qui sera utilisé pour remonter les demandes d&#039;interruption vers l&#039;i.MX&lt;br /&gt;
** Les signaux d&#039;entrée et de sortie spécifiques aux autres composants connectés sur le bus Wishbone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt de créer le composant &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;, est que cela simplifie la vision dans l&#039;outil conception du FPGA. Il ne suffit plus alors qu&#039;à relier les signaux sur les broches correspondantes du FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== i.MX Wrapper ===&lt;br /&gt;
&lt;br /&gt;
Ce composant est le point d&#039;accès au bus Wishbone pour l&#039;i.MX et sera le seul à disposer d&#039;une interface Wishbone maitre.&lt;br /&gt;
&lt;br /&gt;
Les fonctions de ce composants sont:&lt;br /&gt;
* synchronisation des signaux issus de l&#039;i.MX. Ceci est primordial pour assurer la stabilité de tout le système Wishbone. De plus, le bus de sortie étant asynchrone (l&#039;horloge de génération des signaux n&#039;est pas véhiculée), la resynchronisation des signaux par rapport à l&#039;horloge du bus s&#039;impose.&lt;br /&gt;
* gestion du bus de données en 3 états.&lt;br /&gt;
* conversion des signaux de contrôle du bus i.MX en signaux Wishbone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syscom ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est le composant le plus simple du système &amp;lt;strike&amp;gt;, il ne fait que synchroniser le signal RESET en entrée avec le signal d&#039;horloge du système&amp;lt;/strike&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Il va être en charge de la génération du signal RESET synchrone pour le bus Wishbone.&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;horloge en entrée du composant &#039;&#039;&#039;syscon&#039;&#039;&#039; sera celui utilisé pour le fonctionnement du bus Wishbone. La fréquence du signal d&#039;horloge devra être assez élevée pour permettre le traitement des signaux issus de l&#039;i.MX. Cela va dépendre de la configuration du chip select utilisé (CS5).&lt;br /&gt;
&lt;br /&gt;
La source du signal d&#039;horloge reste encore à définir, les choix possibles sont:&lt;br /&gt;
* directement issu de l&#039;i.MX&lt;br /&gt;
* utilisation d&#039;un DCM du Spartan 3&lt;br /&gt;
&lt;br /&gt;
Le choix définitif dépendra principalement des essais &#039;&#039;grandeur nature&#039;&#039; lors de la génération des premiers systèmes whisbone durant la phase de mise en place des composants de base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Intercon ===&lt;br /&gt;
&lt;br /&gt;
Ce composant a la particularité qu&#039;il sera créé automatiquement par un outil (script ou programme). &#039;&#039;&#039;Intercom&#039;&#039;&#039; a comme fonctionnalités:&lt;br /&gt;
* Le décodage d&#039;adresse pour la sélection des différents esclaves du système&lt;br /&gt;
* Le routage des bus d&#039;adresses et de données vers les différents esclaves&lt;br /&gt;
* La génération des signaux de contrôle pour les différents esclaves.&lt;br /&gt;
&lt;br /&gt;
Etant donné les limitations induites par les erratas de l&#039;i.MX, le composant &#039;&#039;&#039;intercom&#039;&#039;&#039; remplira les fonctionnalités suivantes:&lt;br /&gt;
* le bus de données est figé sur 16 bits&lt;br /&gt;
* les cycles de lecture et d&#039;écriture sont de longueur fixe (à priori 3 cycles d&#039;horloge &#039;&#039;&#039;à valider&#039;&#039;&#039; lors des essais du système de base)&lt;br /&gt;
* une interruption est générée en cas de dépassement du temps de cycle d&#039;écriture ou de lecture&lt;br /&gt;
* le bus sera de type &#039;&#039;&#039;shared&#039;&#039;&#039; avec un seul maitre (le Wrapper i.MX).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les composants esclaves ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;Suite aux divers discussions issues de ce chapitre. L&#039;organisation et la présences des fichiers dans les répertoires &#039;&#039;doc&#039;&#039;&#039; et &#039;&#039;&#039;HAL&#039;&#039;&#039; n&#039;est pas encore établie. Ce chapitre sera encore à retravailler.&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;une IP puisse être facilement inclue dans le système, il faut une certaine organisation. Sinon, à moyen ou à long terme cette IP est morte parce qu&#039;elle sera difficilement exploitable et encore plus difficilement maintenable.&lt;br /&gt;
&lt;br /&gt;
Ce sont des notions qui ne sont pas simples à prendre en considération lors du développement d&#039;un nouveau projet, mais lorsque l&#039;on doit se replonger dans un travail fait par quelqu&#039;un d&#039;autre ou un projet qu&#039;on a laissé en sommeil pendant quelque temps, on est content d&#039;avoir quelque chose à quoi se raccrocher.&lt;br /&gt;
&lt;br /&gt;
Pour développer efficacement, il faut assurer une organisation logique, figée et compréhensible, et le plus simple dans ce genre de cas est de se baser sur la notion de répertoire. Voici les répertoires qui doivent être utilisés par une IP:&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: Ce répertoire va contenir toute la documentation nécessaire à l&#039;exploitation de l&#039;IP. On y trouvera une notice (&#039;&#039;&#039;readme.txt&#039;&#039;&#039;), un fichier de suivi de modification (&#039;&#039;&#039;ChangeLog.txt&#039;&#039;&#039;), un fichier contenant les évolutions futures prévues (&#039;&#039;&#039;todo.txt&#039;&#039;&#039;) ainsi que tout autre fichier estimé utile par le(s) créateur(s) de l&#039;IP.&lt;br /&gt;
* &#039;&#039;&#039;hdl&#039;&#039;&#039;: Ce répertoire va contenir tous les fichiers VHDL (ou Verilog) qui auront été développés spécifiquement pour cette IP.&lt;br /&gt;
* &#039;&#039;&#039;inc&#039;&#039;&#039;: Ce répertoire va contenir un fichier d&#039;en-tête ANSI C contenant l&#039;adresse de tous les registres interne de l&#039;IP pour permettre de créer simplement un programme en langage C permettant de contrôler l&#039;IP. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HAL&#039;&#039;&#039;: Ce répertoire va contenir un drivers ou un exemple de logiciel de base permettant l&#039;utilisation de l&#039;IP par un microprocesseur/contrôleur. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Ce composant esclave est le premier qui sera créé spécifiquement pour le système. Il sera capable de:&lt;br /&gt;
* prendre en compte jusqu&#039;à 16 sources d&#039;interruptions différentes&lt;br /&gt;
* réaliser l&#039;acquittement de chaque interruption individuellement&lt;br /&gt;
* masquer/autoriser chaque interruption individuellement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le composant disposera des registres suivants:&lt;br /&gt;
* &#039;&#039;&#039;isr_mask&#039;&#039;&#039;: registre d&#039;autorisation des interruptions. Chaque bit correspond à une interruption (bit0 =&amp;gt; IRQ0, bit1 =&amp;gt; IRQ1, etc.). Ce registre sera accessible en lecture et en écriture.&lt;br /&gt;
* &#039;&#039;&#039;isr_pend&#039;&#039;&#039;: ce registre est à double emploi&lt;br /&gt;
** &#039;&#039;&#039;en lecture&#039;&#039;&#039;: Les interruptions en attente de traitement&lt;br /&gt;
** &#039;&#039;&#039;en écriture&#039;&#039;&#039;: Acquittement des interruptions. Chaque bit à 1 va acquitter l&#039;interruption correspondante.&lt;br /&gt;
&lt;br /&gt;
== Le script / programme d&#039;assemblage des IP ==&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant parler du coeur du système, du moins de la partie la plus visible de l&#039;iceberg ;-)&lt;br /&gt;
&lt;br /&gt;
La première des priorités, sera de trouver un nom pour cet outil qui reste un peu dans l&#039;esprit du projet. Voici quelques propositions, à vous de compléter ou de voter pour un nom ou plusieurs noms:&lt;br /&gt;
* Concerto&lt;br /&gt;
* Orchestra&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Principe et fonctionnement ===&lt;br /&gt;
&lt;br /&gt;
Afin de de rendre tout ce système utilisable par le plus grand nombre, il faut être capable de proposer des outils qui vont simplifier la vie de l&#039;utilisateur final ainsi que de l&#039;intégrateur.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faudra créer un outil soit sous forme de script(s), soit sous forme de programme(s) qui va permettre de réaliser les tâches suivantes:&lt;br /&gt;
* Edition d&#039;un &#039;&#039;&#039;système wishbone&#039;&#039;&#039;, c&#039;est-à-dire&lt;br /&gt;
** Ajout/suppression de composants &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039; (c&#039;est comme HD Ready mais en mieux ;-) ).&lt;br /&gt;
** Spécification de la valeur des paramètres &#039;&#039;&#039;GENERIC&#039;&#039;&#039; de chaque composant s&#039;il y en a.&lt;br /&gt;
** Configuration des adresses de base de chaque composant placé sur le bus Wishbone. La plage d&#039;adresses étant donné par la taille du bus d&#039;adresses du composant.&lt;br /&gt;
** Affectation du bit d&#039;interruption pour chaque composant ayant besoin de générer une interruption.&lt;br /&gt;
** Affectation des signaux non wishbone d&#039;entrée et de sortie des composants aux broches du FPGA si cela est possible&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;&#039;&#039;mapping&#039;&#039;&#039;&#039;&#039; contenant:&lt;br /&gt;
** Un &#039;&#039;Time Stamp&#039;&#039; pour connaitre la date de création/génération du système&lt;br /&gt;
** Le fréquence de base du bus Wishbone&lt;br /&gt;
** L&#039;adresse de base de chaque composant&lt;br /&gt;
** Le niveau d&#039;interruption affecté à chaque composant&lt;br /&gt;
* Génération du macro composant &#039;&#039;&#039;syscon&#039;&#039;&#039; qui va faire le lien (routage) entre les différents composants sus le bus Wishbone.&lt;br /&gt;
* Génération du composant &#039;&#039;&#039;system&#039;&#039;&#039; qui va regrouper toutes les connexions internes au système que l&#039;on est en train de créer dans un seul fichier HDL (VHDL ou Verilog). C&#039;est ce fichier qui sera alors instancier dans &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039; avec éventuellement d&#039;autres IP qui n&#039;ont pas de lien direct avec l&#039;i.MX&lt;br /&gt;
* Génération d&#039;un fichier script &#039;&#039;&#039;tcl&#039;&#039;&#039; pour la création du projet de base pour &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039;. Ceci va éviter les erreurs de connexions sur les broches du FPGA, au moins pour la partie relative à l&#039;i.MX. Ce script sera directement exécutable par l&#039;outil fourni par Xilinx.&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;Makefile&#039;&#039;&#039; pour la création des --?? DLL ?? (&amp;lt;- tu veux dire drivers Linux ?)-- &#039;&#039;&#039;&#039;&#039;host drivers&#039;&#039;&#039;&#039;&#039; d&#039;accès au système via programme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ce chapitre est donné à titre informatif/propositon et ne tiens pas lieu de spécification.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier la vie des programmeurs systèmes, il faut pouvoir offrir un mécanisme simple de mise en place et de gestion des demandes d&#039;interruption du FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour cela, je propose la solution suivante:&lt;br /&gt;
* Mise en place d&#039;un gestionnaire d&#039;interruption générique pour le FPGA. Ce gestionnaire d&#039;interruption sera capable de lire le registre d&#039;interruption (lecture de &#039;&#039;&#039;isr_pend&#039;&#039;&#039;) et de déterminer les interruptions à traiter (via &#039;&#039;&#039;isr_mask&#039;&#039;&#039;). Il va en suite aiguiller l&#039;exécution de la routine d&#039;interruption vers les routines adéquates pour chaque bit d&#039;interruption valide. L&#039;interruption traitée sera alors acquitée (écriture vers &#039;&#039;&#039;isr_pend&#039;&#039;&#039;).&lt;br /&gt;
* Création d&#039;une routine &#039;&#039;&#039;&#039;&#039;d&#039;enregistrement de vecteur d&#039;interruption&#039;&#039;&#039;&#039;&#039;. Cette routine va permettre d&#039;ajouter une routine de traitement d&#039;interruption pour un bit d&#039;interruption donné. Pour cela il faudra lui fournir les informations suivantes (via une structure ?!?):&lt;br /&gt;
** Le numéro du bit d&#039;interruption (0 à 31)&lt;br /&gt;
** La routine de traitement d&#039;interruption pour ce driver&lt;br /&gt;
** Un paramètre additionnel à fournir à la routine de traitement d&#039;interruption (pointeur de type &#039;&#039;&#039;&#039;&#039;void *&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
** Le nom du drivers (optionnel, permet d&#039;identifier/visualiser les drivers installer éventuellement)&lt;br /&gt;
* Création d&#039;une routine de validation d&#039;une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour masquer une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour désinstaller une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine ou méthode pour visualiser tous les drivers Wishbone installés:&lt;br /&gt;
** Leur numéro&lt;br /&gt;
** Leur nom&lt;br /&gt;
** Leur état (validé/masqué)&lt;br /&gt;
** Le nombre de fois qu&#039;ils ont été appelé&lt;br /&gt;
** etc.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1798</id>
		<title>FpgaArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1798"/>
		<updated>2006-12-22T20:22:40Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Le lien i.MX &amp;lt;=&amp;gt; FPGA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spécifications de conception du FPGA =&lt;br /&gt;
&lt;br /&gt;
== Evolutions ==&lt;br /&gt;
&lt;br /&gt;
2006/12/21: MAJ en fonction des remarques de tout le monde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== But ==&lt;br /&gt;
&lt;br /&gt;
Cette page a été créée pour permettre à tous les membres de l&#039;association de discuter de l&#039;architecture qui va être mise en place pour le FPGA présent sur la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Cette espace doit être vu comme un espace d&#039;échange d&#039;idées. Tout le monde est convié à y participer. Il est préférable d&#039;avoir quelques connaissances en électronique et sur les langages HDL (VHDL ou Verilog), mais ce n&#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
Bonne lecture et merci pour votre participation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les grandes lignes ==&lt;br /&gt;
&lt;br /&gt;
Le FPGA de la carte APF9328 est là pour offrir le maximum de souplesse au projet &#039;&#039;&#039;Armadeus&#039;&#039;&#039; et permettre d&#039;implanter des fonctionnalités coté &#039;&#039;&#039;matériel&#039;&#039;&#039; qui seraient trop pénalisantes ou impossibles à implanter coté &#039;&#039;&#039;logiciel&#039;&#039;&#039;. Bien entendu, pour que cela soit exploitable, il faut également disposer d&#039;un lien entre le FPGA et le processeur i.MX.&lt;br /&gt;
&lt;br /&gt;
Pour réaliser cela, il faut mettre en place un bus de communication entre le FPGA et l&#039;i.MX. Ce bus de communication va permettre le pilotage des fonctionnalités qui seront implantées dans le FPGA. Bref, il faut recréer à l&#039;intérieur du FPGA un bus tel qu&#039;il existe entre l&#039;i.MX et les différents composants de la carte (RAM, Flash, USB, Ethernet, etc.).&lt;br /&gt;
&lt;br /&gt;
Pour gagner en temps de développement et pour pouvoir récupérer des fonctionnalités ou IP (Intellectual Property) déjà existantes, le bus Wishbone a été retenu. Ce bus, dont les spécification ont été placées dans le domaine public, a été conçu spécifiquement pour ce genre de configuration et sur le site &#039;&#039;&#039;[http://www.opencores.com www.opencores.com]&#039;&#039;&#039; plusieurs IP compatibles avec les spécifications Wishbone sont disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
La spécification Wishbone décrit un certain nombre de composants de base:&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;maitres&#039;&#039;&#039;, ces interfaces sont implantés dans des composants qui seront alors capable d&#039;initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;esclaves&#039;&#039;&#039;, ces interfaces sont implantés dans des composants capables de répondre à des demandes de transferts&lt;br /&gt;
* Un composant &#039;&#039;&#039;syscon&#039;&#039;&#039;, ce composant va générer le signal d&#039;horloge qui sera utilisé par tous les composants/interfaces du bus ainsi que le signal de RESET synchrone.&lt;br /&gt;
* Un macro composant &#039;&#039;&#039;intercon&#039;&#039;&#039;, ce composant va gérer la connexion de toutes les interfaces maitres et esclaves qui composent le bus interne. Il prend en charge :&lt;br /&gt;
** Le décodage/transcodage d&#039;adresse (génération des signaux A0 à A3 selon le mode d&#039;adressage 8/16/32/64 bits)&lt;br /&gt;
** le routage du bus de données entre les différentes interfaces maitres et esclaves (conversion big endian/little endian, etc)&lt;br /&gt;
** le routage/génération des signaux de contrôle du bus (Read, Write, Chip Select, Output Enable, ACK, etc.)&lt;br /&gt;
* Un composant &#039;&#039;&#039;arbitre&#039;&#039;&#039;, ce composant va permettre de partager l&#039;accès au bus ou à un composant de type esclave qui est partagé par plusieurs composants de type maitre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les spécifications du bus Wishbone permettent de créer différents types de bus:&lt;br /&gt;
* &#039;&#039;&#039;Point to Point&#039;&#039;&#039;: C&#039;est le type de bus le plus simple possibl, un composant avec une interface type maitre connecté à un composant avec une interface de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Data Flow&#039;&#039;&#039;: C&#039;est un bus en cascade, à un bout on trouve un composant avec une interface de type maître et à l&#039;autre bout un composant avec une interface de type esclave. Entre les deux composant se trouve une chaine d&#039;un ou plusieurs composants avec une interface de type maitre et de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;: C&#039;est un bus sur lequel plusieurs composants sont connectés dessus. Tous les composants se partagent ce bus. Si plusieurs &#039;&#039;maitres&#039;&#039; sont connectés sur ce bus, un seul pourra initier un transfert à un instant donné.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: C&#039;est également un bus de type partagé, par contre dans se cas, on dispose de plusieurs bus. Chaque maitre utilise sont propre bus pour communiquer avec ces esclaves. On peut donc avoir plusieurs transferts en simultané. Le seul cas de blocage/arbitrage est le transfert de plusieurs maitre avec le même esclave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe également un certain nombre de mécanismes dans la spécification Wishbone pour permettre d&#039;optimiser les temps de transferts sur le bus. Ces optimisations sont de plusieurs nature:&lt;br /&gt;
* utilisation de signaux &#039;&#039;&#039;ACK&#039;&#039;&#039;, &#039;&#039;&#039;ERR&#039;&#039;&#039; et &#039;&#039;&#039;RTY&#039;&#039;&#039; pour signaler la fin de transfert&lt;br /&gt;
* les &#039;&#039;&#039;Registered Feedback Bus Cycles&#039;&#039;&#039;, qui permettent de gagner un cycle d&#039;horloge pour des transferts consécutifs&lt;br /&gt;
* les transferts en mode &#039;&#039;&#039;Burst&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Le lien i.MX &amp;lt;=&amp;gt; FPGA ==&lt;br /&gt;
&lt;br /&gt;
La communication entre l&#039;i.MX et le FPGA passe par les signaux suivants (à vérifier):&lt;br /&gt;
* des signaux de contrôle: &amp;lt;strike&amp;gt;RW_n&amp;lt;/strike&amp;gt;, OE_n, EB_n[3..2] et CS1_n&lt;br /&gt;
* le bus de données sur 16 bits (D[15..0])&lt;br /&gt;
* le bus d&#039;adresses sur 12 bits (A[12..1])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ces signaux sont alors utilisés pour créer une interface Wishbone maitre qui va permettre de communiquer efficacement avec les autres IPs contenus dans le FPGA qui implémenterons une interface wishbone de type esclave.&lt;br /&gt;
&lt;br /&gt;
Etant donné les erratas du composant i.MX  concernant le signal DTACK, il n&#039;est pas possible d&#039;implanter une interface Wishbone maitre &#039;&#039;classique&#039;&#039;. Ceci entraine les limitations suivantes:&lt;br /&gt;
* Pas possible d&#039;utiliser le signal &#039;&#039;&#039;ACK&#039;&#039;&#039; Wishbone pour terminer le transfert entre FPGA et i.MX.&lt;br /&gt;
* Pas possible de mettre en place des optimisations du temps de transfert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce problème, il faudra s&#039;assurer que toutes les interfaces esclaves qui seront connectées à l&#039;interface maitre du composant Wishbone i.MX répondent dans un temps fixe donné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme le bus Wishbone est un bus entièrement synchrone, le temps minimal d&#039;un transfert est de 2 cycles de l&#039;horloge Wishbone. Il faut ajouter à cela, un cycle pour la synchronisation des signaux du bus i.MX. Cela nous fait donc un minimum de 3 cycles Wishbone pour un transfert entre le FPGA et l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
Etant donné les performances des FPGA actuels, on peut tabler sur une fréquence de fonctionnement d&#039;au moins 100MHz pour le bus Wishbone. Cela nous donne donc un taux de transfert approximatif de 66 Moctets/sec (100MHz * 16bits / 3).&lt;br /&gt;
&lt;br /&gt;
== La composition du système Wishbone ==&lt;br /&gt;
&lt;br /&gt;
[[Image:FPGA_Armadeus.png]]&lt;br /&gt;
&lt;br /&gt;
Le système Wishbone qui sera implanté dans le FPGA se compose des éléments suivants:&lt;br /&gt;
* &#039;&#039;&#039;i.MX Wrapper&#039;&#039;&#039;: L&#039;interface i.MX vers le bus Wishbone&lt;br /&gt;
* &#039;&#039;&#039;Syscon&#039;&#039;&#039;: Ce composant va gérer les signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; (généré par une PLL) et &#039;&#039;&#039;RESET&#039;&#039;&#039; (synchrone).&lt;br /&gt;
* &#039;&#039;&#039;Intercon&#039;&#039;&#039;: Ce composant devra être généré automatiquement par une moulinette, il va faire le lien entre tous les composants faisant parti du &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Gestionnaire d&#039;interruption&#039;&#039;&#039;: Ce composant est un &#039;&#039;&#039;esclave wishbone&#039;&#039;&#039; et va centraliser toutes les demandes d&#039;interruption et les remonter vers l&#039;i.MX.&lt;br /&gt;
* &#039;&#039;&#039;Esclaves whisbone&#039;&#039;&#039;: Ceci représentent tous les autres composants avec une interface wishbone esclave qui sont accessibles via le wrapper i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur le diagramme, il manque un certain nombre de choses:&lt;br /&gt;
* Les signaux &#039;&#039;non wishbone&#039;&#039; en entrée ou en sortie sur les &#039;&#039;&#039;esclaves wishbone&#039;&#039;&#039;&lt;br /&gt;
* Le macro composant &#039;&#039;&#039;système wishbone&#039;&#039;&#039;. Ce macro composant est celui qui sera ensuite instancié dans le design du FPGA. Sur ce composant ne seront visibles que les signaux &#039;&#039;externes&#039;&#039; au système:&lt;br /&gt;
** Les signaux issus de l&#039;i.MX&lt;br /&gt;
** Le signal RESET (en entrée) qui sera synchronisé sur l&#039;horloge système&lt;br /&gt;
** Le signal CLK (en entrée) qui sera l&#039;horloge utilisée pour la génération des signaux Wishbone&lt;br /&gt;
** Le signal IRQ (en sortie) qui sera utilisé pour remonter les demandes d&#039;interruption vers l&#039;i.MX&lt;br /&gt;
** Les signaux d&#039;entrée et de sortie spécifiques aux autres composants connectés sur le bus Wishbone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt de créer le composant &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;, est que cela simplifie la vision dans l&#039;outil conception du FPGA. Il ne suffit plus alors qu&#039;à relier les signaux sur les broches correspondantes du FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== i.MX Wrapper ===&lt;br /&gt;
&lt;br /&gt;
Ce composant est le point d&#039;accès au bus Wishbone pour l&#039;i.MX. Ce composant sera le seul à disposer d&#039;une interface Wishbone maitre.&lt;br /&gt;
&lt;br /&gt;
Les fonctions de ce composants sont:&lt;br /&gt;
* synchronisation des signaux issus de l&#039;i.MX. Cela est primordial pour assurer la stabilité de tout le système Wishbone. De plus, le bus de sortie étant asynchrone (l&#039;horloge de génération des signaux n&#039;est pas véhiculée), la resynchronisation des signaux s&#039;impose.&lt;br /&gt;
* gestion du bus de données en 3 états.&lt;br /&gt;
* conversion des signaux de contrôle du bus i.MX en signaux Wishbone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syscom ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est le composant le plus simple du système, il ne fait que synchroniser le signal RESET en entrée avec le signal d&#039;horloge du système.&lt;br /&gt;
&lt;br /&gt;
Il va également être en charge de la génération du signal RESET synchrone pour le bus Wishbone.&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;horloge en entrée du composant &#039;&#039;&#039;syscon&#039;&#039;&#039; sera celui utilisé pour le fonctionnement du bus Wishbone. La fréquence du signal d&#039;horloge devra être assez élevée pour permettre le traitement des signaux issus de l&#039;i.MX. Cela va dépendre de la configuration du chip select utilisé (CS5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Intercon ===&lt;br /&gt;
&lt;br /&gt;
Ce composant a la particularité qu&#039;il sera créé automatiquement par un outil (script ou programme). &#039;&#039;&#039;Intercom&#039;&#039;&#039; a comme fonctionnalités:&lt;br /&gt;
* Le décodage d&#039;adresse pour la sélection des différents esclaves du système&lt;br /&gt;
* Le routage des bus d&#039;adresses et de données vers les différents esclaves&lt;br /&gt;
* La génération des signaux de contrôle pour les différents esclaves.&lt;br /&gt;
&lt;br /&gt;
Etant donné les limitations induites par les erratas de l&#039;i.MX, le composant &#039;&#039;&#039;intercom&#039;&#039;&#039; remplira les fonctionnalités suivantes:&lt;br /&gt;
* le bus de données est figé sur 16 bits&lt;br /&gt;
* les cycles de lecture et d&#039;écriture sont de longueur fixe (à priori 3 cycles d&#039;horloge &#039;&#039;&#039;à valider&#039;&#039;&#039;)&lt;br /&gt;
* une interruption est générée en cas de dépassement du temps de cycle d&#039;écriture ou de lecture&lt;br /&gt;
* le bus sera de type &#039;&#039;&#039;shared&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les composants esclaves ===&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;une IP puisse être facilement inclue dans le système, il faut une certaine organisation. Sinon, à moyen ou à long terme cette IP est morte parce qu&#039;elle sera difficilement exploitable et encore plus difficilement maintenable.&lt;br /&gt;
&lt;br /&gt;
Ce sont des notions qui ne sont pas simples à prendre en considération lors du développement d&#039;un nouveau projet, mais lorsque l&#039;on doit se replonger dans un travail fait par quelqu&#039;un d&#039;autre ou un projet qu&#039;on a laissé en sommeil pendant quelque temps, on est content d&#039;avoir quelque chose à quoi se raccrocher.&lt;br /&gt;
&lt;br /&gt;
Pour développer efficacement, il faut assurer une organisation logique, figée et compréhensible, et le plus simple dans ce genre de cas est de se baser sur la notion de répertoire. Voici les répertoires qui doivent être utilisés par une IP:&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: Ce répertoire va contenir toute la documentation nécessaire à l&#039;exploitation de l&#039;IP. On y trouvera une notice (&#039;&#039;&#039;readme.txt&#039;&#039;&#039;), un fichier de suivi de modification (&#039;&#039;&#039;ChangeLog.txt&#039;&#039;&#039;), un fichier contenant les évolutions futures prévues (&#039;&#039;&#039;todo.txt&#039;&#039;&#039;) ainsi que tout autre fichier estimé utile par le(s) créateur(s) de l&#039;IP.&lt;br /&gt;
* &#039;&#039;&#039;hdl&#039;&#039;&#039;: Ce répertoire va contenir tous les fichiers VHDL (ou Verilog) qui auront été développés spécifiquement pour cette IP.&lt;br /&gt;
* &#039;&#039;&#039;inc&#039;&#039;&#039;: Ce répertoire va contenir un fichier d&#039;en-tête ANSI C contenant l&#039;adresse de tous les registres interne de l&#039;IP pour permettre de créer simplement un programme en langage C permettant de contrôler l&#039;IP. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HAL&#039;&#039;&#039;: Ce répertoire va contenir un drivers ou un exemple de logiciel de base permettant l&#039;utilisation de l&#039;IP par un microprocesseur/contrôleur. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite aux divers discussions issues de ce chapitre. L&#039;organisation et la présences des fichiers présents dans les répertoires &#039;&#039;doc&#039;&#039;&#039; et &#039;&#039;&#039;HAL&#039;&#039;&#039; n&#039;est pas encore établie. Ce chapitre sera encore à retravailler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Ce composant esclave est le premier qui sera créé spécifiquement pour le système. Il sera capable de:&lt;br /&gt;
* prendre en compte jusqu&#039;à 16 sources d&#039;interruptions différents&lt;br /&gt;
* réaliser l&#039;acquittement de chaque interruption individuellement&lt;br /&gt;
* masquer/autoriser chaque interruption individuellement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le composant dispose des registres suivants:&lt;br /&gt;
* &#039;&#039;&#039;isr_mask&#039;&#039;&#039;: registre d&#039;autorisation des interruptions. Chaque bit correspond à une interruption (bit0 =&amp;gt; IRQ0, bit1 =&amp;gt; IRQ1, etc.). Ce registre sera accessible en lecture et en écriture.&lt;br /&gt;
* &#039;&#039;&#039;isr_pend&#039;&#039;&#039;: ce registre est à double emploi&lt;br /&gt;
** &#039;&#039;&#039;en lecture&#039;&#039;&#039;: Les interruptions en attente de traitement&lt;br /&gt;
** &#039;&#039;&#039;en écriture&#039;&#039;&#039;: Acquittement des interruptions. Chaque bit à 1 va acquitter l&#039;interruption correspondante.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le script / programme d&#039;assemblage des IP ==&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant parler du coeur du système, du moins de la partie la plus visible de l&#039;iceberg ;-)&lt;br /&gt;
&lt;br /&gt;
La première des priorités, sera de trouver un nom pour cet outil qui reste un peu dans l&#039;esprit du projet. Voici quelques propositions, à vous de compléter ou de voter pour un nom ou plusieurs noms:&lt;br /&gt;
* Concerto&lt;br /&gt;
* Orchestra&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Principe et fonctionnement ===&lt;br /&gt;
&lt;br /&gt;
Afin de de rendre tout ce système utilisable par le plus grand nombre, il faut être capable de proposer des outils qui vont simplifier la vie de l&#039;utilisateur final ainsi que de l&#039;intégrateur.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faudra créer un outil soit sous forme de script(s), soit sous forme de programme(s) qui va permettre de réaliser les tâches suivantes:&lt;br /&gt;
* Edition d&#039;un &#039;&#039;&#039;système wishbone&#039;&#039;&#039;, c&#039;est-à-dire&lt;br /&gt;
** Ajout/suppression de composants &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039; (c&#039;est comme HD Ready mais en mieux ;-) ).&lt;br /&gt;
** Spécification de la valeur des paramètres &#039;&#039;&#039;GENERIC&#039;&#039;&#039; de chaque composant s&#039;il y en a.&lt;br /&gt;
** Configuration des adresses de base de chaque composant placé sur le bus Wishbone. La plage d&#039;adresses étant donné par la taille du bus d&#039;adresses du composant.&lt;br /&gt;
** Affectation du bit d&#039;interruption pour chaque composant ayant besoin de générer une interruption.&lt;br /&gt;
** Affectation des signaux non wishbone d&#039;entrée et de sortie des composants aux broches du FPGA si cela est possible&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;&#039;&#039;mapping&#039;&#039;&#039;&#039;&#039; contenant:&lt;br /&gt;
** Un &#039;&#039;Time Stamp&#039;&#039; pour connaitre la date de création/génération du système&lt;br /&gt;
** Le fréquence de base du bus Wishbone&lt;br /&gt;
** L&#039;adresse de base de chaque composant&lt;br /&gt;
** Le niveau d&#039;interruption affecté à chaque composant&lt;br /&gt;
* Génération du macro composant &#039;&#039;&#039;syscon&#039;&#039;&#039; qui va faire le lien (routage) entre les différents composants sus le bus Wishbone.&lt;br /&gt;
* Génération du composant &#039;&#039;&#039;system&#039;&#039;&#039; qui va regrouper toutes les connexions internes au système que l&#039;on est en train de créer dans un seul fichier HDL (VHDL ou Verilog). C&#039;est ce fichier qui sera alors instancier dans &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039; avec éventuellement d&#039;autres IP qui n&#039;ont pas de lien direct avec l&#039;i.MX&lt;br /&gt;
* Génération d&#039;un fichier script &#039;&#039;&#039;tcl&#039;&#039;&#039; pour la création du projet de base pour &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039;. Ceci va éviter les erreurs de connexions sur les broches du FPGA, au moins pour la partie relative à l&#039;i.MX. Ce script sera directement exécutable par l&#039;outil fourni par Xilinx.&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;Makefile&#039;&#039;&#039; pour la création des --?? DLL ?? (&amp;lt;- tu veux dire drivers Linux ?)-- &#039;&#039;&#039;&#039;&#039;host drivers&#039;&#039;&#039;&#039;&#039; d&#039;accès au système via programme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ce chapitre est donné à titre informatif/propositon et ne tiens pas lieu de spécification.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier la vie des programmeurs systèmes, il faut pouvoir offrir un mécanisme simple de mise en place et de gestion des demandes d&#039;interruption du FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour cela, je propose la solution suivante:&lt;br /&gt;
* Mise en place d&#039;un gestionnaire d&#039;interruption générique pour le FPGA. Ce gestionnaire d&#039;interruption sera capable de lire le registre d&#039;interruption (lecture de &#039;&#039;&#039;isr_pend&#039;&#039;&#039;) et de déterminer les interruptions à traiter (via &#039;&#039;&#039;isr_mask&#039;&#039;&#039;). Il va en suite aiguiller l&#039;exécution de la routine d&#039;interruption vers les routines adéquates pour chaque bit d&#039;interruption valide. L&#039;interruption traitée sera alors acquitée (écriture vers &#039;&#039;&#039;isr_pend&#039;&#039;&#039;).&lt;br /&gt;
* Création d&#039;une routine &#039;&#039;&#039;&#039;&#039;d&#039;enregistrement de vecteur d&#039;interruption&#039;&#039;&#039;&#039;&#039;. Cette routine va permettre d&#039;ajouter une routine de traitement d&#039;interruption pour un bit d&#039;interruption donné. Pour cela il faudra lui fournir les informations suivantes (via une structure ?!?):&lt;br /&gt;
** Le numéro du bit d&#039;interruption (0 à 31)&lt;br /&gt;
** La routine de traitement d&#039;interruption pour ce driver&lt;br /&gt;
** Un paramètre additionnel à fournir à la routine de traitement d&#039;interruption (pointeur de type &#039;&#039;&#039;&#039;&#039;void *&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
** Le nom du drivers (optionnel, permet d&#039;identifier/visualiser les drivers installer éventuellement)&lt;br /&gt;
* Création d&#039;une routine de validation d&#039;une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour masquer une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour désinstaller une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine ou méthode pour visualiser tous les drivers Wishbone installés:&lt;br /&gt;
** Leur numéro&lt;br /&gt;
** Leur nom&lt;br /&gt;
** Leur état (validé/masqué)&lt;br /&gt;
** Le nombre de fois qu&#039;ils ont été appelé&lt;br /&gt;
** etc.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1797</id>
		<title>FpgaArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1797"/>
		<updated>2006-12-22T20:14:05Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Le bus Wishbone */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spécifications de conception du FPGA =&lt;br /&gt;
&lt;br /&gt;
== Evolutions ==&lt;br /&gt;
&lt;br /&gt;
2006/12/21: MAJ en fonction des remarques de tout le monde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== But ==&lt;br /&gt;
&lt;br /&gt;
Cette page a été créée pour permettre à tous les membres de l&#039;association de discuter de l&#039;architecture qui va être mise en place pour le FPGA présent sur la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Cette espace doit être vu comme un espace d&#039;échange d&#039;idées. Tout le monde est convié à y participer. Il est préférable d&#039;avoir quelques connaissances en électronique et sur les langages HDL (VHDL ou Verilog), mais ce n&#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
Bonne lecture et merci pour votre participation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les grandes lignes ==&lt;br /&gt;
&lt;br /&gt;
Le FPGA de la carte APF9328 est là pour offrir le maximum de souplesse au projet &#039;&#039;&#039;Armadeus&#039;&#039;&#039; et permettre d&#039;implanter des fonctionnalités coté &#039;&#039;&#039;matériel&#039;&#039;&#039; qui seraient trop pénalisantes ou impossibles à implanter coté &#039;&#039;&#039;logiciel&#039;&#039;&#039;. Bien entendu, pour que cela soit exploitable, il faut également disposer d&#039;un lien entre le FPGA et le processeur i.MX.&lt;br /&gt;
&lt;br /&gt;
Pour réaliser cela, il faut mettre en place un bus de communication entre le FPGA et l&#039;i.MX. Ce bus de communication va permettre le pilotage des fonctionnalités qui seront implantées dans le FPGA. Bref, il faut recréer à l&#039;intérieur du FPGA un bus tel qu&#039;il existe entre l&#039;i.MX et les différents composants de la carte (RAM, Flash, USB, Ethernet, etc.).&lt;br /&gt;
&lt;br /&gt;
Pour gagner en temps de développement et pour pouvoir récupérer des fonctionnalités ou IP (Intellectual Property) déjà existantes, le bus Wishbone a été retenu. Ce bus, dont les spécification ont été placées dans le domaine public, a été conçu spécifiquement pour ce genre de configuration et sur le site &#039;&#039;&#039;[http://www.opencores.com www.opencores.com]&#039;&#039;&#039; plusieurs IP compatibles avec les spécifications Wishbone sont disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
La spécification Wishbone décrit un certain nombre de composants de base:&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;maitres&#039;&#039;&#039;, ces interfaces sont implantés dans des composants qui seront alors capable d&#039;initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;esclaves&#039;&#039;&#039;, ces interfaces sont implantés dans des composants capables de répondre à des demandes de transferts&lt;br /&gt;
* Un composant &#039;&#039;&#039;syscon&#039;&#039;&#039;, ce composant va générer le signal d&#039;horloge qui sera utilisé par tous les composants/interfaces du bus ainsi que le signal de RESET synchrone.&lt;br /&gt;
* Un macro composant &#039;&#039;&#039;intercon&#039;&#039;&#039;, ce composant va gérer la connexion de toutes les interfaces maitres et esclaves qui composent le bus interne. Il prend en charge :&lt;br /&gt;
** Le décodage/transcodage d&#039;adresse (génération des signaux A0 à A3 selon le mode d&#039;adressage 8/16/32/64 bits)&lt;br /&gt;
** le routage du bus de données entre les différentes interfaces maitres et esclaves (conversion big endian/little endian, etc)&lt;br /&gt;
** le routage/génération des signaux de contrôle du bus (Read, Write, Chip Select, Output Enable, ACK, etc.)&lt;br /&gt;
* Un composant &#039;&#039;&#039;arbitre&#039;&#039;&#039;, ce composant va permettre de partager l&#039;accès au bus ou à un composant de type esclave qui est partagé par plusieurs composants de type maitre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les spécifications du bus Wishbone permettent de créer différents types de bus:&lt;br /&gt;
* &#039;&#039;&#039;Point to Point&#039;&#039;&#039;: C&#039;est le type de bus le plus simple possibl, un composant avec une interface type maitre connecté à un composant avec une interface de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Data Flow&#039;&#039;&#039;: C&#039;est un bus en cascade, à un bout on trouve un composant avec une interface de type maître et à l&#039;autre bout un composant avec une interface de type esclave. Entre les deux composant se trouve une chaine d&#039;un ou plusieurs composants avec une interface de type maitre et de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;: C&#039;est un bus sur lequel plusieurs composants sont connectés dessus. Tous les composants se partagent ce bus. Si plusieurs &#039;&#039;maitres&#039;&#039; sont connectés sur ce bus, un seul pourra initier un transfert à un instant donné.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: C&#039;est également un bus de type partagé, par contre dans se cas, on dispose de plusieurs bus. Chaque maitre utilise sont propre bus pour communiquer avec ces esclaves. On peut donc avoir plusieurs transferts en simultané. Le seul cas de blocage/arbitrage est le transfert de plusieurs maitre avec le même esclave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe également un certain nombre de mécanismes dans la spécification Wishbone pour permettre d&#039;optimiser les temps de transferts sur le bus. Ces optimisations sont de plusieurs nature:&lt;br /&gt;
* utilisation de signaux &#039;&#039;&#039;ACK&#039;&#039;&#039;, &#039;&#039;&#039;ERR&#039;&#039;&#039; et &#039;&#039;&#039;RTY&#039;&#039;&#039; pour signaler la fin de transfert&lt;br /&gt;
* les &#039;&#039;&#039;Registered Feedback Bus Cycles&#039;&#039;&#039;, qui permettent de gagner un cycle d&#039;horloge pour des transferts consécutifs&lt;br /&gt;
* les transferts en mode &#039;&#039;&#039;Burst&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Le lien i.MX &amp;lt;=&amp;gt; FPGA ==&lt;br /&gt;
&lt;br /&gt;
La communication entre l&#039;i.MX et le FPGA passe par les signaux suivants (à vérifier):&lt;br /&gt;
* des signaux de contrôle: --RW_n--, OE_n, EB_n[3..2] et CS1_n&lt;br /&gt;
* le bus de données sur 16 bits (D[15..0])&lt;br /&gt;
* le bus d&#039;adresses sur 12 bits (A[12..1])&lt;br /&gt;
&lt;br /&gt;
Ces signaux sont alors utilisés pour créer une interface Wishbone maitre qui va permettre de communiquer efficacement avec les autres IPs contenus dans le FPGA qui implémenterons une interface wishbone de type esclave.&lt;br /&gt;
&lt;br /&gt;
Etant donné les erratas du composant i.MX  concernant le signal DTACK, il n&#039;est pas possible d&#039;implanter une interface Wishbone maitre &#039;&#039;classique&#039;&#039;. Ceci entraine les limitations suivantes:&lt;br /&gt;
* Pas possible d&#039;utiliser le signal &#039;&#039;&#039;ACK&#039;&#039;&#039; Wishbone pour terminer le transfert entre FPGA et i.MX.&lt;br /&gt;
* Pas possible de mettre en place des optimisations du temps de transfert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce problème, il faudra s&#039;assurer que toutes les interfaces esclaves qui seront connectées à l&#039;interface maitre du composant Wishbone i.MX répondent dans un temps fixe donné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme le bus Wishbone est un bus entièrement synchrone, le temps minimal d&#039;un transfert est de 2 cycles de l&#039;horloge Wishbone. Il faut ajouter à cela, un cycle pour la synchronisation des signaux du bus i.MX. Cela nous fait donc un minimum de 3 cycles Wishbone pour un transfert entre le FPGA et l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
Etant donné les performances des FPGA actuels, on peut tabler sur une fréquence de fonctionnement d&#039;au moins 100MHz pour le bus Wishbone. Cela nous donne donc un taux de transfert approximatif de 66 Moctets/sec (100MHz * 16bits / 3).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== La composition du système Wishbone ==&lt;br /&gt;
&lt;br /&gt;
[[Image:FPGA_Armadeus.png]]&lt;br /&gt;
&lt;br /&gt;
Le système Wishbone qui sera implanté dans le FPGA se compose des éléments suivants:&lt;br /&gt;
* &#039;&#039;&#039;i.MX Wrapper&#039;&#039;&#039;: L&#039;interface i.MX vers le bus Wishbone&lt;br /&gt;
* &#039;&#039;&#039;Syscon&#039;&#039;&#039;: Ce composant va gérer les signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; (généré par une PLL) et &#039;&#039;&#039;RESET&#039;&#039;&#039; (synchrone).&lt;br /&gt;
* &#039;&#039;&#039;Intercon&#039;&#039;&#039;: Ce composant devra être généré automatiquement par une moulinette, il va faire le lien entre tous les composants faisant parti du &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Gestionnaire d&#039;interruption&#039;&#039;&#039;: Ce composant est un &#039;&#039;&#039;esclave wishbone&#039;&#039;&#039; et va centraliser toutes les demandes d&#039;interruption et les remonter vers l&#039;i.MX.&lt;br /&gt;
* &#039;&#039;&#039;Esclaves whisbone&#039;&#039;&#039;: Ceci représentent tous les autres composants avec une interface wishbone esclave qui sont accessibles via le wrapper i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur le diagramme, il manque un certain nombre de choses:&lt;br /&gt;
* Les signaux &#039;&#039;non wishbone&#039;&#039; en entrée ou en sortie sur les &#039;&#039;&#039;esclaves wishbone&#039;&#039;&#039;&lt;br /&gt;
* Le macro composant &#039;&#039;&#039;système wishbone&#039;&#039;&#039;. Ce macro composant est celui qui sera ensuite instancié dans le design du FPGA. Sur ce composant ne seront visibles que les signaux &#039;&#039;externes&#039;&#039; au système:&lt;br /&gt;
** Les signaux issus de l&#039;i.MX&lt;br /&gt;
** Le signal RESET (en entrée) qui sera synchronisé sur l&#039;horloge système&lt;br /&gt;
** Le signal CLK (en entrée) qui sera l&#039;horloge utilisée pour la génération des signaux Wishbone&lt;br /&gt;
** Le signal IRQ (en sortie) qui sera utilisé pour remonter les demandes d&#039;interruption vers l&#039;i.MX&lt;br /&gt;
** Les signaux d&#039;entrée et de sortie spécifiques aux autres composants connectés sur le bus Wishbone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt de créer le composant &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;, est que cela simplifie la vision dans l&#039;outil conception du FPGA. Il ne suffit plus alors qu&#039;à relier les signaux sur les broches correspondantes du FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== i.MX Wrapper ===&lt;br /&gt;
&lt;br /&gt;
Ce composant est le point d&#039;accès au bus Wishbone pour l&#039;i.MX. Ce composant sera le seul à disposer d&#039;une interface Wishbone maitre.&lt;br /&gt;
&lt;br /&gt;
Les fonctions de ce composants sont:&lt;br /&gt;
* synchronisation des signaux issus de l&#039;i.MX. Cela est primordial pour assurer la stabilité de tout le système Wishbone. De plus, le bus de sortie étant asynchrone (l&#039;horloge de génération des signaux n&#039;est pas véhiculée), la resynchronisation des signaux s&#039;impose.&lt;br /&gt;
* gestion du bus de données en 3 états.&lt;br /&gt;
* conversion des signaux de contrôle du bus i.MX en signaux Wishbone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syscom ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est le composant le plus simple du système, il ne fait que synchroniser le signal RESET en entrée avec le signal d&#039;horloge du système.&lt;br /&gt;
&lt;br /&gt;
Il va également être en charge de la génération du signal RESET synchrone pour le bus Wishbone.&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;horloge en entrée du composant &#039;&#039;&#039;syscon&#039;&#039;&#039; sera celui utilisé pour le fonctionnement du bus Wishbone. La fréquence du signal d&#039;horloge devra être assez élevée pour permettre le traitement des signaux issus de l&#039;i.MX. Cela va dépendre de la configuration du chip select utilisé (CS5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Intercon ===&lt;br /&gt;
&lt;br /&gt;
Ce composant a la particularité qu&#039;il sera créé automatiquement par un outil (script ou programme). &#039;&#039;&#039;Intercom&#039;&#039;&#039; a comme fonctionnalités:&lt;br /&gt;
* Le décodage d&#039;adresse pour la sélection des différents esclaves du système&lt;br /&gt;
* Le routage des bus d&#039;adresses et de données vers les différents esclaves&lt;br /&gt;
* La génération des signaux de contrôle pour les différents esclaves.&lt;br /&gt;
&lt;br /&gt;
Etant donné les limitations induites par les erratas de l&#039;i.MX, le composant &#039;&#039;&#039;intercom&#039;&#039;&#039; remplira les fonctionnalités suivantes:&lt;br /&gt;
* le bus de données est figé sur 16 bits&lt;br /&gt;
* les cycles de lecture et d&#039;écriture sont de longueur fixe (à priori 3 cycles d&#039;horloge &#039;&#039;&#039;à valider&#039;&#039;&#039;)&lt;br /&gt;
* une interruption est générée en cas de dépassement du temps de cycle d&#039;écriture ou de lecture&lt;br /&gt;
* le bus sera de type &#039;&#039;&#039;shared&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les composants esclaves ===&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;une IP puisse être facilement inclue dans le système, il faut une certaine organisation. Sinon, à moyen ou à long terme cette IP est morte parce qu&#039;elle sera difficilement exploitable et encore plus difficilement maintenable.&lt;br /&gt;
&lt;br /&gt;
Ce sont des notions qui ne sont pas simples à prendre en considération lors du développement d&#039;un nouveau projet, mais lorsque l&#039;on doit se replonger dans un travail fait par quelqu&#039;un d&#039;autre ou un projet qu&#039;on a laissé en sommeil pendant quelque temps, on est content d&#039;avoir quelque chose à quoi se raccrocher.&lt;br /&gt;
&lt;br /&gt;
Pour développer efficacement, il faut assurer une organisation logique, figée et compréhensible, et le plus simple dans ce genre de cas est de se baser sur la notion de répertoire. Voici les répertoires qui doivent être utilisés par une IP:&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: Ce répertoire va contenir toute la documentation nécessaire à l&#039;exploitation de l&#039;IP. On y trouvera une notice (&#039;&#039;&#039;readme.txt&#039;&#039;&#039;), un fichier de suivi de modification (&#039;&#039;&#039;ChangeLog.txt&#039;&#039;&#039;), un fichier contenant les évolutions futures prévues (&#039;&#039;&#039;todo.txt&#039;&#039;&#039;) ainsi que tout autre fichier estimé utile par le(s) créateur(s) de l&#039;IP.&lt;br /&gt;
* &#039;&#039;&#039;hdl&#039;&#039;&#039;: Ce répertoire va contenir tous les fichiers VHDL (ou Verilog) qui auront été développés spécifiquement pour cette IP.&lt;br /&gt;
* &#039;&#039;&#039;inc&#039;&#039;&#039;: Ce répertoire va contenir un fichier d&#039;en-tête ANSI C contenant l&#039;adresse de tous les registres interne de l&#039;IP pour permettre de créer simplement un programme en langage C permettant de contrôler l&#039;IP. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HAL&#039;&#039;&#039;: Ce répertoire va contenir un drivers ou un exemple de logiciel de base permettant l&#039;utilisation de l&#039;IP par un microprocesseur/contrôleur. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite aux divers discussions issues de ce chapitre. L&#039;organisation et la présences des fichiers présents dans les répertoires &#039;&#039;doc&#039;&#039;&#039; et &#039;&#039;&#039;HAL&#039;&#039;&#039; n&#039;est pas encore établie. Ce chapitre sera encore à retravailler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Ce composant esclave est le premier qui sera créé spécifiquement pour le système. Il sera capable de:&lt;br /&gt;
* prendre en compte jusqu&#039;à 16 sources d&#039;interruptions différents&lt;br /&gt;
* réaliser l&#039;acquittement de chaque interruption individuellement&lt;br /&gt;
* masquer/autoriser chaque interruption individuellement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le composant dispose des registres suivants:&lt;br /&gt;
* &#039;&#039;&#039;isr_mask&#039;&#039;&#039;: registre d&#039;autorisation des interruptions. Chaque bit correspond à une interruption (bit0 =&amp;gt; IRQ0, bit1 =&amp;gt; IRQ1, etc.). Ce registre sera accessible en lecture et en écriture.&lt;br /&gt;
* &#039;&#039;&#039;isr_pend&#039;&#039;&#039;: ce registre est à double emploi&lt;br /&gt;
** &#039;&#039;&#039;en lecture&#039;&#039;&#039;: Les interruptions en attente de traitement&lt;br /&gt;
** &#039;&#039;&#039;en écriture&#039;&#039;&#039;: Acquittement des interruptions. Chaque bit à 1 va acquitter l&#039;interruption correspondante.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le script / programme d&#039;assemblage des IP ==&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant parler du coeur du système, du moins de la partie la plus visible de l&#039;iceberg ;-)&lt;br /&gt;
&lt;br /&gt;
La première des priorités, sera de trouver un nom pour cet outil qui reste un peu dans l&#039;esprit du projet. Voici quelques propositions, à vous de compléter ou de voter pour un nom ou plusieurs noms:&lt;br /&gt;
* Concerto&lt;br /&gt;
* Orchestra&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Principe et fonctionnement ===&lt;br /&gt;
&lt;br /&gt;
Afin de de rendre tout ce système utilisable par le plus grand nombre, il faut être capable de proposer des outils qui vont simplifier la vie de l&#039;utilisateur final ainsi que de l&#039;intégrateur.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faudra créer un outil soit sous forme de script(s), soit sous forme de programme(s) qui va permettre de réaliser les tâches suivantes:&lt;br /&gt;
* Edition d&#039;un &#039;&#039;&#039;système wishbone&#039;&#039;&#039;, c&#039;est-à-dire&lt;br /&gt;
** Ajout/suppression de composants &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039; (c&#039;est comme HD Ready mais en mieux ;-) ).&lt;br /&gt;
** Spécification de la valeur des paramètres &#039;&#039;&#039;GENERIC&#039;&#039;&#039; de chaque composant s&#039;il y en a.&lt;br /&gt;
** Configuration des adresses de base de chaque composant placé sur le bus Wishbone. La plage d&#039;adresses étant donné par la taille du bus d&#039;adresses du composant.&lt;br /&gt;
** Affectation du bit d&#039;interruption pour chaque composant ayant besoin de générer une interruption.&lt;br /&gt;
** Affectation des signaux non wishbone d&#039;entrée et de sortie des composants aux broches du FPGA si cela est possible&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;&#039;&#039;mapping&#039;&#039;&#039;&#039;&#039; contenant:&lt;br /&gt;
** Un &#039;&#039;Time Stamp&#039;&#039; pour connaitre la date de création/génération du système&lt;br /&gt;
** Le fréquence de base du bus Wishbone&lt;br /&gt;
** L&#039;adresse de base de chaque composant&lt;br /&gt;
** Le niveau d&#039;interruption affecté à chaque composant&lt;br /&gt;
* Génération du macro composant &#039;&#039;&#039;syscon&#039;&#039;&#039; qui va faire le lien (routage) entre les différents composants sus le bus Wishbone.&lt;br /&gt;
* Génération du composant &#039;&#039;&#039;system&#039;&#039;&#039; qui va regrouper toutes les connexions internes au système que l&#039;on est en train de créer dans un seul fichier HDL (VHDL ou Verilog). C&#039;est ce fichier qui sera alors instancier dans &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039; avec éventuellement d&#039;autres IP qui n&#039;ont pas de lien direct avec l&#039;i.MX&lt;br /&gt;
* Génération d&#039;un fichier script &#039;&#039;&#039;tcl&#039;&#039;&#039; pour la création du projet de base pour &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039;. Ceci va éviter les erreurs de connexions sur les broches du FPGA, au moins pour la partie relative à l&#039;i.MX. Ce script sera directement exécutable par l&#039;outil fourni par Xilinx.&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;Makefile&#039;&#039;&#039; pour la création des --?? DLL ?? (&amp;lt;- tu veux dire drivers Linux ?)-- &#039;&#039;&#039;&#039;&#039;host drivers&#039;&#039;&#039;&#039;&#039; d&#039;accès au système via programme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ce chapitre est donné à titre informatif/propositon et ne tiens pas lieu de spécification.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier la vie des programmeurs systèmes, il faut pouvoir offrir un mécanisme simple de mise en place et de gestion des demandes d&#039;interruption du FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour cela, je propose la solution suivante:&lt;br /&gt;
* Mise en place d&#039;un gestionnaire d&#039;interruption générique pour le FPGA. Ce gestionnaire d&#039;interruption sera capable de lire le registre d&#039;interruption (lecture de &#039;&#039;&#039;isr_pend&#039;&#039;&#039;) et de déterminer les interruptions à traiter (via &#039;&#039;&#039;isr_mask&#039;&#039;&#039;). Il va en suite aiguiller l&#039;exécution de la routine d&#039;interruption vers les routines adéquates pour chaque bit d&#039;interruption valide. L&#039;interruption traitée sera alors acquitée (écriture vers &#039;&#039;&#039;isr_pend&#039;&#039;&#039;).&lt;br /&gt;
* Création d&#039;une routine &#039;&#039;&#039;&#039;&#039;d&#039;enregistrement de vecteur d&#039;interruption&#039;&#039;&#039;&#039;&#039;. Cette routine va permettre d&#039;ajouter une routine de traitement d&#039;interruption pour un bit d&#039;interruption donné. Pour cela il faudra lui fournir les informations suivantes (via une structure ?!?):&lt;br /&gt;
** Le numéro du bit d&#039;interruption (0 à 31)&lt;br /&gt;
** La routine de traitement d&#039;interruption pour ce driver&lt;br /&gt;
** Un paramètre additionnel à fournir à la routine de traitement d&#039;interruption (pointeur de type &#039;&#039;&#039;&#039;&#039;void *&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
** Le nom du drivers (optionnel, permet d&#039;identifier/visualiser les drivers installer éventuellement)&lt;br /&gt;
* Création d&#039;une routine de validation d&#039;une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour masquer une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour désinstaller une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine ou méthode pour visualiser tous les drivers Wishbone installés:&lt;br /&gt;
** Leur numéro&lt;br /&gt;
** Leur nom&lt;br /&gt;
** Leur état (validé/masqué)&lt;br /&gt;
** Le nombre de fois qu&#039;ils ont été appelé&lt;br /&gt;
** etc.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1796</id>
		<title>FpgaArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1796"/>
		<updated>2006-12-21T20:53:33Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Spécifications de conception du FPGA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spécifications de conception du FPGA =&lt;br /&gt;
&lt;br /&gt;
== Evolutions ==&lt;br /&gt;
&lt;br /&gt;
2006/12/21: MAJ en fonction des remarques de tout le monde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== But ==&lt;br /&gt;
&lt;br /&gt;
Cette page a été créée pour permettre à tous les membres de l&#039;association de discuter de l&#039;architecture qui va être mise en place pour le FPGA présent sur la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Cette espace doit être vu comme un espace d&#039;échange d&#039;idées. Tout le monde est convié à y participer. Il est préférable d&#039;avoir quelques connaissances en électronique et sur les langages HDL (VHDL ou Verilog), mais ce n&#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
Bonne lecture et merci pour votre participation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les grandes lignes ==&lt;br /&gt;
&lt;br /&gt;
Le FPGA de la carte APF9328 est là pour offrir le maximum de souplesse au projet &#039;&#039;&#039;Armadeus&#039;&#039;&#039; et permettre d&#039;implanter des fonctionnalités coté &#039;&#039;&#039;matériel&#039;&#039;&#039; qui seraient trop pénalisantes ou impossibles à implanter coté &#039;&#039;&#039;logiciel&#039;&#039;&#039;. Bien entendu, pour que cela soit exploitable, il faut également disposer d&#039;un lien entre le FPGA et le processeur i.MX.&lt;br /&gt;
&lt;br /&gt;
Pour réaliser cela, il faut mettre en place un bus de communication entre le FPGA et l&#039;i.MX. Ce bus de communication va permettre le pilotage des fonctionnalités qui seront implantées dans le FPGA. Bref, il faut recréer à l&#039;intérieur du FPGA un bus tel qu&#039;il existe entre l&#039;i.MX et les différents composants de la carte (RAM, Flash, USB, Ethernet, etc.).&lt;br /&gt;
&lt;br /&gt;
Pour gagner en temps de développement et pour pouvoir récupérer des fonctionnalités ou IP (Intellectual Property) déjà existantes, le bus Wishbone a été retenu. Ce bus, dont les spécification ont été placées dans le domaine public, a été conçu spécifiquement pour ce genre de configuration et sur le site &#039;&#039;&#039;[http://www.opencores.com www.opencores.com]&#039;&#039;&#039; plusieurs IP compatibles avec les spécifications Wishbone sont disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
La spécification Wishbone décrit un certain nombre de composants de base:&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;maitres&#039;&#039;&#039;, ces interfaces sont implantés dans des composants qui seront alors capable d&#039;initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;esclaves&#039;&#039;&#039;, ces interfaces sont implantés dans des composants capables de répondre à des demandes de transferts&lt;br /&gt;
* Un composant &#039;&#039;&#039;syscon&#039;&#039;&#039;, ce composant va générer le signal d&#039;horloge qui sera utilisé par tous les composants/interfaces du bus ainsi que le signal de RESET synchrone.&lt;br /&gt;
* Un macro composant &#039;&#039;&#039;intercon&#039;&#039;&#039;, ce composant va gérer la connexion de toutes les interfaces maitres et esclaves qui composent le bus interne. Il prend en charge :&lt;br /&gt;
** Le décodage/transcodage d&#039;adresse (génération des signaux A0 à A3 selon le mode d&#039;adressage 8/16/32/64 bits)&lt;br /&gt;
** le routage du bus de données entre les différentes interfaces maitres et esclaves (conversion big endian/little endian, etc)&lt;br /&gt;
** le routage/génération des signaux de contrôle du bus (Read, Write, Chip Select, Output Enable, ACK, etc.)&lt;br /&gt;
* Un composant &#039;&#039;&#039;arbitre&#039;&#039;&#039;, ce composant va permettre de partager l&#039;accès au bus ou à un composant de type esclave qui est partagé par plusieurs composants de type maitre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les spécifications du bus Wishbone permettent de créer différents types de bus:&lt;br /&gt;
* &#039;&#039;&#039;Point to Point&#039;&#039;&#039;&#039;: Un composant avec une interface type maitre connecté à un composant avec une interface de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Data Flow&#039;&#039;&#039;: C&#039;est un bus en cascade, à un bout on trouve un composant avec une interface de type maître et à l&#039;autre bout un composant avec une interface de type esclave. Entre les deux composant se trouve une chaine d&#039;un ou plusieurs composants avec une interface de type maitre et de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;: C&#039;est un bus sur lequel plusieurs composants sont connectés dessus. Tous les composants se partagent ce bus. Si plusieurs &#039;&#039;maitres&#039;&#039; sont connectés sur ce bus, un seul pourra initier un transfert à un instant donné.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: C&#039;est également un bus de type partagé, par contre dans se cas, on dispose de plusieurs bus. Chaque maitre utilise sont propre bus pour communiquer avec ces esclaves. On peut donc avoir plusieurs transferts en simultané. Le seul cas de blocage/arbitrage est le transfert de plusieurs maitre avec le même esclave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe également un certain nombre de mécanismes dans la spécification Wishbone pour permettre d&#039;optimiser les temps de transferts sur le bus. Ces optimisations sont de plusieurs nature:&lt;br /&gt;
* utilisation de signaux &#039;&#039;&#039;ACK&#039;&#039;&#039;, &#039;&#039;&#039;ERR&#039;&#039;&#039; et &#039;&#039;&#039;RTY&#039;&#039;&#039; pour signaler la fin de transfert&lt;br /&gt;
* les &#039;&#039;&#039;Registered Feedback Bus Cycles&#039;&#039;&#039;, qui permettent de gagner un cycle d&#039;horloge pour des transferts consécutifs&lt;br /&gt;
* les transferts en mode &#039;&#039;&#039;Burst&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le lien i.MX &amp;lt;=&amp;gt; FPGA ==&lt;br /&gt;
&lt;br /&gt;
La communication entre l&#039;i.MX et le FPGA passe par les signaux suivants (à vérifier):&lt;br /&gt;
* des signaux de contrôle: --RW_n--, OE_n, EB_n[3..2] et CS1_n&lt;br /&gt;
* le bus de données sur 16 bits (D[15..0])&lt;br /&gt;
* le bus d&#039;adresses sur 12 bits (A[12..1])&lt;br /&gt;
&lt;br /&gt;
Ces signaux sont alors utilisés pour créer une interface Wishbone maitre qui va permettre de communiquer efficacement avec les autres IPs contenus dans le FPGA qui implémenterons une interface wishbone de type esclave.&lt;br /&gt;
&lt;br /&gt;
Etant donné les erratas du composant i.MX  concernant le signal DTACK, il n&#039;est pas possible d&#039;implanter une interface Wishbone maitre &#039;&#039;classique&#039;&#039;. Ceci entraine les limitations suivantes:&lt;br /&gt;
* Pas possible d&#039;utiliser le signal &#039;&#039;&#039;ACK&#039;&#039;&#039; Wishbone pour terminer le transfert entre FPGA et i.MX.&lt;br /&gt;
* Pas possible de mettre en place des optimisations du temps de transfert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce problème, il faudra s&#039;assurer que toutes les interfaces esclaves qui seront connectées à l&#039;interface maitre du composant Wishbone i.MX répondent dans un temps fixe donné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme le bus Wishbone est un bus entièrement synchrone, le temps minimal d&#039;un transfert est de 2 cycles de l&#039;horloge Wishbone. Il faut ajouter à cela, un cycle pour la synchronisation des signaux du bus i.MX. Cela nous fait donc un minimum de 3 cycles Wishbone pour un transfert entre le FPGA et l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
Etant donné les performances des FPGA actuels, on peut tabler sur une fréquence de fonctionnement d&#039;au moins 100MHz pour le bus Wishbone. Cela nous donne donc un taux de transfert approximatif de 66 Moctets/sec (100MHz * 16bits / 3).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== La composition du système Wishbone ==&lt;br /&gt;
&lt;br /&gt;
[[Image:FPGA_Armadeus.png]]&lt;br /&gt;
&lt;br /&gt;
Le système Wishbone qui sera implanté dans le FPGA se compose des éléments suivants:&lt;br /&gt;
* &#039;&#039;&#039;i.MX Wrapper&#039;&#039;&#039;: L&#039;interface i.MX vers le bus Wishbone&lt;br /&gt;
* &#039;&#039;&#039;Syscon&#039;&#039;&#039;: Ce composant va gérer les signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; (généré par une PLL) et &#039;&#039;&#039;RESET&#039;&#039;&#039; (synchrone).&lt;br /&gt;
* &#039;&#039;&#039;Intercon&#039;&#039;&#039;: Ce composant devra être généré automatiquement par une moulinette, il va faire le lien entre tous les composants faisant parti du &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Gestionnaire d&#039;interruption&#039;&#039;&#039;: Ce composant est un &#039;&#039;&#039;esclave wishbone&#039;&#039;&#039; et va centraliser toutes les demandes d&#039;interruption et les remonter vers l&#039;i.MX.&lt;br /&gt;
* &#039;&#039;&#039;Esclaves whisbone&#039;&#039;&#039;: Ceci représentent tous les autres composants avec une interface wishbone esclave qui sont accessibles via le wrapper i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur le diagramme, il manque un certain nombre de choses:&lt;br /&gt;
* Les signaux &#039;&#039;non wishbone&#039;&#039; en entrée ou en sortie sur les &#039;&#039;&#039;esclaves wishbone&#039;&#039;&#039;&lt;br /&gt;
* Le macro composant &#039;&#039;&#039;système wishbone&#039;&#039;&#039;. Ce macro composant est celui qui sera ensuite instancié dans le design du FPGA. Sur ce composant ne seront visibles que les signaux &#039;&#039;externes&#039;&#039; au système:&lt;br /&gt;
** Les signaux issus de l&#039;i.MX&lt;br /&gt;
** Le signal RESET (en entrée) qui sera synchronisé sur l&#039;horloge système&lt;br /&gt;
** Le signal CLK (en entrée) qui sera l&#039;horloge utilisée pour la génération des signaux Wishbone&lt;br /&gt;
** Le signal IRQ (en sortie) qui sera utilisé pour remonter les demandes d&#039;interruption vers l&#039;i.MX&lt;br /&gt;
** Les signaux d&#039;entrée et de sortie spécifiques aux autres composants connectés sur le bus Wishbone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt de créer le composant &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;, est que cela simplifie la vision dans l&#039;outil conception du FPGA. Il ne suffit plus alors qu&#039;à relier les signaux sur les broches correspondantes du FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== i.MX Wrapper ===&lt;br /&gt;
&lt;br /&gt;
Ce composant est le point d&#039;accès au bus Wishbone pour l&#039;i.MX. Ce composant sera le seul à disposer d&#039;une interface Wishbone maitre.&lt;br /&gt;
&lt;br /&gt;
Les fonctions de ce composants sont:&lt;br /&gt;
* synchronisation des signaux issus de l&#039;i.MX. Cela est primordial pour assurer la stabilité de tout le système Wishbone. De plus, le bus de sortie étant asynchrone (l&#039;horloge de génération des signaux n&#039;est pas véhiculée), la resynchronisation des signaux s&#039;impose.&lt;br /&gt;
* gestion du bus de données en 3 états.&lt;br /&gt;
* conversion des signaux de contrôle du bus i.MX en signaux Wishbone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syscom ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est le composant le plus simple du système, il ne fait que synchroniser le signal RESET en entrée avec le signal d&#039;horloge du système.&lt;br /&gt;
&lt;br /&gt;
Il va également être en charge de la génération du signal RESET synchrone pour le bus Wishbone.&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;horloge en entrée du composant &#039;&#039;&#039;syscon&#039;&#039;&#039; sera celui utilisé pour le fonctionnement du bus Wishbone. La fréquence du signal d&#039;horloge devra être assez élevée pour permettre le traitement des signaux issus de l&#039;i.MX. Cela va dépendre de la configuration du chip select utilisé (CS5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Intercon ===&lt;br /&gt;
&lt;br /&gt;
Ce composant a la particularité qu&#039;il sera créé automatiquement par un outil (script ou programme). &#039;&#039;&#039;Intercom&#039;&#039;&#039; a comme fonctionnalités:&lt;br /&gt;
* Le décodage d&#039;adresse pour la sélection des différents esclaves du système&lt;br /&gt;
* Le routage des bus d&#039;adresses et de données vers les différents esclaves&lt;br /&gt;
* La génération des signaux de contrôle pour les différents esclaves.&lt;br /&gt;
&lt;br /&gt;
Etant donné les limitations induites par les erratas de l&#039;i.MX, le composant &#039;&#039;&#039;intercom&#039;&#039;&#039; remplira les fonctionnalités suivantes:&lt;br /&gt;
* le bus de données est figé sur 16 bits&lt;br /&gt;
* les cycles de lecture et d&#039;écriture sont de longueur fixe (à priori 3 cycles d&#039;horloge &#039;&#039;&#039;à valider&#039;&#039;&#039;)&lt;br /&gt;
* une interruption est générée en cas de dépassement du temps de cycle d&#039;écriture ou de lecture&lt;br /&gt;
* le bus sera de type &#039;&#039;&#039;shared&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les composants esclaves ===&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;une IP puisse être facilement inclue dans le système, il faut une certaine organisation. Sinon, à moyen ou à long terme cette IP est morte parce qu&#039;elle sera difficilement exploitable et encore plus difficilement maintenable.&lt;br /&gt;
&lt;br /&gt;
Ce sont des notions qui ne sont pas simples à prendre en considération lors du développement d&#039;un nouveau projet, mais lorsque l&#039;on doit se replonger dans un travail fait par quelqu&#039;un d&#039;autre ou un projet qu&#039;on a laissé en sommeil pendant quelque temps, on est content d&#039;avoir quelque chose à quoi se raccrocher.&lt;br /&gt;
&lt;br /&gt;
Pour développer efficacement, il faut assurer une organisation logique, figée et compréhensible, et le plus simple dans ce genre de cas est de se baser sur la notion de répertoire. Voici les répertoires qui doivent être utilisés par une IP:&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: Ce répertoire va contenir toute la documentation nécessaire à l&#039;exploitation de l&#039;IP. On y trouvera une notice (&#039;&#039;&#039;readme.txt&#039;&#039;&#039;), un fichier de suivi de modification (&#039;&#039;&#039;ChangeLog.txt&#039;&#039;&#039;), un fichier contenant les évolutions futures prévues (&#039;&#039;&#039;todo.txt&#039;&#039;&#039;) ainsi que tout autre fichier estimé utile par le(s) créateur(s) de l&#039;IP.&lt;br /&gt;
* &#039;&#039;&#039;hdl&#039;&#039;&#039;: Ce répertoire va contenir tous les fichiers VHDL (ou Verilog) qui auront été développés spécifiquement pour cette IP.&lt;br /&gt;
* &#039;&#039;&#039;inc&#039;&#039;&#039;: Ce répertoire va contenir un fichier d&#039;en-tête ANSI C contenant l&#039;adresse de tous les registres interne de l&#039;IP pour permettre de créer simplement un programme en langage C permettant de contrôler l&#039;IP. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HAL&#039;&#039;&#039;: Ce répertoire va contenir un drivers ou un exemple de logiciel de base permettant l&#039;utilisation de l&#039;IP par un microprocesseur/contrôleur. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite aux divers discussions issues de ce chapitre. L&#039;organisation et la présences des fichiers présents dans les répertoires &#039;&#039;doc&#039;&#039;&#039; et &#039;&#039;&#039;HAL&#039;&#039;&#039; n&#039;est pas encore établie. Ce chapitre sera encore à retravailler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Ce composant esclave est le premier qui sera créé spécifiquement pour le système. Il sera capable de:&lt;br /&gt;
* prendre en compte jusqu&#039;à 16 sources d&#039;interruptions différents&lt;br /&gt;
* réaliser l&#039;acquittement de chaque interruption individuellement&lt;br /&gt;
* masquer/autoriser chaque interruption individuellement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le composant dispose des registres suivants:&lt;br /&gt;
* &#039;&#039;&#039;isr_mask&#039;&#039;&#039;: registre d&#039;autorisation des interruptions. Chaque bit correspond à une interruption (bit0 =&amp;gt; IRQ0, bit1 =&amp;gt; IRQ1, etc.). Ce registre sera accessible en lecture et en écriture.&lt;br /&gt;
* &#039;&#039;&#039;isr_pend&#039;&#039;&#039;: ce registre est à double emploi&lt;br /&gt;
** &#039;&#039;&#039;en lecture&#039;&#039;&#039;: Les interruptions en attente de traitement&lt;br /&gt;
** &#039;&#039;&#039;en écriture&#039;&#039;&#039;: Acquittement des interruptions. Chaque bit à 1 va acquitter l&#039;interruption correspondante.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le script / programme d&#039;assemblage des IP ==&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant parler du coeur du système, du moins de la partie la plus visible de l&#039;iceberg ;-)&lt;br /&gt;
&lt;br /&gt;
La première des priorités, sera de trouver un nom pour cet outil qui reste un peu dans l&#039;esprit du projet. Voici quelques propositions, à vous de compléter ou de voter pour un nom ou plusieurs noms:&lt;br /&gt;
* Concerto&lt;br /&gt;
* Orchestra&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Principe et fonctionnement ===&lt;br /&gt;
&lt;br /&gt;
Afin de de rendre tout ce système utilisable par le plus grand nombre, il faut être capable de proposer des outils qui vont simplifier la vie de l&#039;utilisateur final ainsi que de l&#039;intégrateur.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faudra créer un outil soit sous forme de script(s), soit sous forme de programme(s) qui va permettre de réaliser les tâches suivantes:&lt;br /&gt;
* Edition d&#039;un &#039;&#039;&#039;système wishbone&#039;&#039;&#039;, c&#039;est-à-dire&lt;br /&gt;
** Ajout/suppression de composants &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039; (c&#039;est comme HD Ready mais en mieux ;-) ).&lt;br /&gt;
** Spécification de la valeur des paramètres &#039;&#039;&#039;GENERIC&#039;&#039;&#039; de chaque composant s&#039;il y en a.&lt;br /&gt;
** Configuration des adresses de base de chaque composant placé sur le bus Wishbone. La plage d&#039;adresses étant donné par la taille du bus d&#039;adresses du composant.&lt;br /&gt;
** Affectation du bit d&#039;interruption pour chaque composant ayant besoin de générer une interruption.&lt;br /&gt;
** Affectation des signaux non wishbone d&#039;entrée et de sortie des composants aux broches du FPGA si cela est possible&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;&#039;&#039;mapping&#039;&#039;&#039;&#039;&#039; contenant:&lt;br /&gt;
** Un &#039;&#039;Time Stamp&#039;&#039; pour connaitre la date de création/génération du système&lt;br /&gt;
** Le fréquence de base du bus Wishbone&lt;br /&gt;
** L&#039;adresse de base de chaque composant&lt;br /&gt;
** Le niveau d&#039;interruption affecté à chaque composant&lt;br /&gt;
* Génération du macro composant &#039;&#039;&#039;syscon&#039;&#039;&#039; qui va faire le lien (routage) entre les différents composants sus le bus Wishbone.&lt;br /&gt;
* Génération du composant &#039;&#039;&#039;system&#039;&#039;&#039; qui va regrouper toutes les connexions internes au système que l&#039;on est en train de créer dans un seul fichier HDL (VHDL ou Verilog). C&#039;est ce fichier qui sera alors instancier dans &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039; avec éventuellement d&#039;autres IP qui n&#039;ont pas de lien direct avec l&#039;i.MX&lt;br /&gt;
* Génération d&#039;un fichier script &#039;&#039;&#039;tcl&#039;&#039;&#039; pour la création du projet de base pour &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039;. Ceci va éviter les erreurs de connexions sur les broches du FPGA, au moins pour la partie relative à l&#039;i.MX. Ce script sera directement exécutable par l&#039;outil fourni par Xilinx.&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;Makefile&#039;&#039;&#039; pour la création des --?? DLL ?? (&amp;lt;- tu veux dire drivers Linux ?)-- &#039;&#039;&#039;&#039;&#039;host drivers&#039;&#039;&#039;&#039;&#039; d&#039;accès au système via programme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ce chapitre est donné à titre informatif/propositon et ne tiens pas lieu de spécification.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier la vie des programmeurs systèmes, il faut pouvoir offrir un mécanisme simple de mise en place et de gestion des demandes d&#039;interruption du FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour cela, je propose la solution suivante:&lt;br /&gt;
* Mise en place d&#039;un gestionnaire d&#039;interruption générique pour le FPGA. Ce gestionnaire d&#039;interruption sera capable de lire le registre d&#039;interruption (lecture de &#039;&#039;&#039;isr_pend&#039;&#039;&#039;) et de déterminer les interruptions à traiter (via &#039;&#039;&#039;isr_mask&#039;&#039;&#039;). Il va en suite aiguiller l&#039;exécution de la routine d&#039;interruption vers les routines adéquates pour chaque bit d&#039;interruption valide. L&#039;interruption traitée sera alors acquitée (écriture vers &#039;&#039;&#039;isr_pend&#039;&#039;&#039;).&lt;br /&gt;
* Création d&#039;une routine &#039;&#039;&#039;&#039;&#039;d&#039;enregistrement de vecteur d&#039;interruption&#039;&#039;&#039;&#039;&#039;. Cette routine va permettre d&#039;ajouter une routine de traitement d&#039;interruption pour un bit d&#039;interruption donné. Pour cela il faudra lui fournir les informations suivantes (via une structure ?!?):&lt;br /&gt;
** Le numéro du bit d&#039;interruption (0 à 31)&lt;br /&gt;
** La routine de traitement d&#039;interruption pour ce driver&lt;br /&gt;
** Un paramètre additionnel à fournir à la routine de traitement d&#039;interruption (pointeur de type &#039;&#039;&#039;&#039;&#039;void *&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
** Le nom du drivers (optionnel, permet d&#039;identifier/visualiser les drivers installer éventuellement)&lt;br /&gt;
* Création d&#039;une routine de validation d&#039;une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour masquer une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour désinstaller une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine ou méthode pour visualiser tous les drivers Wishbone installés:&lt;br /&gt;
** Leur numéro&lt;br /&gt;
** Leur nom&lt;br /&gt;
** Leur état (validé/masqué)&lt;br /&gt;
** Le nombre de fois qu&#039;ils ont été appelé&lt;br /&gt;
** etc.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1779</id>
		<title>FpgaArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1779"/>
		<updated>2006-12-17T14:14:53Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Gestionnaire d&amp;#039;interruption */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spécifications de conception du FPGA =&lt;br /&gt;
&lt;br /&gt;
== But ==&lt;br /&gt;
&lt;br /&gt;
Cette page a été créée pour permettre à tous les membres de l&#039;association de discuter de l&#039;architecture qui va être mise en place pour le FPGA présent sur la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Cette espace doit être vu comme un espace d&#039;échange d&#039;idées. Tout le monde est convié à y participer. Il est préférable d&#039;avoir quelques connaissances en électronique et sur les langages HDL (VHDL ou Verilog), mais ce n&#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
Bonne lecture et merci pour votre participation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les grandes lignes ==&lt;br /&gt;
&lt;br /&gt;
Le FPGA de la carte APF9328 est là pour offrir le maximum de souplesse au projet &#039;&#039;&#039;Armadeus&#039;&#039;&#039; et permettre d&#039;implanter des fonctionnalités coté &#039;&#039;&#039;matériel&#039;&#039;&#039; qui seraient trop pénalisantes ou impossibles à implanter coté &#039;&#039;&#039;logiciel&#039;&#039;&#039;. Bien entendu, pour que cela soit exploitable, il faut également disposer d&#039;un lien entre le FPGA et le processeur i.MX.&lt;br /&gt;
&lt;br /&gt;
Pour réaliser cela, il faut mettre en place un bus de communication entre le FPGA et l&#039;i.MX. Ce bus de communication va permettre le pilotage des fonctionnalités qui seront implantées dans le FPGA. Bref, il faut recréer à l&#039;intérieur du FPGA un bus tel qu&#039;il existe entre l&#039;i.MX et les différents composants de la carte (RAM, Flash, USB, Ethernet, etc.).&lt;br /&gt;
&lt;br /&gt;
Pour gagner en temps de développement et pour pouvoir récupérer des fonctionnalités ou IP (Intellectual Property) déjà existantes, le bus Wishbone a été retenu. Ce bus, dont les spécification ont été placées dans le domaine public, a été conçu spécifiquement pour ce genre de configuration et sur le site &#039;&#039;&#039;[http://www.opencores.com www.opencores.com]&#039;&#039;&#039; plusieurs IP compatibles avec les spécifications Wishbone sont disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
La spécification Wishbone décrit un certain nombre de composants de base:&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;maitres&#039;&#039;&#039;, ces interfaces sont implantés dans des composants qui seront alors capable d&#039;initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;esclaves&#039;&#039;&#039;, ces interfaces sont implantés dans des composants capables de répondre à des demandes de transferts&lt;br /&gt;
* Un composant &#039;&#039;&#039;syscon&#039;&#039;&#039;, ce composant va générer le signal d&#039;horloge qui sera utilisé par tous les composants/interfaces du bus ainsi que le signal de RESET synchrone.&lt;br /&gt;
* Un macro composant &#039;&#039;&#039;intercon&#039;&#039;&#039;, ce composant va gérer la connexion de toutes les interfaces maitres et esclaves qui composent le bus interne. Il prend en charge :&lt;br /&gt;
** Le décodage/transcodage d&#039;adresse (génération des signaux A0 à A3 selon le mode d&#039;adressage 8/16/32/64 bits)&lt;br /&gt;
** le routage du bus de données entre les différentes interfaces maitres et esclaves (conversion big endian/little endian, etc)&lt;br /&gt;
** le routage/génération des signaux de contrôle du bus (Read, Write, Chip Select, Output Enable, ACK, etc.)&lt;br /&gt;
* Un composant &#039;&#039;&#039;arbitre&#039;&#039;&#039;, ce composant va permettre de partager l&#039;accès au bus ou à un composant de type esclave qui est partagé par plusieurs composants de type maitre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les spécifications du bus Wishbone permettent de créer différents types de bus:&lt;br /&gt;
* &#039;&#039;&#039;Point to Point&#039;&#039;&#039;&#039;: Un composant avec une interface type maitre connecté à un composant avec une interface de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Data Flow&#039;&#039;&#039;: C&#039;est un bus en cascade, à un bout on trouve un composant avec une interface de type maître et à l&#039;autre bout un composant avec une interface de type esclave. Entre les deux composant se trouve une chaine d&#039;un ou plusieurs composants avec une interface de type maitre et de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;: C&#039;est un bus sur lequel plusieurs composants sont connectés dessus. Tous les composants se partagent ce bus. Si plusieurs &#039;&#039;maitres&#039;&#039; sont connectés sur ce bus, un seul pourra initier un transfert à un instant donné.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: C&#039;est également un bus de type partagé, par contre dans se cas, on dispose de plusieurs bus. Chaque maitre utilise sont propre bus pour communiquer avec ces esclaves. On peut donc avoir plusieurs transferts en simultané. Le seul cas de blocage/arbitrage est le transfert de plusieurs maitre avec le même esclave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe également un certain nombre de mécanismes dans la spécification Wishbone pour permettre d&#039;optimiser les temps de transferts sur le bus. Ces optimisations sont de plusieurs nature:&lt;br /&gt;
* utilisation de signaux &#039;&#039;&#039;ACK&#039;&#039;&#039;, &#039;&#039;&#039;ERR&#039;&#039;&#039; et &#039;&#039;&#039;RTY&#039;&#039;&#039; pour signaler la fin de transfert&lt;br /&gt;
* les &#039;&#039;&#039;Registered Feedback Bus Cycles&#039;&#039;&#039;, qui permettent de gagner un cycle d&#039;horloge pour des transferts consécutifs&lt;br /&gt;
* les transferts en mode &#039;&#039;&#039;Burts&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le lien i.MX &amp;lt;=&amp;gt; FPGA ==&lt;br /&gt;
&lt;br /&gt;
La communication entre l&#039;i.MX et le FPGA passe par les signaux suivants (à vérifier):&lt;br /&gt;
* des signaux de contrôle: RW_n, OE_n, EB_n[3..2] et CS1_n&lt;br /&gt;
* le bus de données sur 16 bits (D[15..0])&lt;br /&gt;
* le bus d&#039;adresses sur 12 bits (A[12..1])&lt;br /&gt;
&lt;br /&gt;
Ces signaux sont alors utilisés pour créer une interface Wishbone maitre qui va permettre de communiquer efficacement avec les autres IPs contenus dans le FPGA qui implémenterons une interface wishbone de type esclave.&lt;br /&gt;
&lt;br /&gt;
Etant donné les erratas du composant i.MX  concernant le signal DTACK, il n&#039;est pas possible d&#039;implanter une interface Wishbone maitre &#039;&#039;classique&#039;&#039;. Ceci entraine les limitations suivantes:&lt;br /&gt;
* Pas possible d&#039;utiliser le signal &#039;&#039;&#039;ACK&#039;&#039;&#039; Wishbone pour terminer le transfert entre FPGA et i.MAX.&lt;br /&gt;
* Pas possible de mettre en place des optimisations du temps de transfert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce problème, il faudra s&#039;assurer que toutes les interfaces esclaves qui seront connectées à l&#039;interface maitre du composant Wishbone i.MX répondent dans un temps fixe donné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme le bus Wishbone est un bus entièrement synchrone, le temps minimal d&#039;un transfert est de 2 cycles de l&#039;horloge Wishbone. Il faut ajouter à cela, un cycle pour la synchronisation des signaux du bus i.MX. Cela nous fait donc un minimum de 3 cycles Wishbone pour un transfert entre le FPGA et l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
Etant donné les performances des FPGA actuels, on peut tabler sur une fréquence de fonctionnement d&#039;au moins 100MHz pour le bus Wishbone. Cela nous donne donc un taux de transfert approximatif de 66M octets/sec (100MHz * 16bits / 3).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== La composition du système Wishbone ==&lt;br /&gt;
&lt;br /&gt;
[[Image:FPGA_Armadeus.png]]&lt;br /&gt;
&lt;br /&gt;
Le système Wishbone qui sera implanté dans le FPGA se compose des éléments suivants:&lt;br /&gt;
* &#039;&#039;&#039;i.MX Wrapper&#039;&#039;&#039;: L&#039;interface i.MX vers le bus Wishbone&lt;br /&gt;
* &#039;&#039;&#039;Syscon&#039;&#039;&#039;: Ce composant va gérer les signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; (généré par une PLL) et &#039;&#039;&#039;RESET&#039;&#039;&#039; (synchrone).&lt;br /&gt;
* &#039;&#039;&#039;Intercon&#039;&#039;&#039;: Ce composant devra être généré automatiquement par une moulinette, il va faire le lien entre tous les composants faisant parti du &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Gestionnaire d&#039;interruption&#039;&#039;&#039;: Ce composant est un &#039;&#039;&#039;esclave wishbone&#039;&#039;&#039; et va centraliser toutes les demandes d&#039;interruption et le remontées vers l&#039;i.MX.&lt;br /&gt;
* &#039;&#039;&#039;Esclaves whisbone&#039;&#039;&#039;: Ceci représentent tous les autres composants avec une interface wishbone esclave qui sont accessibles via le wrapper i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur le diagramme, il manque un certain nombre de choses:&lt;br /&gt;
* Les signaux &#039;&#039;non wishbone&#039;&#039; en entrée ou en sortie sur les &#039;&#039;&#039;esclaves wishbone&#039;&#039;&#039;&lt;br /&gt;
* Le macro composant &#039;&#039;&#039;système wishbone&#039;&#039;&#039;. Ce macro composant est celui qui sera ensuite instancié dans le design du FPGA. Sur ce composant ne seront visibles que les signaux &#039;&#039;externes&#039;&#039; au système:&lt;br /&gt;
** Les signaux issus de l&#039;i.MX&lt;br /&gt;
** Le signal RESET (en entrée) qui sera synchronisé sur l&#039;horloge système&lt;br /&gt;
** Le signal CLK (en entrée) qui sera l&#039;horloge utilisée pour la génération des signaux Wishbone&lt;br /&gt;
** Le signal IRQ (en sortie) qui sera utilisé pour remonter les demandes d&#039;interruption vers l&#039;i.MX&lt;br /&gt;
** Les signaux d&#039;entrée et de sortie spécifiques au autres composants connectés sur le bus Wishbone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt de créer le composant &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;, est que cela simplifie la vision dans l&#039;outil conception du FPGA. Il ne suffit plus alors qu&#039;à relier les signaux sur les broches correspondantes du FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== i.MX Wrapper ===&lt;br /&gt;
&lt;br /&gt;
Ce composant est le point d&#039;accès au bus Wishbone pour l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syscom ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est le composant le plus simple du système, il ne fait que synchroniser le signal RESET en entrée avec le signal d&#039;horloge du système.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Intercon ===&lt;br /&gt;
&lt;br /&gt;
Ce composant a la particularité qu&#039;il sera créé automatiquement par un outils (script ou programme). &#039;&#039;&#039;Intercom&#039;&#039;&#039; a comme fonctionnalité:&lt;br /&gt;
* Le décodage d&#039;adresse pour la sélection des différents esclaves du système&lt;br /&gt;
* Le routage des bus d&#039;adresses et de données vers les différents esclaves&lt;br /&gt;
* La génération des signaux de contrôle pour les différents esclaves.&lt;br /&gt;
&lt;br /&gt;
Etant donné les limitations induites par les erratas de l&#039;i.MX, le composant &#039;&#039;&#039;intercom&#039;&#039;&#039; remplira les fonctionnalités suivantes:&lt;br /&gt;
* le bus de données est figé sur 16 bits&lt;br /&gt;
* les cycles de lecture et d&#039;écriture sont de longueur fixe (à priori 3 cycles d&#039;horloge &#039;&#039;&#039;à valider&#039;&#039;&#039;)&lt;br /&gt;
* une interruption est générée en cas de dépassement du temps de cycle d&#039;écriture ou de lecture&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les composants esclaves ===&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;une IP puisse être facilement incluse dans le système, il faut une certaine organisation. Sinon, à moyen ou à long terme cette IP est morte parce qu&#039;elle sera difficilement exploitable et encore plus difficilement maintenable.&lt;br /&gt;
Ceux sont des notions pas simple à prendre en considération lors du développement d&#039;un nouveau projet, mais lorsque l&#039;on doit se replonger dans un travail fait par quelqu&#039;un d&#039;autre ou un projet qu&#039;on a laissé en sommeil pendant quelque temps, on est content d&#039;avoir quelque chose à quoi se raccrocher.&lt;br /&gt;
Pour développer efficacement, il faut assurer une organisation logique, figée et compréhensible, et le plus simple dans ce genre de cas est de se baser sur la notion de répertoire. Voici les répertoires qui doivent être utilisés par une IP:&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: Ce répertoire va contenir toute la documentation nécessaire à l&#039;exploitation de l&#039;IP. On y trouvera une notice (&#039;&#039;&#039;readme.txt&#039;&#039;&#039;), un fichier de suivit de modification (&#039;&#039;&#039;ChangeLog.txt&#039;&#039;&#039;), un fichier contenant les évolutions futures prévues (&#039;&#039;&#039;todo.txt&#039;&#039;&#039;) ainsi que tout autre fichier estimé utile par le(s) créateur(s) de l&#039;IP.&lt;br /&gt;
* &#039;&#039;&#039;hdl&#039;&#039;&#039;: Ce répertoire va contenir tous les fichiers VHDL (ou Verilog) qui auront été développés spécifiquement pour cette IP.&lt;br /&gt;
* &#039;&#039;&#039;inc&#039;&#039;&#039;: Ce répertoire va contenir un fichier d&#039;en-tête ANSI C contenant l&#039;adresse de tous les registres interne de l&#039;IP pour permettre de créer simplement un programme en langage C permettant de contrôler l&#039;IP. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HAL&#039;&#039;&#039;: Ce répertoire va contenir un drivers ou un exemple de logiciel de base permettant l&#039;utilisation de l&#039;IP par un microprocesseur/contrôleur. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Ce composant esclave est le premier qui sera créé spécifiquement pour le système. Il sera capable de:&lt;br /&gt;
* prendre en compte jusqu&#039;à 16 sources d&#039;interruptions différents&lt;br /&gt;
* réaliser l&#039;acquittement chaque interruption individuellement&lt;br /&gt;
* masquer/autoriser chaque interruption individuellement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le composant dispose des registres suivants:&lt;br /&gt;
* &#039;&#039;&#039;isr_mask&#039;&#039;&#039;: registre d&#039;autorisation des interruptions. Chaque bit correspond à une interruption (bit0 =&amp;gt; IRQ0, bit1 =&amp;gt; IRQ1, etc.). Ce registre sera accessible en lecture et en écriture.&lt;br /&gt;
* &#039;&#039;&#039;isr_pend&#039;&#039;&#039;: ce registre est à double emploi&lt;br /&gt;
** &#039;&#039;&#039;en lecture&#039;&#039;&#039;: Les interruptions en attente de traitement&lt;br /&gt;
** &#039;&#039;&#039;en écriture&#039;&#039;&#039;: Acquittement des interruptions. Chaque bit à 1 va acquitter l&#039;interruption correspondante.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le script / programme d&#039;assemblage des IP ==&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant parler du coeur du système, du moins de la partie la plus visible de l&#039;iceberg ;-)&lt;br /&gt;
&lt;br /&gt;
La première des priorités, sera de trouver un nom pour cet outil qui reste un peu dans l&#039;esprit du projet. Voici quelques propositions, à vous de compléter ou de voter pour un nom ou plusieurs noms:&lt;br /&gt;
* Concerto&lt;br /&gt;
* Orchestra&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Principe et fonctionnement ===&lt;br /&gt;
Afin de de rendre tout ce système utilisable par le plus grand nombre, il faut être capable de proposer des outils qui vont simplifier la vie de l&#039;utilisateur final ainsi que de l&#039;intégrateur.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faudra créer un outil soit sous forme de script(s), soit sous forme de programme(s) qui va permettre de réaliser les tâches suivantes:&lt;br /&gt;
* Edition d&#039;un &#039;&#039;&#039;système wishbone&#039;&#039;&#039;, c&#039;est-à-dire&lt;br /&gt;
** Ajout/suppression de composants &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039; (c&#039;est comme HD Ready mais en mieux ;-) ).&lt;br /&gt;
** Configuration des adresses de base de chaque composant placé sur le bus Wishbone. La plage d&#039;adresses étant donné par la taille du bus d&#039;adresses du composant.&lt;br /&gt;
** Affection du bit d&#039;interruption pour chaque composant ayant besoin de générer une interruption.&lt;br /&gt;
** Affection des signaux non wishbone d&#039;entrée et de sortie des composants aux broches du FPGA si cela est possible&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;&#039;&#039;mapping&#039;&#039;&#039;&#039;&#039; contenant:&lt;br /&gt;
** Un &#039;&#039;Time Stamp&#039;&#039; pour connaitre la date de création/génération du système&lt;br /&gt;
** Le fréquence de base du bus Wishbone&lt;br /&gt;
** L&#039;adresse de base de chaque composant&lt;br /&gt;
** Le niveau d&#039;interruption affecté à chaque composant&lt;br /&gt;
* Génération du macro composant &#039;&#039;&#039;syscon&#039;&#039;&#039; qui va faire le lien (routage) entre les différents composants sus le bus Wishbone.&lt;br /&gt;
* Génération du composant &#039;&#039;&#039;system&#039;&#039;&#039; qui va regrouper toutes les connexions internes au système que l&#039;on est en train de créer dans un seul fichier HDL (VHDL ou Verilog). C&#039;est ce fichier qui sera alors instancier dans &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039; avec éventuellement d&#039;autres IP qui n&#039;ont pas de lien directe avec l&#039;i.MX&lt;br /&gt;
* Génération d&#039;un fichier script &#039;&#039;&#039;tcl&#039;&#039;&#039; pour la création du projet de base pour &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039;. Ceci va éviter les erreurs de connexions sur les broches du FPGA, au moins pour la partie relative à l&#039;i.MX.&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;Makefile&#039;&#039;&#039; pour la création des DLL d&#039;accès au système via programme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier la vie des programmateurs systèmes, il faut pouvoir offrir un mécanisme simple de mise en place et de gestion des demandes d&#039;interruption du FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour cela, je propose la solution suivante:&lt;br /&gt;
* Mise en place d&#039;un gestionnaire d&#039;interruption générique pour le FPGA. Ce gestionnaire d&#039;interruption sera capable de lire le registre d&#039;interruption (lecture de &#039;&#039;&#039;isr_pend&#039;&#039;&#039;) et de déterminer les interruptions à traiter (via &#039;&#039;&#039;isr_mask&#039;&#039;&#039;). Il va en suite aiguiller l&#039;exécution de la routine d&#039;interruption vers les routines adéquates pour chaque bit d&#039;interruption valide. L&#039;interruption traitée sera alors acquitée (écriture vers &#039;&#039;&#039;isr_pend&#039;&#039;&#039;).&lt;br /&gt;
* Création d&#039;une routine &#039;&#039;&#039;&#039;&#039;d&#039;enregistrement de vecteur d&#039;interruption&#039;&#039;&#039;&#039;&#039;. Cette routine va permettre d&#039;ajouter une routine de traitement d&#039;interruption pour un bit d&#039;interruption donné. Pour cela il faudra lui fournir les informations suivantes (via une structure ?!?):&lt;br /&gt;
** Le numéro du bit d&#039;interruption (0 à 31)&lt;br /&gt;
** La routine de traitement d&#039;interruption pour ce driver&lt;br /&gt;
** Un paramètre additionnel à fournir à la routine de traitement d&#039;interruption (pointeur de type &#039;&#039;&#039;&#039;&#039;void *&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
** Le nom du drivers (optionnel, permet d&#039;identifier/visualiser les drivers installer éventuellement)&lt;br /&gt;
* Création d&#039;une routine de validation d&#039;une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour masquer une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour désinstaller une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine ou méthode pour visualiser tous les drivers Wishbone installés:&lt;br /&gt;
** Leur numéro&lt;br /&gt;
** Leur nom&lt;br /&gt;
** Leur état (validé/masqué)&lt;br /&gt;
** Le nombre de fois qu&#039;ils ont été appelé&lt;br /&gt;
** etc.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1778</id>
		<title>FpgaArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1778"/>
		<updated>2006-12-17T13:57:07Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Le script / programme d&amp;#039;assemblage des IP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spécifications de conception du FPGA =&lt;br /&gt;
&lt;br /&gt;
== But ==&lt;br /&gt;
&lt;br /&gt;
Cette page a été créée pour permettre à tous les membres de l&#039;association de discuter de l&#039;architecture qui va être mise en place pour le FPGA présent sur la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Cette espace doit être vu comme un espace d&#039;échange d&#039;idées. Tout le monde est convié à y participer. Il est préférable d&#039;avoir quelques connaissances en électronique et sur les langages HDL (VHDL ou Verilog), mais ce n&#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
Bonne lecture et merci pour votre participation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les grandes lignes ==&lt;br /&gt;
&lt;br /&gt;
Le FPGA de la carte APF9328 est là pour offrir le maximum de souplesse au projet &#039;&#039;&#039;Armadeus&#039;&#039;&#039; et permettre d&#039;implanter des fonctionnalités coté &#039;&#039;&#039;matériel&#039;&#039;&#039; qui seraient trop pénalisantes ou impossibles à implanter coté &#039;&#039;&#039;logiciel&#039;&#039;&#039;. Bien entendu, pour que cela soit exploitable, il faut également disposer d&#039;un lien entre le FPGA et le processeur i.MX.&lt;br /&gt;
&lt;br /&gt;
Pour réaliser cela, il faut mettre en place un bus de communication entre le FPGA et l&#039;i.MX. Ce bus de communication va permettre le pilotage des fonctionnalités qui seront implantées dans le FPGA. Bref, il faut recréer à l&#039;intérieur du FPGA un bus tel qu&#039;il existe entre l&#039;i.MX et les différents composants de la carte (RAM, Flash, USB, Ethernet, etc.).&lt;br /&gt;
&lt;br /&gt;
Pour gagner en temps de développement et pour pouvoir récupérer des fonctionnalités ou IP (Intellectual Property) déjà existantes, le bus Wishbone a été retenu. Ce bus, dont les spécification ont été placées dans le domaine public, a été conçu spécifiquement pour ce genre de configuration et sur le site &#039;&#039;&#039;[http://www.opencores.com www.opencores.com]&#039;&#039;&#039; plusieurs IP compatibles avec les spécifications Wishbone sont disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
La spécification Wishbone décrit un certain nombre de composants de base:&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;maitres&#039;&#039;&#039;, ces interfaces sont implantés dans des composants qui seront alors capable d&#039;initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;esclaves&#039;&#039;&#039;, ces interfaces sont implantés dans des composants capables de répondre à des demandes de transferts&lt;br /&gt;
* Un composant &#039;&#039;&#039;syscon&#039;&#039;&#039;, ce composant va générer le signal d&#039;horloge qui sera utilisé par tous les composants/interfaces du bus ainsi que le signal de RESET synchrone.&lt;br /&gt;
* Un macro composant &#039;&#039;&#039;intercon&#039;&#039;&#039;, ce composant va gérer la connexion de toutes les interfaces maitres et esclaves qui composent le bus interne. Il prend en charge :&lt;br /&gt;
** Le décodage/transcodage d&#039;adresse (génération des signaux A0 à A3 selon le mode d&#039;adressage 8/16/32/64 bits)&lt;br /&gt;
** le routage du bus de données entre les différentes interfaces maitres et esclaves (conversion big endian/little endian, etc)&lt;br /&gt;
** le routage/génération des signaux de contrôle du bus (Read, Write, Chip Select, Output Enable, ACK, etc.)&lt;br /&gt;
* Un composant &#039;&#039;&#039;arbitre&#039;&#039;&#039;, ce composant va permettre de partager l&#039;accès au bus ou à un composant de type esclave qui est partagé par plusieurs composants de type maitre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les spécifications du bus Wishbone permettent de créer différents types de bus:&lt;br /&gt;
* &#039;&#039;&#039;Point to Point&#039;&#039;&#039;&#039;: Un composant avec une interface type maitre connecté à un composant avec une interface de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Data Flow&#039;&#039;&#039;: C&#039;est un bus en cascade, à un bout on trouve un composant avec une interface de type maître et à l&#039;autre bout un composant avec une interface de type esclave. Entre les deux composant se trouve une chaine d&#039;un ou plusieurs composants avec une interface de type maitre et de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;: C&#039;est un bus sur lequel plusieurs composants sont connectés dessus. Tous les composants se partagent ce bus. Si plusieurs &#039;&#039;maitres&#039;&#039; sont connectés sur ce bus, un seul pourra initier un transfert à un instant donné.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: C&#039;est également un bus de type partagé, par contre dans se cas, on dispose de plusieurs bus. Chaque maitre utilise sont propre bus pour communiquer avec ces esclaves. On peut donc avoir plusieurs transferts en simultané. Le seul cas de blocage/arbitrage est le transfert de plusieurs maitre avec le même esclave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe également un certain nombre de mécanismes dans la spécification Wishbone pour permettre d&#039;optimiser les temps de transferts sur le bus. Ces optimisations sont de plusieurs nature:&lt;br /&gt;
* utilisation de signaux &#039;&#039;&#039;ACK&#039;&#039;&#039;, &#039;&#039;&#039;ERR&#039;&#039;&#039; et &#039;&#039;&#039;RTY&#039;&#039;&#039; pour signaler la fin de transfert&lt;br /&gt;
* les &#039;&#039;&#039;Registered Feedback Bus Cycles&#039;&#039;&#039;, qui permettent de gagner un cycle d&#039;horloge pour des transferts consécutifs&lt;br /&gt;
* les transferts en mode &#039;&#039;&#039;Burts&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le lien i.MX &amp;lt;=&amp;gt; FPGA ==&lt;br /&gt;
&lt;br /&gt;
La communication entre l&#039;i.MX et le FPGA passe par les signaux suivants (à vérifier):&lt;br /&gt;
* des signaux de contrôle: RW_n, OE_n, EB_n[3..2] et CS1_n&lt;br /&gt;
* le bus de données sur 16 bits (D[15..0])&lt;br /&gt;
* le bus d&#039;adresses sur 12 bits (A[12..1])&lt;br /&gt;
&lt;br /&gt;
Ces signaux sont alors utilisés pour créer une interface Wishbone maitre qui va permettre de communiquer efficacement avec les autres IPs contenus dans le FPGA qui implémenterons une interface wishbone de type esclave.&lt;br /&gt;
&lt;br /&gt;
Etant donné les erratas du composant i.MX  concernant le signal DTACK, il n&#039;est pas possible d&#039;implanter une interface Wishbone maitre &#039;&#039;classique&#039;&#039;. Ceci entraine les limitations suivantes:&lt;br /&gt;
* Pas possible d&#039;utiliser le signal &#039;&#039;&#039;ACK&#039;&#039;&#039; Wishbone pour terminer le transfert entre FPGA et i.MAX.&lt;br /&gt;
* Pas possible de mettre en place des optimisations du temps de transfert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce problème, il faudra s&#039;assurer que toutes les interfaces esclaves qui seront connectées à l&#039;interface maitre du composant Wishbone i.MX répondent dans un temps fixe donné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme le bus Wishbone est un bus entièrement synchrone, le temps minimal d&#039;un transfert est de 2 cycles de l&#039;horloge Wishbone. Il faut ajouter à cela, un cycle pour la synchronisation des signaux du bus i.MX. Cela nous fait donc un minimum de 3 cycles Wishbone pour un transfert entre le FPGA et l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
Etant donné les performances des FPGA actuels, on peut tabler sur une fréquence de fonctionnement d&#039;au moins 100MHz pour le bus Wishbone. Cela nous donne donc un taux de transfert approximatif de 66M octets/sec (100MHz * 16bits / 3).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== La composition du système Wishbone ==&lt;br /&gt;
&lt;br /&gt;
[[Image:FPGA_Armadeus.png]]&lt;br /&gt;
&lt;br /&gt;
Le système Wishbone qui sera implanté dans le FPGA se compose des éléments suivants:&lt;br /&gt;
* &#039;&#039;&#039;i.MX Wrapper&#039;&#039;&#039;: L&#039;interface i.MX vers le bus Wishbone&lt;br /&gt;
* &#039;&#039;&#039;Syscon&#039;&#039;&#039;: Ce composant va gérer les signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; (généré par une PLL) et &#039;&#039;&#039;RESET&#039;&#039;&#039; (synchrone).&lt;br /&gt;
* &#039;&#039;&#039;Intercon&#039;&#039;&#039;: Ce composant devra être généré automatiquement par une moulinette, il va faire le lien entre tous les composants faisant parti du &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Gestionnaire d&#039;interruption&#039;&#039;&#039;: Ce composant est un &#039;&#039;&#039;esclave wishbone&#039;&#039;&#039; et va centraliser toutes les demandes d&#039;interruption et le remontées vers l&#039;i.MX.&lt;br /&gt;
* &#039;&#039;&#039;Esclaves whisbone&#039;&#039;&#039;: Ceci représentent tous les autres composants avec une interface wishbone esclave qui sont accessibles via le wrapper i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur le diagramme, il manque un certain nombre de choses:&lt;br /&gt;
* Les signaux &#039;&#039;non wishbone&#039;&#039; en entrée ou en sortie sur les &#039;&#039;&#039;esclaves wishbone&#039;&#039;&#039;&lt;br /&gt;
* Le macro composant &#039;&#039;&#039;système wishbone&#039;&#039;&#039;. Ce macro composant est celui qui sera ensuite instancié dans le design du FPGA. Sur ce composant ne seront visibles que les signaux &#039;&#039;externes&#039;&#039; au système:&lt;br /&gt;
** Les signaux issus de l&#039;i.MX&lt;br /&gt;
** Le signal RESET (en entrée) qui sera synchronisé sur l&#039;horloge système&lt;br /&gt;
** Le signal CLK (en entrée) qui sera l&#039;horloge utilisée pour la génération des signaux Wishbone&lt;br /&gt;
** Le signal IRQ (en sortie) qui sera utilisé pour remonter les demandes d&#039;interruption vers l&#039;i.MX&lt;br /&gt;
** Les signaux d&#039;entrée et de sortie spécifiques au autres composants connectés sur le bus Wishbone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt de créer le composant &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;, est que cela simplifie la vision dans l&#039;outil conception du FPGA. Il ne suffit plus alors qu&#039;à relier les signaux sur les broches correspondantes du FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== i.MX Wrapper ===&lt;br /&gt;
&lt;br /&gt;
Ce composant est le point d&#039;accès au bus Wishbone pour l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syscom ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est le composant le plus simple du système, il ne fait que synchroniser le signal RESET en entrée avec le signal d&#039;horloge du système.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Intercon ===&lt;br /&gt;
&lt;br /&gt;
Ce composant a la particularité qu&#039;il sera créé automatiquement par un outils (script ou programme). &#039;&#039;&#039;Intercom&#039;&#039;&#039; a comme fonctionnalité:&lt;br /&gt;
* Le décodage d&#039;adresse pour la sélection des différents esclaves du système&lt;br /&gt;
* Le routage des bus d&#039;adresses et de données vers les différents esclaves&lt;br /&gt;
* La génération des signaux de contrôle pour les différents esclaves.&lt;br /&gt;
&lt;br /&gt;
Etant donné les limitations induites par les erratas de l&#039;i.MX, le composant &#039;&#039;&#039;intercom&#039;&#039;&#039; remplira les fonctionnalités suivantes:&lt;br /&gt;
* le bus de données est figé sur 16 bits&lt;br /&gt;
* les cycles de lecture et d&#039;écriture sont de longueur fixe (à priori 3 cycles d&#039;horloge &#039;&#039;&#039;à valider&#039;&#039;&#039;)&lt;br /&gt;
* une interruption est générée en cas de dépassement du temps de cycle d&#039;écriture ou de lecture&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les composants esclaves ===&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;une IP puisse être facilement incluse dans le système, il faut une certaine organisation. Sinon, à moyen ou à long terme cette IP est morte parce qu&#039;elle sera difficilement exploitable et encore plus difficilement maintenable.&lt;br /&gt;
Ceux sont des notions pas simple à prendre en considération lors du développement d&#039;un nouveau projet, mais lorsque l&#039;on doit se replonger dans un travail fait par quelqu&#039;un d&#039;autre ou un projet qu&#039;on a laissé en sommeil pendant quelque temps, on est content d&#039;avoir quelque chose à quoi se raccrocher.&lt;br /&gt;
Pour développer efficacement, il faut assurer une organisation logique, figée et compréhensible, et le plus simple dans ce genre de cas est de se baser sur la notion de répertoire. Voici les répertoires qui doivent être utilisés par une IP:&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: Ce répertoire va contenir toute la documentation nécessaire à l&#039;exploitation de l&#039;IP. On y trouvera une notice (&#039;&#039;&#039;readme.txt&#039;&#039;&#039;), un fichier de suivit de modification (&#039;&#039;&#039;ChangeLog.txt&#039;&#039;&#039;), un fichier contenant les évolutions futures prévues (&#039;&#039;&#039;todo.txt&#039;&#039;&#039;) ainsi que tout autre fichier estimé utile par le(s) créateur(s) de l&#039;IP.&lt;br /&gt;
* &#039;&#039;&#039;hdl&#039;&#039;&#039;: Ce répertoire va contenir tous les fichiers VHDL (ou Verilog) qui auront été développés spécifiquement pour cette IP.&lt;br /&gt;
* &#039;&#039;&#039;inc&#039;&#039;&#039;: Ce répertoire va contenir un fichier d&#039;en-tête ANSI C contenant l&#039;adresse de tous les registres interne de l&#039;IP pour permettre de créer simplement un programme en langage C permettant de contrôler l&#039;IP. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HAL&#039;&#039;&#039;: Ce répertoire va contenir un drivers ou un exemple de logiciel de base permettant l&#039;utilisation de l&#039;IP par un microprocesseur/contrôleur. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Ce composant esclave est le premier qui sera créé spécifiquement pour le système. Il sera capable de:&lt;br /&gt;
* prendre en compte jusqu&#039;à 16 sources d&#039;interruptions différents&lt;br /&gt;
* réaliser l&#039;acquittement chaque interruption individuellement&lt;br /&gt;
* masquer/autoriser chaque interruption individuellement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le composant dispose des registres suivants:&lt;br /&gt;
* &#039;&#039;&#039;isr_mask&#039;&#039;&#039;: registre d&#039;autorisation des interruptions. Chaque bit correspond à une interruption (bit0 =&amp;gt; IRQ0, bit1 =&amp;gt; IRQ1, etc.). Ce registre sera accessible en lecture et en écriture.&lt;br /&gt;
* &#039;&#039;&#039;isr_pend&#039;&#039;&#039;: ce registre est à double emploi&lt;br /&gt;
** &#039;&#039;&#039;en lecture&#039;&#039;&#039;: Les interruptions en attente de traitement&lt;br /&gt;
** &#039;&#039;&#039;en écriture&#039;&#039;&#039;: Acquittement des interruptions. Chaque bit à 1 va acquitter l&#039;interruption correspondante.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le script / programme d&#039;assemblage des IP ==&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant parler du coeur du système, du moins de la partie la plus visible de l&#039;iceberg ;-)&lt;br /&gt;
&lt;br /&gt;
La première des priorités, sera de trouver un nom pour cet outil qui reste un peu dans l&#039;esprit du projet. Voici quelques propositions, à vous de compléter ou de voter pour un nom ou plusieurs noms:&lt;br /&gt;
* Concerto&lt;br /&gt;
* Orchestra&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Principe et fonctionnement ===&lt;br /&gt;
Afin de de rendre tout ce système utilisable par le plus grand nombre, il faut être capable de proposer des outils qui vont simplifier la vie de l&#039;utilisateur final ainsi que de l&#039;intégrateur.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faudra créer un outil soit sous forme de script(s), soit sous forme de programme(s) qui va permettre de réaliser les tâches suivantes:&lt;br /&gt;
* Edition d&#039;un &#039;&#039;&#039;système wishbone&#039;&#039;&#039;, c&#039;est-à-dire&lt;br /&gt;
** Ajout/suppression de composants &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039; (c&#039;est comme HD Ready mais en mieux ;-) ).&lt;br /&gt;
** Configuration des adresses de base de chaque composant placé sur le bus Wishbone. La plage d&#039;adresses étant donné par la taille du bus d&#039;adresses du composant.&lt;br /&gt;
** Affection du bit d&#039;interruption pour chaque composant ayant besoin de générer une interruption.&lt;br /&gt;
** Affection des signaux non wishbone d&#039;entrée et de sortie des composants aux broches du FPGA si cela est possible&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;&#039;&#039;mapping&#039;&#039;&#039;&#039;&#039; contenant:&lt;br /&gt;
** Un &#039;&#039;Time Stamp&#039;&#039; pour connaitre la date de création/génération du système&lt;br /&gt;
** Le fréquence de base du bus Wishbone&lt;br /&gt;
** L&#039;adresse de base de chaque composant&lt;br /&gt;
** Le niveau d&#039;interruption affecté à chaque composant&lt;br /&gt;
* Génération du macro composant &#039;&#039;&#039;syscon&#039;&#039;&#039; qui va faire le lien (routage) entre les différents composants sus le bus Wishbone.&lt;br /&gt;
* Génération du composant &#039;&#039;&#039;system&#039;&#039;&#039; qui va regrouper toutes les connexions internes au système que l&#039;on est en train de créer dans un seul fichier HDL (VHDL ou Verilog). C&#039;est ce fichier qui sera alors instancier dans &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039; avec éventuellement d&#039;autres IP qui n&#039;ont pas de lien directe avec l&#039;i.MX&lt;br /&gt;
* Génération d&#039;un fichier script &#039;&#039;&#039;tcl&#039;&#039;&#039; pour la création du projet de base pour &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039;. Ceci va éviter les erreurs de connexions sur les broches du FPGA, au moins pour la partie relative à l&#039;i.MX.&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;Makefile&#039;&#039;&#039; pour la création des DLL d&#039;accès au système via programme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier la vie des programmateurs systèmes, il faut pouvoir offrir un mécanisme simple de mise en place et de gestion des demandes d&#039;interruption du FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour cela, je propose la solution suivante:&lt;br /&gt;
* Mise en place d&#039;un gestionnaire d&#039;interruption générique pour le FPGA. Ce gestionnaire d&#039;interruption sera capable de lire le registre d&#039;interruption (lecture de &#039;&#039;&#039;isr_pend&#039;&#039;&#039;) et de déterminer les interruptions à traiter (via &#039;&#039;&#039;isr_mask&#039;&#039;&#039;). Il va en suite aiguiller l&#039;exécution de la routine d&#039;interruption vers les routines adéquates pour chaque bit d&#039;interruption valide. L&#039;interruption traitée sera alors acquitée (écriture vers &#039;&#039;&#039;isr_pend&#039;&#039;&#039;).&lt;br /&gt;
* Création d&#039;une routine &#039;&#039;&#039;&#039;&#039;d&#039;enregistrement de vecteur d&#039;interruption&#039;&#039;&#039;&#039;&#039;. Cette routine va permettre d&#039;ajouter une routine de traitement d&#039;interruption pour un bit d&#039;interruption donné. Pour cela il faudra lui fournir les informations suivantes (via une structure ?!?):&lt;br /&gt;
** Un numéro du bit d&#039;interruption (0 à 31)&lt;br /&gt;
** Une routine de traitement d&#039;interruption pour ce driver&lt;br /&gt;
** Un paramètre additionnel à fournir à la routine de traitement d&#039;interruption (pointeur de type &#039;&#039;&#039;&#039;&#039;void *&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
** Le nom du drivers (optionnel, permet d&#039;identifier/visualiser les drivers installer éventuellement)&lt;br /&gt;
* Création d&#039;une routine de validation d&#039;une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour masquer une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour désinstaller une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine ou méthode pour visualiser tous les drivers Wishbone installés:&lt;br /&gt;
** Leur numéro&lt;br /&gt;
** Leur nom&lt;br /&gt;
** Leur état (validé/masqué)&lt;br /&gt;
** Le nombre de fois qu&#039;ils ont été appelé&lt;br /&gt;
** etc.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
	<entry>
		<id>http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1777</id>
		<title>FpgaArchitecture</title>
		<link rel="alternate" type="text/html" href="http://wikilegacy.armadeus.com/index.php?title=FpgaArchitecture&amp;diff=1777"/>
		<updated>2006-12-17T13:51:54Z</updated>

		<summary type="html">&lt;p&gt;FabriceM: /* Le script / programme d&amp;#039;assemblage des IP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spécifications de conception du FPGA =&lt;br /&gt;
&lt;br /&gt;
== But ==&lt;br /&gt;
&lt;br /&gt;
Cette page a été créée pour permettre à tous les membres de l&#039;association de discuter de l&#039;architecture qui va être mise en place pour le FPGA présent sur la carte APF9328.&lt;br /&gt;
&lt;br /&gt;
Cette espace doit être vu comme un espace d&#039;échange d&#039;idées. Tout le monde est convié à y participer. Il est préférable d&#039;avoir quelques connaissances en électronique et sur les langages HDL (VHDL ou Verilog), mais ce n&#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
Bonne lecture et merci pour votre participation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les grandes lignes ==&lt;br /&gt;
&lt;br /&gt;
Le FPGA de la carte APF9328 est là pour offrir le maximum de souplesse au projet &#039;&#039;&#039;Armadeus&#039;&#039;&#039; et permettre d&#039;implanter des fonctionnalités coté &#039;&#039;&#039;matériel&#039;&#039;&#039; qui seraient trop pénalisantes ou impossibles à implanter coté &#039;&#039;&#039;logiciel&#039;&#039;&#039;. Bien entendu, pour que cela soit exploitable, il faut également disposer d&#039;un lien entre le FPGA et le processeur i.MX.&lt;br /&gt;
&lt;br /&gt;
Pour réaliser cela, il faut mettre en place un bus de communication entre le FPGA et l&#039;i.MX. Ce bus de communication va permettre le pilotage des fonctionnalités qui seront implantées dans le FPGA. Bref, il faut recréer à l&#039;intérieur du FPGA un bus tel qu&#039;il existe entre l&#039;i.MX et les différents composants de la carte (RAM, Flash, USB, Ethernet, etc.).&lt;br /&gt;
&lt;br /&gt;
Pour gagner en temps de développement et pour pouvoir récupérer des fonctionnalités ou IP (Intellectual Property) déjà existantes, le bus Wishbone a été retenu. Ce bus, dont les spécification ont été placées dans le domaine public, a été conçu spécifiquement pour ce genre de configuration et sur le site &#039;&#039;&#039;[http://www.opencores.com www.opencores.com]&#039;&#039;&#039; plusieurs IP compatibles avec les spécifications Wishbone sont disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le bus Wishbone ==&lt;br /&gt;
&lt;br /&gt;
La spécification Wishbone décrit un certain nombre de composants de base:&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;maitres&#039;&#039;&#039;, ces interfaces sont implantés dans des composants qui seront alors capable d&#039;initier les transferts sur le bus Wishbone&lt;br /&gt;
* Des interfaces &#039;&#039;&#039;esclaves&#039;&#039;&#039;, ces interfaces sont implantés dans des composants capables de répondre à des demandes de transferts&lt;br /&gt;
* Un composant &#039;&#039;&#039;syscon&#039;&#039;&#039;, ce composant va générer le signal d&#039;horloge qui sera utilisé par tous les composants/interfaces du bus ainsi que le signal de RESET synchrone.&lt;br /&gt;
* Un macro composant &#039;&#039;&#039;intercon&#039;&#039;&#039;, ce composant va gérer la connexion de toutes les interfaces maitres et esclaves qui composent le bus interne. Il prend en charge :&lt;br /&gt;
** Le décodage/transcodage d&#039;adresse (génération des signaux A0 à A3 selon le mode d&#039;adressage 8/16/32/64 bits)&lt;br /&gt;
** le routage du bus de données entre les différentes interfaces maitres et esclaves (conversion big endian/little endian, etc)&lt;br /&gt;
** le routage/génération des signaux de contrôle du bus (Read, Write, Chip Select, Output Enable, ACK, etc.)&lt;br /&gt;
* Un composant &#039;&#039;&#039;arbitre&#039;&#039;&#039;, ce composant va permettre de partager l&#039;accès au bus ou à un composant de type esclave qui est partagé par plusieurs composants de type maitre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les spécifications du bus Wishbone permettent de créer différents types de bus:&lt;br /&gt;
* &#039;&#039;&#039;Point to Point&#039;&#039;&#039;&#039;: Un composant avec une interface type maitre connecté à un composant avec une interface de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Data Flow&#039;&#039;&#039;: C&#039;est un bus en cascade, à un bout on trouve un composant avec une interface de type maître et à l&#039;autre bout un composant avec une interface de type esclave. Entre les deux composant se trouve une chaine d&#039;un ou plusieurs composants avec une interface de type maitre et de type esclave.&lt;br /&gt;
* &#039;&#039;&#039;Shared&#039;&#039;&#039;: C&#039;est un bus sur lequel plusieurs composants sont connectés dessus. Tous les composants se partagent ce bus. Si plusieurs &#039;&#039;maitres&#039;&#039; sont connectés sur ce bus, un seul pourra initier un transfert à un instant donné.&lt;br /&gt;
* &#039;&#039;&#039;CrossBar&#039;&#039;&#039;: C&#039;est également un bus de type partagé, par contre dans se cas, on dispose de plusieurs bus. Chaque maitre utilise sont propre bus pour communiquer avec ces esclaves. On peut donc avoir plusieurs transferts en simultané. Le seul cas de blocage/arbitrage est le transfert de plusieurs maitre avec le même esclave.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe également un certain nombre de mécanismes dans la spécification Wishbone pour permettre d&#039;optimiser les temps de transferts sur le bus. Ces optimisations sont de plusieurs nature:&lt;br /&gt;
* utilisation de signaux &#039;&#039;&#039;ACK&#039;&#039;&#039;, &#039;&#039;&#039;ERR&#039;&#039;&#039; et &#039;&#039;&#039;RTY&#039;&#039;&#039; pour signaler la fin de transfert&lt;br /&gt;
* les &#039;&#039;&#039;Registered Feedback Bus Cycles&#039;&#039;&#039;, qui permettent de gagner un cycle d&#039;horloge pour des transferts consécutifs&lt;br /&gt;
* les transferts en mode &#039;&#039;&#039;Burts&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le lien i.MX &amp;lt;=&amp;gt; FPGA ==&lt;br /&gt;
&lt;br /&gt;
La communication entre l&#039;i.MX et le FPGA passe par les signaux suivants (à vérifier):&lt;br /&gt;
* des signaux de contrôle: RW_n, OE_n, EB_n[3..2] et CS1_n&lt;br /&gt;
* le bus de données sur 16 bits (D[15..0])&lt;br /&gt;
* le bus d&#039;adresses sur 12 bits (A[12..1])&lt;br /&gt;
&lt;br /&gt;
Ces signaux sont alors utilisés pour créer une interface Wishbone maitre qui va permettre de communiquer efficacement avec les autres IPs contenus dans le FPGA qui implémenterons une interface wishbone de type esclave.&lt;br /&gt;
&lt;br /&gt;
Etant donné les erratas du composant i.MX  concernant le signal DTACK, il n&#039;est pas possible d&#039;implanter une interface Wishbone maitre &#039;&#039;classique&#039;&#039;. Ceci entraine les limitations suivantes:&lt;br /&gt;
* Pas possible d&#039;utiliser le signal &#039;&#039;&#039;ACK&#039;&#039;&#039; Wishbone pour terminer le transfert entre FPGA et i.MAX.&lt;br /&gt;
* Pas possible de mettre en place des optimisations du temps de transfert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour contrer ce problème, il faudra s&#039;assurer que toutes les interfaces esclaves qui seront connectées à l&#039;interface maitre du composant Wishbone i.MX répondent dans un temps fixe donné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme le bus Wishbone est un bus entièrement synchrone, le temps minimal d&#039;un transfert est de 2 cycles de l&#039;horloge Wishbone. Il faut ajouter à cela, un cycle pour la synchronisation des signaux du bus i.MX. Cela nous fait donc un minimum de 3 cycles Wishbone pour un transfert entre le FPGA et l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
Etant donné les performances des FPGA actuels, on peut tabler sur une fréquence de fonctionnement d&#039;au moins 100MHz pour le bus Wishbone. Cela nous donne donc un taux de transfert approximatif de 66M octets/sec (100MHz * 16bits / 3).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== La composition du système Wishbone ==&lt;br /&gt;
&lt;br /&gt;
[[Image:FPGA_Armadeus.png]]&lt;br /&gt;
&lt;br /&gt;
Le système Wishbone qui sera implanté dans le FPGA se compose des éléments suivants:&lt;br /&gt;
* &#039;&#039;&#039;i.MX Wrapper&#039;&#039;&#039;: L&#039;interface i.MX vers le bus Wishbone&lt;br /&gt;
* &#039;&#039;&#039;Syscon&#039;&#039;&#039;: Ce composant va gérer les signaux &#039;&#039;&#039;CLK&#039;&#039;&#039; (généré par une PLL) et &#039;&#039;&#039;RESET&#039;&#039;&#039; (synchrone).&lt;br /&gt;
* &#039;&#039;&#039;Intercon&#039;&#039;&#039;: Ce composant devra être généré automatiquement par une moulinette, il va faire le lien entre tous les composants faisant parti du &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Gestionnaire d&#039;interruption&#039;&#039;&#039;: Ce composant est un &#039;&#039;&#039;esclave wishbone&#039;&#039;&#039; et va centraliser toutes les demandes d&#039;interruption et le remontées vers l&#039;i.MX.&lt;br /&gt;
* &#039;&#039;&#039;Esclaves whisbone&#039;&#039;&#039;: Ceci représentent tous les autres composants avec une interface wishbone esclave qui sont accessibles via le wrapper i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur le diagramme, il manque un certain nombre de choses:&lt;br /&gt;
* Les signaux &#039;&#039;non wishbone&#039;&#039; en entrée ou en sortie sur les &#039;&#039;&#039;esclaves wishbone&#039;&#039;&#039;&lt;br /&gt;
* Le macro composant &#039;&#039;&#039;système wishbone&#039;&#039;&#039;. Ce macro composant est celui qui sera ensuite instancié dans le design du FPGA. Sur ce composant ne seront visibles que les signaux &#039;&#039;externes&#039;&#039; au système:&lt;br /&gt;
** Les signaux issus de l&#039;i.MX&lt;br /&gt;
** Le signal RESET (en entrée) qui sera synchronisé sur l&#039;horloge système&lt;br /&gt;
** Le signal CLK (en entrée) qui sera l&#039;horloge utilisée pour la génération des signaux Wishbone&lt;br /&gt;
** Le signal IRQ (en sortie) qui sera utilisé pour remonter les demandes d&#039;interruption vers l&#039;i.MX&lt;br /&gt;
** Les signaux d&#039;entrée et de sortie spécifiques au autres composants connectés sur le bus Wishbone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt de créer le composant &#039;&#039;&#039;Système Wishbone&#039;&#039;&#039;, est que cela simplifie la vision dans l&#039;outil conception du FPGA. Il ne suffit plus alors qu&#039;à relier les signaux sur les broches correspondantes du FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== i.MX Wrapper ===&lt;br /&gt;
&lt;br /&gt;
Ce composant est le point d&#039;accès au bus Wishbone pour l&#039;i.MX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syscom ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est le composant le plus simple du système, il ne fait que synchroniser le signal RESET en entrée avec le signal d&#039;horloge du système.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Intercon ===&lt;br /&gt;
&lt;br /&gt;
Ce composant a la particularité qu&#039;il sera créé automatiquement par un outils (script ou programme). &#039;&#039;&#039;Intercom&#039;&#039;&#039; a comme fonctionnalité:&lt;br /&gt;
* Le décodage d&#039;adresse pour la sélection des différents esclaves du système&lt;br /&gt;
* Le routage des bus d&#039;adresses et de données vers les différents esclaves&lt;br /&gt;
* La génération des signaux de contrôle pour les différents esclaves.&lt;br /&gt;
&lt;br /&gt;
Etant donné les limitations induites par les erratas de l&#039;i.MX, le composant &#039;&#039;&#039;intercom&#039;&#039;&#039; remplira les fonctionnalités suivantes:&lt;br /&gt;
* le bus de données est figé sur 16 bits&lt;br /&gt;
* les cycles de lecture et d&#039;écriture sont de longueur fixe (à priori 3 cycles d&#039;horloge &#039;&#039;&#039;à valider&#039;&#039;&#039;)&lt;br /&gt;
* une interruption est générée en cas de dépassement du temps de cycle d&#039;écriture ou de lecture&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les composants esclaves ===&lt;br /&gt;
&lt;br /&gt;
Pour qu&#039;une IP puisse être facilement incluse dans le système, il faut une certaine organisation. Sinon, à moyen ou à long terme cette IP est morte parce qu&#039;elle sera difficilement exploitable et encore plus difficilement maintenable.&lt;br /&gt;
Ceux sont des notions pas simple à prendre en considération lors du développement d&#039;un nouveau projet, mais lorsque l&#039;on doit se replonger dans un travail fait par quelqu&#039;un d&#039;autre ou un projet qu&#039;on a laissé en sommeil pendant quelque temps, on est content d&#039;avoir quelque chose à quoi se raccrocher.&lt;br /&gt;
Pour développer efficacement, il faut assurer une organisation logique, figée et compréhensible, et le plus simple dans ce genre de cas est de se baser sur la notion de répertoire. Voici les répertoires qui doivent être utilisés par une IP:&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: Ce répertoire va contenir toute la documentation nécessaire à l&#039;exploitation de l&#039;IP. On y trouvera une notice (&#039;&#039;&#039;readme.txt&#039;&#039;&#039;), un fichier de suivit de modification (&#039;&#039;&#039;ChangeLog.txt&#039;&#039;&#039;), un fichier contenant les évolutions futures prévues (&#039;&#039;&#039;todo.txt&#039;&#039;&#039;) ainsi que tout autre fichier estimé utile par le(s) créateur(s) de l&#039;IP.&lt;br /&gt;
* &#039;&#039;&#039;hdl&#039;&#039;&#039;: Ce répertoire va contenir tous les fichiers VHDL (ou Verilog) qui auront été développés spécifiquement pour cette IP.&lt;br /&gt;
* &#039;&#039;&#039;inc&#039;&#039;&#039;: Ce répertoire va contenir un fichier d&#039;en-tête ANSI C contenant l&#039;adresse de tous les registres interne de l&#039;IP pour permettre de créer simplement un programme en langage C permettant de contrôler l&#039;IP. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;HAL&#039;&#039;&#039;: Ce répertoire va contenir un drivers ou un exemple de logiciel de base permettant l&#039;utilisation de l&#039;IP par un microprocesseur/contrôleur. &#039;&#039;&#039;&#039;&#039;Ce répertoire est optionnel et ne s&#039;applique évidement qu&#039;à des IPs ayant une interface de type Wishbone.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Ce composant esclave est le premier qui sera créé spécifiquement pour le système. Il sera capable de:&lt;br /&gt;
* prendre en compte jusqu&#039;à 16 sources d&#039;interruptions différents&lt;br /&gt;
* réaliser l&#039;acquittement chaque interruption individuellement&lt;br /&gt;
* masquer/autoriser chaque interruption individuellement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le composant dispose des registres suivants:&lt;br /&gt;
* &#039;&#039;&#039;isr_mask&#039;&#039;&#039;: registre d&#039;autorisation des interruptions. Chaque bit correspond à une interruption (bit0 =&amp;gt; IRQ0, bit1 =&amp;gt; IRQ1, etc.). Ce registre sera accessible en lecture et en écriture.&lt;br /&gt;
* &#039;&#039;&#039;isr_pend&#039;&#039;&#039;: ce registre est à double emploi&lt;br /&gt;
** &#039;&#039;&#039;en lecture&#039;&#039;&#039;: Les interruptions en attente de traitement&lt;br /&gt;
** &#039;&#039;&#039;en écriture&#039;&#039;&#039;: Acquittement des interruptions. Chaque bit à 1 va acquitter l&#039;interruption correspondante.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le script / programme d&#039;assemblage des IP ==&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant parler du coeur du système, du moins de la partie la plus visible de l&#039;iceberg ;-)&lt;br /&gt;
&lt;br /&gt;
=== Principe et fonctionnement ===&lt;br /&gt;
Afin de de rendre tout ce système utilisable par le plus grand nombre, il faut être capable de proposer des outils qui vont simplifier la vie de l&#039;utilisateur final ainsi que de l&#039;intégrateur.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faudra créer un outil soit sous forme de script(s), soit sous forme de programme(s) qui va permettre de réaliser les tâches suivantes:&lt;br /&gt;
* Edition d&#039;un &#039;&#039;&#039;système wishbone&#039;&#039;&#039;, c&#039;est-à-dire&lt;br /&gt;
** Ajout/suppression de composants &#039;&#039;&#039;&#039;&#039;Armadeus Ready&#039;&#039;&#039;&#039;&#039; (c&#039;est comme HD Ready mais en mieux ;-) ).&lt;br /&gt;
** Configuration des adresses de base de chaque composant placé sur le bus Wishbone. La plage d&#039;adresses étant donné par la taille du bus d&#039;adresses du composant.&lt;br /&gt;
** Affection du bit d&#039;interruption pour chaque composant ayant besoin de générer une interruption.&lt;br /&gt;
** Affection des signaux non wishbone d&#039;entrée et de sortie des composants aux broches du FPGA si cela est possible&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;&#039;&#039;mapping&#039;&#039;&#039;&#039;&#039; contenant:&lt;br /&gt;
** Un &#039;&#039;Time Stamp&#039;&#039; pour connaitre la date de création/génération du système&lt;br /&gt;
** Le fréquence de base du bus Wishbone&lt;br /&gt;
** L&#039;adresse de base de chaque composant&lt;br /&gt;
** Le niveau d&#039;interruption affecté à chaque composant&lt;br /&gt;
* Génération du macro composant &#039;&#039;&#039;syscon&#039;&#039;&#039; qui va faire le lien (routage) entre les différents composants sus le bus Wishbone.&lt;br /&gt;
* Génération du composant &#039;&#039;&#039;system&#039;&#039;&#039; qui va regrouper toutes les connexions internes au système que l&#039;on est en train de créer dans un seul fichier HDL (VHDL ou Verilog). C&#039;est ce fichier qui sera alors instancier dans &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039; avec éventuellement d&#039;autres IP qui n&#039;ont pas de lien directe avec l&#039;i.MX&lt;br /&gt;
* Génération d&#039;un fichier script &#039;&#039;&#039;tcl&#039;&#039;&#039; pour la création du projet de base pour &#039;&#039;&#039;&#039;&#039;Xilinx ISE&#039;&#039;&#039;&#039;&#039;. Ceci va éviter les erreurs de connexions sur les broches du FPGA, au moins pour la partie relative à l&#039;i.MX.&lt;br /&gt;
* Génération d&#039;un fichier &#039;&#039;&#039;Makefile&#039;&#039;&#039; pour la création des DLL d&#039;accès au système via programme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gestionnaire d&#039;interruption ===&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier la vie des programmateurs systèmes, il faut pouvoir offrir un mécanisme simple de mise en place et de gestion des demandes d&#039;interruption du FPGA.&lt;br /&gt;
&lt;br /&gt;
Pour cela, je propose la solution suivante:&lt;br /&gt;
* Mise en place d&#039;un gestionnaire d&#039;interruption générique pour le FPGA. Ce gestionnaire d&#039;interruption sera capable de lire le registre d&#039;interruption (lecture de &#039;&#039;&#039;isr_pend&#039;&#039;&#039;) et de déterminer les interruptions à traiter (via &#039;&#039;&#039;isr_mask&#039;&#039;&#039;). Il va en suite aiguiller l&#039;exécution de la routine d&#039;interruption vers les routines adéquates pour chaque bit d&#039;interruption valide. L&#039;interruption traitée sera alors acquitée (écriture vers &#039;&#039;&#039;isr_pend&#039;&#039;&#039;).&lt;br /&gt;
* Création d&#039;une routine &#039;&#039;&#039;&#039;&#039;d&#039;enregistrement de vecteur d&#039;interruption&#039;&#039;&#039;&#039;&#039;. Cette routine va permettre d&#039;ajouter une routine de traitement d&#039;interruption pour un bit d&#039;interruption donné. Pour cela il faudra lui fournir les informations suivantes (via une structure ?!?):&lt;br /&gt;
** Un numéro du bit d&#039;interruption (0 à 31)&lt;br /&gt;
** Une routine de traitement d&#039;interruption pour ce driver&lt;br /&gt;
** Un paramètre additionnel à fournir à la routine de traitement d&#039;interruption (pointeur de type &#039;&#039;&#039;&#039;&#039;void *&#039;&#039;&#039;&#039;&#039;)&lt;br /&gt;
** Le nom du drivers (optionnel, permet d&#039;identifier/visualiser les drivers installer éventuellement)&lt;br /&gt;
* Création d&#039;une routine de validation d&#039;une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour masquer une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine pour désinstaller une &#039;&#039;interruption FPGA&#039;&#039; par son numéro (0 à 31)&lt;br /&gt;
* Création d&#039;une routine ou méthode pour visualiser tous les drivers Wishbone installés:&lt;br /&gt;
** Leur numéro&lt;br /&gt;
** Leur nom&lt;br /&gt;
** Leur état (validé/masqué)&lt;br /&gt;
** Le nombre de fois qu&#039;ils ont été appelé&lt;br /&gt;
** etc.&lt;/div&gt;</summary>
		<author><name>FabriceM</name></author>
	</entry>
</feed>