• Li chevron_right

      Ice Window Manager (IceWM ) version 2.0.0

      orfenor · pubsub.eckmul.net / linuxfr_news · Monday, 21 December, 2020 - 10:09 · 2 minutes

    <div><p>IceWM est un gestionnaire de fenêtres accessible à tous, fiable, léger, simple. Nous l’avons tous croisé sans le savoir en essayant une distribution légère. Il ressemble à l’interface familière de Windows95, avec une différence : il est très stable — il sert depuis longtemps de <em>fallback</em> sur la distribution SuSE, façon Vi, celui qui tourne encore quand tout est planté.<br> Il est <a href="https://www.box-look.org/browse/cat/142/order/latest">thémable</a> et on peut configurer beaucoup de choses via ses préférences. Ce n’est pas un environnement de bureau, mais il est assez complet pour qu'on se contente d’y ajouter un gestionnaire de fichier et obtenir un bureau qui « juste marche » comme dirait l’autre. Il a déjà 23 ans, il est encore en pleine forme, réactif, rapide et souple comme à ses débuts. Bref, c’est un jeune homme agréable.</p> <p>Sa version 2.0.0 ne contient que deux changements importants :</p> <ul> <li> <code>Imlib2</code> est le nouveau moteur de rendu, <code>gdk-pixbuf-xlib</code> n’est plus qu'une alternative. Pour ceux qui l’oublient, imlib2 est le moteur super rapide et super léger du <a href="https://fr.wikipedia.org/wiki/Enlightenment_%28logiciel%29">projet enlightenment</a>.</li> <li>Le protocole _WIN_PROTOCOL n'est plus supporté. En pratique Icewm n’est plus compatible avec Gnome 1. _WIN_PROTOCOL est un ancien protocole de communication avec le gestionnaire de fenêtres. Depuis l’an 2000, les applications X11 utilisent EWMH à la place. En enlevant cette rétrocompatibilité, le code est plus petit et plus facile à maintenir et IceWM est encore un petit peu plus léger.</li> </ul> <p>Le reste n’est que bugfixes et changements mireurs.</p> </div><ul><li>lien nᵒ 1 : <a title="https://ice-wm.org/" hreflang="en" href="https://linuxfr.org/redirect/107565">Le site d&#39;IceWM</a></li><li>lien nᵒ 2 : <a title="https://ice-wm.org/screenshots/" hreflang="en" href="https://linuxfr.org/redirect/107566">La section des captures d&#39;écran</a></li><li>lien nᵒ 3 : <a title="https://www.box-look.org/browse/cat/142/" hreflang="en" href="https://linuxfr.org/redirect/107567">Des thèmes pour IceWM</a></li><li>lien nᵒ 4 : <a title="https://github.com/ice-wm/icewm/releases/tag/2.0.0" hreflang="en" href="https://linuxfr.org/redirect/107568">Notes de version 2.0.0</a></li></ul><div></div><div><a href="https://linuxfr.org/news/ice-window-manager-icewm-version-2-0-0.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/122674/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/ice-window-manager-icewm-version-2-0-0#comments">ouvrir dans le navigateur</a> </p>
    • Li chevron_right

      La lettre d'information XMPP de novembre 2020

      Pierre Maziere · pubsub.eckmul.net / linuxfr_news · Monday, 21 December, 2020 - 09:03 · 24 minutes

    <div><p><em>N. D. T. — Ceci est une traduction de la lettre d’information publiée régulièrement par l’équipe de communication de la XSF, essayant de conserver les tournures de phrase et l’esprit de l’original. Elle est publiée conjointement sur les sites</em> <a href="//linuxfr.org/tags/xmpp/public">LinuxFr.org</a> <em>et</em> <a href="https://news.jabberfr.org/category/newsletter/">JabberFR.org</a><em>.</em></p> <p>Bienvenue dans la lettre d’information XMPP couvrant le mois de novembre 2020.</p> <p>Ce sera la dernière lettre d’information de cette <em>folle</em> année. C’était génial de vous avoir comme lecteurs ! Un grand merci à vous, contributeurs et relecteurs. La lettre d’information XMPP est un projet communautaire, et si vous êtes intéressés pour y participer dans l’année à venir, vous êtes les bienvenus !</p> <p>Pour celles et ceux qui font une pause au nouvel an : nous vous souhaitons d’agréables moments ! En attendant, portez-vous bien et rendez-vous l’année prochaine.</p> <p>La concrétisation de nombreux projets de la communauté XMPP est le résultat de l’engagement de personnes volontaires. Si vous êtes satisfaits des services et logiciels que vous utilisez, en particulier tout au long de cette année, s’il vous plait, n’hésitez pas à remercier ou aider ces projets. Vivement XMPP en 2021 !</p> </div><ul><li>lien nᵒ 1 : <a title="https://xmpp.org/2020/11/newsletter-11-november/" hreflang="en" href="https://linuxfr.org/redirect/107504">Cette lettre d’information de novembre 2020 en anglais</a></li><li>lien nᵒ 2 : <a title="https://xmpp.org/blog.html" hreflang="en" href="https://linuxfr.org/redirect/107505">Toutes les lettres d’information</a></li><li>lien nᵒ 3 : <a title="https://xmpp.org/newsletter.html" hreflang="en" href="https://linuxfr.org/redirect/107506">Souscrire à la lettre d’information en anglais par courriel</a></li><li>lien nᵒ 4 : <a title="https://linuxfr.org/tags/xmpp/public" hreflang="fr" href="https://linuxfr.org/redirect/107507">XMPP/Jabber sur LinuxFr.org</a></li></ul><div><h2 class="sommaire">Sommaire</h2> <ul class="toc"> <li><a href="#toc-annonces-de-la-xsf">Annonces de la XSF</a></li> <li><a href="#toc-articles">Articles</a></li> <li> <a href="#toc-des-nouvelles-des-logiciels">Des nouvelles des logiciels</a><ul> <li><a href="#toc-clients-et-applications">Clients et applications</a></li> <li><a href="#toc-serveurs">Serveurs</a></li> <li><a href="#toc-biblioth%C3%A8ques">Bibliothèques</a></li> </ul> </li> <li> <a href="#toc-extensions-et-sp%C3%A9cifications">Extensions et spécifications</a><ul> <li><a href="#toc-extensions-propos%C3%A9es">Extensions proposées</a></li> <li><a href="#toc-nouvelles-extensions">Nouvelles extensions</a></li> <li><a href="#toc-extensions-ajourn%C3%A9es">Extensions ajournées</a></li> <li><a href="#toc-extensions-mises-%C3%A0-jour">Extensions mises à jour</a></li> <li><a href="#toc-derniers-appels">Derniers appels</a></li> <li><a href="#toc-brouillons">Brouillons</a></li> <li><a href="#toc-appel-%C3%A0-exp%C3%A9rience">Appel à expérience</a></li> </ul> </li> <li><a href="#toc-remerciements">Remerciements</a></li> <li><a href="#toc-diffusez-ces-informations">Diffusez ces informations !</a></li> <li> <a href="#toc-appel-%C3%A0-la-communaut%C3%A9">Appel à la communauté</a><ul> <li><a href="#toc-abonnezvous-%C3%A0-la-lettre-dinformation">Abonnez‑vous à la lettre d’information</a></li> <li><a href="#toc-aideznous-%C3%A0-%C3%A9laborer-cette-lettre-dinformation">Aidez‑nous à élaborer cette lettre d’information</a></li> </ul> </li> <li><a href="#toc-licence">Licence</a></li> </ul> <h2 id="toc-annonces-de-la-xsf">Annonces de la XSF</h2> <p>Nous voudrions faire une annonce à propos d’un évènement important relatifs aux certificats de tous ceux impliqués dans XMPP.</p> <p>Si vous, ou des tiers de votre connaissance, êtes impactés, merci de diffuser ce message : </p> <p>Let's Encrypt a annoncé abandonner leur certificat racine co-signé par leur autorité de certification IdenTrust.<br> Cela signifie que les vieux systèmes clients (en particulier environ le tiers des téléphones Android qui fonctionnent sous des versions inférieures ou égales à la 7.0) considèreront les certificats Let's Encrypt générés après le 11 janvier 2021 comme non fiables.<br> Ce problème ne sera pas corrigé, puisque le certificat cosigné par IdentTrust expirera en septembre, mais il existe des possibilités de contournements :</p> <ul> <li>Pour les utilisateurs : il est possible, mais pas vraiment aisé, d'<a href="https://stackoverflow.com/a/22040887/">ajouter le nouveau certificat racine au gestionnaire de confiance du système</a> ;</li> <li>Pour les développeurs de clients : vous pouvez embarquer le nouveau certificat <a href="https://letsencrypt.org/certificates/">ISG Root X1</a> avec l’application, ou implémenter un mécanisme d’approbation d’autorité de certification comme <a href="https://github.com/ge0rg/MemorizingTrustManager">Memorizing Trust Manager</a> ;</li> <li>Pour les opérateurs de serveurs : vous pouvez utiliser l’option <code>alternate</code> entre janvier et septembre pour obtenir des certificats signés par l’ancien certificat racine de l’autorité de certification IdentTrust.</li> </ul> <p>L’implémentation du nouveau certificat racine ISRG Root X1 est expliquée dans <a href="https://www.stoutner.com/lets-encrypt-isrg-root-x1-and-privacy-browser/">cet article</a> [en anglais].</p> <h2 id="toc-articles">Articles</h2> <p>Chris Beckstrom a écrit un article sur les détails de son <a href="https://chrisbeckstrom.com/posts/How-I-Bridged-iMessage-and-XMPP/">astucieux traficotage pour connecter iMessage et XMPP</a> [en anglais].</p> <p>Nico Wellpott a écrit un article au sujet de l'<a href="https://magicbroccoli.de/post/oh-muc-stats/">obtention de statistiques à partir du nombre d’utilisateurs et des informations de présence d’un salon de discussion</a> [en anglais].</p> <p>Ce mois-ci, ejabberd a célébré son 18<sup>e</sup> anniversaire. À cette occasion, <a href="https://www.process-one.net/blog/interview-with-alexey-shchepin-creator-of-ejabberd/">Marek Foss s’est entretenu avec Alexey Shchepin</a> [en anglais], créateur d’ejabberd en novembre 2002.</p> <h2 id="toc-des-nouvelles-des-logiciels">Des nouvelles des logiciels</h2> <h3 id="toc-clients-et-applications">Clients et applications</h3> <p>Publication de <a href="https://dino.im/blog/2020/11/dino-0.2-release/">Dino 0.2 <em>Mexican Caribean Coral Reefs</em></a> : cette version ajoute la correction de message, améliore le téléversement de fichiers et fournit plus d’informations à propos du chiffrement des messages. En plus d’autres changements mineurs, elle corrige également de nombreux bogues.</p> <p><img src="//img.linuxfr.org/img/68747470733a2f2f6e6577732e6a616262657266722e6f72672f77702d636f6e74656e742f75706c6f6164732f323032302f31322f44696e6f5f6d6573736167655f636f7272656374696f6e2e706e67/Dino_message_correction.png" alt="La correction de message par Dino" title="La correction de message par Dino | Source : https://news.jabberfr.org/wp-content/uploads/2020/12/Dino_message_correction.png"></p> <p>Publication de <a href="https://github.com/iNPUTmice/Conversations/releases/tag/2.9.1">Conversations 2.9.1</a> : cette version inclut des corrections pour la recherche dans les discussions sur les vieux systèmes Android et optimise l’utilisation de la mémoire.</p> <p>Snikket a aussi sorti <a href="https://snikket.org/blog/snikket-app-update-2.9.0/">une nouvelle version</a> de leur application Android, basée sur Conversations 2.9.0. Ils ont également annoncé une <a href="https://snikket.org/blog/sponsoring-group-omemo-in-siskin/">sponsorisation du chiffrement de bout-en-bout OMEMO pour les salons de discussions dans Siskin IM</a>, le client iOS de Tigase.</p> <p>Publication de <a href="https://tigase.net/beagleim-4.1-and-siskin-6.1-released/">Beagle IM 4.1 et Siskin IM 6.1</a> : le plus gros changement pour ces versions est l’introduction de la <a href="https://xmpp.org/extensions/xep-0215.html">XEP-0215</a> (<em>External Service Discovery</em>) qui aide à établir des appels audios et vidéos.</p> <p><img src="//img.linuxfr.org/img/68747470733a2f2f6e6577732e6a616262657266722e6f72672f77702d636f6e74656e742f75706c6f6164732f323032302f31322f626561676c652d6163636f756e74732e706e67/beagle-accounts.png" alt="Comptes Beagle" title="Comptes Beagle | Source : https://news.jabberfr.org/wp-content/uploads/2020/12/beagle-accounts.png"></p> <p>Une <a href="https://monal.im/blog/4-9-betas/">nouvelle version bêta de Monal 4.9</a> a été publiée. Alors que la version finale 4.9 est <a href="https://monal.im/blog/monal-mac-4-9-out-no-arm-yet/">d’ores et déjà sortie pour Mac</a>, la version ARM a encore besoin d’un peu de temps.</p> <p>La première version stable 3.0.1 de l’application blabber.im est <a href="https://blabber.im/en/download/">disponible au téléchargement</a>. Si vous souhaitez mettre à jour votre Pix-Art Messenger vers blabber.im, lisez leur <a href="https://blabber.im/en/update-guide/">guide de migration</a> [en anglais et en allemand]. [N.D.T. : pour rappel, l’application Android Pix-Art Messenger et le fournisseur de services XMPP <em>blabber.im</em> ont fusionné le mois dernier]</p> <p><a href="https://gajim.org/fr/post/2020-11-27-development-news-november/">Nouvelles du développement de Gajim</a> : en novembre l’équipe de Gajim a travaillé sur les accusés de lecture (<em>Chat Markers</em>), une fonctionnalité que beaucoup d’entre vous attendaient dans Gajim. Les accusés de lecture vous permettent de voir si vos contacts ont lu vos messages, et permettent aussi à Gajim de gérer les notifications si vous avez déjà lu des messages sur votre téléphone ou d’autres appareils. </p> <p>Des nouvelles de la communauté Ignite Realtime : Spark a été publié en <a href="https://discourse.igniterealtime.org/t/spark-2-9-4-released/89160">version 2.9.4</a>. Cette sortie inclut des correctifs pour les certificats SSL, une nouvelle option pour désactiver les jeux et d’autres améliorations.</p> <h3 id="toc-serveurs">Serveurs</h3> <p>Encore des nouvelles de la communauté Ignite Realtime : la <a href="https://discourse.igniterealtime.org/t/client-control-plugin-2-1-6-released/89159">version 2.1.6 du greffon de contrôle client pour Openfire</a> a été publiée.</p> <p>Les deux clients Tigase prenaient en charge <em>Mediated Information eXchange</em> (MIX) depuis un moment, et maintenant le composant XMPP (basé sur le composant PubSub de Tigase) pour le serveur XMPP de Tigase fournissant une prise en charge de la XEP-0369 (MIX) est <a href="https://github.com/tigase/tigase-mix">disponible</a> également.</p> <p>Pendant l’entretien avec Alexey Shchepin, l’auteur d’ejabberd a mentionné Jamler, une expérience de 2011 pour réécrire ejabberd en OCaml. Cet ancien code est <a href="https://www.process-one.net/blog/jamler-xmpp-server-an-ocaml-experiment-based-on-ejabberd-2-1-8/">maintenant publié en open source</a> également, de manière à pouvoir être étudié.</p> <h3 id="toc-bibliothèques">Bibliothèques</h3> <p>Et oui, encore plus de nouvelles de la communauté Ignite Realtime : voici la première <em>release candidate</em> de Smack 4.4.0, <a href="https://discourse.igniterealtime.org/t/first-release-candidate-of-smack-4-4-published/89131">Smack 4.4.0-rc1</a>. Les développeurs lancent une invitation à tester cette version.</p> <h2 id="toc-extensions-et-spécifications">Extensions et spécifications</h2> <p>Les développeurs et autres experts de la standardisation de par le monde collaborent à ces extensions, développant de nouvelles spécifications pour les pratiques naissantes, et affinant les manières de faire existantes. Proposées par qui le souhaite, les spécifications rencontrant le plus de succès aboutissent à un statut de « Finale » (<em>Final</em>) ou « Active » (<em>Active</em>), en fonction de leur type, alors que les autres sont soigneusement archivées sous l’appellation « Ajournée » (<em>Deferred</em>). Ce cycle de vie est décrit dans la <a href="https://xmpp.org/extensions/xep-0001.html">XEP‑0001</a> qui contient les définitions formelles et canoniques pour les types, états et processus. Apprenez en plus sur le <a href="https://xmpp.org/about/standards-process.html">processus de standardisation</a>.</p> <h3 id="toc-extensions-proposées">Extensions proposées</h3> <p>Le processus de développement d’une XEP commence par la mise par écrit d’une idée et sa soumission à l’éditeur XMPP. Dans un délai de deux semaines, le Conseil décide s’il accepte d’accorder à cette proposition le statut d’une XEP expérimentale.</p> <p>Plusieurs extensions ont été proposées ce mois-ci. Elles ont été acceptées par le Conseil et sont listées dans la section suivante.</p> <h3 id="toc-nouvelles-extensions">Nouvelles extensions</h3> <ul> <li> <p>version 0.1.0 de la <a href="https://xmpp.org/extensions/xep-0449.html">XEP-0449</a> (<em>Stickers</em>)</p> <ul> <li>cette spécification fournit un protocole pour envoyer des autocollants ainsi que pour créer et partager des collections d’autocollants.</li> <li>acceptée par le vote du Conseil le 18 novembre 2020.</li> </ul> </li> <li> <p>version 0.1.0 de la <a href="https://xmpp.org/extensions/xep-0448.html">XEP-0448</a> (<em>Encryption for stateless file sharing</em>)</p> <ul> <li>cette spécification fournit un protocole pour partager des fichiers chiffrés en utilisant la <a href="https://xmpp.org/extensions/xep-0447.html">XEP-0447</a> (<em>Stateless file sharing</em>) </li> <li>acceptée par vote du conseil le 18 novembre 2020.</li> </ul> </li> <li> <p>version 0.1.0 de la <a href="https://xmpp.org/extensions/xep-0447.html">XEP-0447</a> (<em>Stateless file sharing</em>)</p> <ul> <li>cette spécification décrit un protocole pour le partage de fichiers, asynchrone et sans état, avec garantie d’intégrité et souplesse dans le choix du protocole de transport. Elle permet aux clients de fournir une expérience utilisateur agréable, interopérable et compatible avec les <a href="https://xmpp.org/extensions/xep-0280.html">XEP-0280</a> (<em>Message Carbons</em>) et <a href="https://xmpp.org/extensions/xep-0313.html">XEP-0313</a> (<em>Message Archive Management</em>).</li> <li>acceptée par vote du Conseil le 18 novembre 2020.</li> </ul> </li> <li> <p>version 0.1.0 de la <a href="https://xmpp.org/extensions/xep-0446.html">XEP-0446</a> (<em>File metadata element</em>)</p> <ul> <li>cette spécification définit un élément générique <code>file metadata</code> destiné à être utilisé dans d’autres spécifications.</li> <li>acceptée par vote du Conseil le 18 novembre 2020.</li> </ul> </li> <li> <p>version 0.2.0 de la <a href="https://xmpp.org/extensions/xep-0445.html">XEP-0445</a> (<em>Pre-Authenticated In-Band Registration</em>)</p> <ul> <li>ce document étend le protocole d’inscription embarquée pour utiliser des jetons d’invitation, par exemple pour créer des comptes sur des serveurs non publics.</li> <li>acceptée par vote du Conseil le 4 novembre 2020.</li> </ul> </li> </ul> <h3 id="toc-extensions-ajournées">Extensions ajournées</h3> <p>Si une XEP expérimentale n’a pas été mise à jour après plus de six mois, elle perdra son statut « Expérimentale » (<em>Experimental</em>) pour devenir « Ajournée » (<em>Deferred</em>). En cas de future mise à jour, elle reprendra son statut « Expérimentale » (<em>Experimental</em>).</p> <p>Aucune XEP ajournée ce mois-ci.</p> <h3 id="toc-extensions-mises-à-jour">Extensions mises à jour</h3> <ul> <li> <p>version 0.6.0 de la <a href="https://xmpp.org/extensions/xep-0373.html">XEP-0373</a> (<em>OpenPGP for XMPP</em>)</p> <ul> <li>Corrige les pré-requis de l’attribut <code>to</code> : tous les contenus d’éléments qui sont signés via OpenPGP nécessitent cet attribut pour empêcher les <em>Surreptitious Forward Attacks</em>. L’élément <code>&lt;crypt/&gt;</code> ne nécessite pas cet attribut, puisque le destinataire prévu est établi par le chiffrement lui-même. La XEP avait mélangé les pré-requis pour <code>&lt;sign/&gt;</code> et <code>&lt;crypt/&gt;</code>.</li> </ul> </li> <li> <p>version 0.6.0 de la <a href="https://xmpp.org/extensions/xep-0389.html">XEP-0389</a> (<em>Extensible In-Band Registration</em>)</p> <ul> <li>génère une erreur si le client choisit un flux non valide.</li> </ul> </li> <li> <p>version 0.3.0 de la <a href="https://xmpp.org/extensions/xep-0443.html">XEP-0443</a> (<em>XMPP Compliance Suites 2021</em>)</p> <ul> <li>ajoute plus de XEPs intéressantes.</li> </ul> </li> <li> <p>version 0.2.0 de la <a href="https://xmpp.org/extensions/xep-0438.html">XEP-0438</a> (<em>Best practices for password hashing and storage</em>)</p> <ul> <li>mise à jour pour s’aligner sur le <a href="https://tools.ietf.org/html/draft-ietf-kitten-password-storage-01">document équivalent de l’IETF</a> </li> </ul> </li> <li> <p>version 1.34.0 de la <a href="https://xmpp.org/extensions/xep-0045.html">XEP-0045</a> (<em>Multi-User Chat</em>)</p> <ul> <li>précise l’utilisation d’un élément <code>delay</code> dans le sujet initial du message.</li> </ul> </li> <li> <p>version 1.3.0 de la <a href="https://xmpp.org/extensions/xep-0118.html">XEP-0118</a> (<em>User Tune</em>)</p> <ul> <li>ajoute d’autres étiquettes pour la musique non pop.</li> </ul> </li> <li> <p>version 1.2.0 de la <a href="https://xmpp.org/extensions/xep-0308.html">XEP-0308</a> (<em>Last Message Correction</em>)</p> <ul> <li>réécrit la note au sujet de la manière de gérer la correction du dernier message au cas où il ne soit pas clair que tous les destinataires la supportent.</li> </ul> </li> </ul> <h3 id="toc-derniers-appels">Derniers appels</h3> <p>Les derniers appels sont émis une fois que chacun semble satisfait de l’état courant d’une XEP. Après que le Conseil a décidé que la XEP était prête, l’éditeur XMPP émet un dernier appel à commentaires. Les retours rassemblés pendant le dernier appel aident à améliorer la XEP avant qu’elle ne retourne devant le Conseil pour une évolution vers le statut de « Brouillon » (<em>Draft</em>).</p> <p>Pas de dernier appel ce mois-ci.</p> <h3 id="toc-brouillons">Brouillons</h3> <ul> <li>version 1.0.0 de la <a href="https://xmpp.org/extensions/xep-0443.html">XEP-0443</a> (<em>XMPP Compliance Suites 2021</em>) <ul> <li>acceptée comme Brouillon par le vote du Conseil du 11 novembre 2020.</li> </ul> </li> </ul> <h3 id="toc-appel-à-expérience">Appel à expérience</h3> <p>Un appel à expérience, comme un dernier appel, est un appel explicite à commentaires, mais dans ce cas, il est principalement dirigé vers les personnes qui ont implémenté, et idéalement déployé, cette spécification. Le Conseil vote alors de lui attribuer le statut « Finale » (<em>Final</em>).</p> <p>Pas d’appels à expérience ce mois-ci.</p> <h2 id="toc-remerciements">Remerciements</h2> <p>Cette lettre d’information XMPP a été réalisée collaborativement par la communauté. Merci à <em>Dominion0815</em>, <em>emus</em>, <em>kikiuchiyo</em>, <em>Licaon_Kter</em>, <em>mwild1</em>, <em>nico</em>, <em>SeveFP</em> and <em>wurstsalat3000</em> pour leur aide durant son élaboration !<br> Mention spéciale à <em>wurstsalat3000</em> pour son superbe résumé de l’activité des XEPs chaque mois !</p> <h2 id="toc-diffusez-ces-informations">Diffusez ces informations !</h2> <p>Partagez ces informations sur les « réseaux sociaux » :</p> <ul> <li> <a href="https://twitter.com/xmpp">Twitter</a> ;</li> <li> <a href="https://fosstodon.org/@xmpp/">Mastodon</a> ;</li> <li> <a href="https://www.linkedin.com/company/xmpp-standards-foundation/">LinkedIn</a> ;</li> <li> <a href="https://www.facebook.com/jabber/">Facebook</a> ;</li> <li> <a href="https://www.reddit.com/r/xmpp/">Reddit</a>.</li> </ul> <p>Trouvez et proposez des offres d’emploi sur le site <em><a href="https://xmpp.work/">xmpp.work</a></em>.</p> <h2 id="toc-appel-à-la-communauté">Appel à la communauté</h2> <h3 id="toc-abonnezvous-à-la-lettre-dinformation">Abonnez‑vous à la lettre d’information</h3> <p>Nous vous invitons à <a href="https://xmpp.org/newsletter.html">vous inscrire</a> pour recevoir les prochaines éditions en anglais dans votre boîte de courriel dès qu’elles seront publiées ! Diffusez cette lettre d’information à quiconque serait intéressé.</p> <h3 id="toc-aideznous-à-élaborer-cette-lettre-dinformation">Aidez‑nous à élaborer cette lettre d’information</h3> <p>Nous avons commencé à mettre en place un brouillon à chaque nouvelle édition dans le <a href="https://github.com/xsf/xmpp.org/pulls">dépôt GitHub de la XSF</a>. Et nous sommes toujours ravis d’accueillir des contributeurs et des contributrices. Joignez‑vous à la discussion dans le <a href="xmpp:commteam@muc.xmpp.org?join">salon de notre équipe de communication</a> et aidez‑nous ainsi à alimenter cette lettre dans un effort communautaire.</p> <p>Vous avez un projet et vous écrivez, ou voudriez écrire, à son sujet ? N’hésitez pas à venir partager vos informations ou évènements ici‑même, et diffusez‑les à un large public ! Même si vous n’y passez que quelques minutes, cela sera déjà utile.</p> <p>Les tâches qui nécessitent d’être réalisées de manière régulière sont, par exemple :</p> <ul> <li>l’agrégation des informations de l’univers XMPP ;</li> <li>la reformulation courte des informations et des évènements ;</li> <li>le résumé des communications mensuelles sur les extensions (XEP) ;</li> <li>la relecture du brouillon ;</li> <li>les traductions, particulièrement en français, allemand et espagnol.</li> </ul> <h2 id="toc-licence">Licence</h2> <p>Cette lettre d’information est publiée sous la licence <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY‑SA 4.0</a>.</p> </div><div><a href="https://linuxfr.org/news/la-lettre-d-information-xmpp-de-novembre-2020.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/122555/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/la-lettre-d-information-xmpp-de-novembre-2020#comments">ouvrir dans le navigateur</a> </p>
    • wifi_tethering open_in_new

      This post is public

      linuxfr.org /news/la-lettre-d-information-xmpp-de-novembre-2020

    • Li chevron_right

      Présentation de SXIV - Un visualiseur d'image minimaliste

      jbtremblay · pubsub.eckmul.net / linuxfr_news · Monday, 21 December, 2020 - 05:29 · 13 minutes

    <div><h3 id="toc-quest-ce-que-sxiv">Qu’est-ce que SXIV ?</h3> <p>SXIV est un visualiseur d’image simple pour <a href="https://fr.wikipedia.org/wiki/X_Window_System">X</a>, comme son sigle anglais le laisse entendre : Simple X Image Viewer. SXIV supporte un grand nombre de formats d’image. Son interface est minimale et on a le choix de naviguer avec la souris ou le clavier.</p> </div><ul><li>lien nᵒ 1 : <a title="https://github.com/muennich/sxiv" hreflang="en" href="https://linuxfr.org/redirect/107511">Dépôt GIT de l&#39;application</a></li><li>lien nᵒ 2 : <a title="https://www.mankier.com/1/sxiv" hreflang="en" href="https://linuxfr.org/redirect/107512">Page du manuel de SXIV</a></li><li>lien nᵒ 3 : <a title="https://wiki.archlinux.org/index.php/Sxiv" hreflang="en" href="https://linuxfr.org/redirect/107513">Article du Wiki de Arch Linux portant sur SXIV</a></li></ul><div><h2 class="sommaire">Sommaire</h2> <ul class="toc"> <li> <ul> <li><a href="#toc-fonctionnalit%C3%A9s">Fonctionnalités</a></li> <li><a href="#toc-interfaces">Interfaces</a></li> <li><a href="#toc-utilisation">Utilisation</a></li> <li> <a href="#toc-interfaces-utilisateur">Interfaces utilisateur</a><ul> <li><a href="#toc-souris">Souris</a></li> <li> <a href="#toc-clavier">Clavier</a><ul> <li><a href="#toc-tous-modes">Tous modes</a></li> <li><a href="#toc-mode-image">Mode image</a></li> <li><a href="#toc-mode-vignette">Mode vignette</a></li> </ul> </li> <li><a href="#toc-configuration-des-raccourcis-clavier">Configuration des raccourcis clavier</a></li> </ul> </li> <li><a href="#toc-options">Options</a></li> <li><a href="#toc-extensions-et-configurations">Extensions et configurations</a></li> <li><a href="#toc-conclusion">Conclusion</a></li> </ul> </li> </ul> <h3 id="toc-fonctionnalités">Fonctionnalités</h3> <ul> <li>Deux modes d’opérations <ul> <li>Mode image : permet de visualiser une image. C’est le mode par défaut ;</li> <li>Mode vignette (thumbnail) : permet de visualiser et de sélectionner différents aperçus d’images dans une grille.</li> </ul> </li> <li>Opérations de visualisation d’image <ul> <li>Agrandir l’image ;</li> <li>Se déplacer dans l’image ;</li> <li>Effectuer une rotation sur l’image.</li> </ul> </li> <li>Visualisation d’animation GIF</li> <li>Mode diaporama. Permet de passer d’une image à l'autre automatiquement après un temps défini.</li> </ul> <h3 id="toc-interfaces">Interfaces</h3> <p>Commençons par l’interface visuelle de l’application et cela en mode image. Celle-ci consiste seulement d’une barre d’information située en bas de l’écran.</p> <p><img src="//img.linuxfr.org/img/687474703a2f2f7069782e746f696c652d6c696272652e6f72672f75706c6f61642f6f726967696e616c2f313630373837333636332e706e67/1607873663.png" alt="Interface SXIV Capture d’écran" title="Source : http://pix.toile-libre.org/upload/original/1607873663.png"></p> <p>Pour ce qui est du mode vignette, une grille des différents aperçus des images est affichée.</p> <p><img src="//img.linuxfr.org/img/687474703a2f2f7069782e746f696c652d6c696272652e6f72672f75706c6f61642f6f726967696e616c2f313630373837333835372e706e67/1607873857.png" alt="Interface vignette SXIV Capture d’écran" title="Source : http://pix.toile-libre.org/upload/original/1607873857.png"></p> <h3 id="toc-utilisation">Utilisation</h3> <p>Pour utiliser SXIV il suffit de spécifier le chemin d'un ou des fichiers.</p> <pre><code class="sh">sxiv image_1.png ./un_dossier/image_2.jpg</code></pre> <p>Il est aussi possible de le faire avec des dossiers. On peut spécifier l’option <code>-r</code> si l’on veut chercher de manière récursive. Soit dans les dossiers spécifiés ainsi que leurs sous-dossiers.</p> <pre><code class="sh">sxiv ~/pictures/ -r</code></pre> <h3 id="toc-interfaces-utilisateur">Interfaces utilisateur</h3> <p>La souris permet de réaliser les actions de base alors que le clavier possède une sélection d’actions plus complète.</p> <h4 id="toc-souris">Souris</h4> <ul> <li> <code>Clic gauche</code> : si la souris est dans la partie droite de l’écran on passe à l’image suivante, si elle est située à gauche on retourne à l’image précédente ;</li> <li> <code>Clic droit</code> : active le mode vignette (thumbnail) ;</li> <li> <code>Molette de la souris</code> : <ul> <li>permet d’agrandir et de réduire l’image ;</li> <li>le clic permet de se déplacer dans l’image par rapport au positionnement du curseur, et cela pendant que le bouton reste enfoncé.</li> </ul> </li> </ul> <h4 id="toc-clavier">Clavier</h4> <p>Il existe plusieurs raccourcis clavier, je vous invite à regarder la page du manuel qui se rapporte à SXIV pour une liste complète.</p> <h5 id="toc-tous-modes">Tous modes</h5> <ul> <li> <code>q</code> : Quitte le programme.</li> <li> <code>r</code> : Recharge l’image sélectionnée.</li> <li> <code>f</code> : active le mode plein écran.</li> <li> <code>b</code> : Bascule l’affichage de la barre d’information.</li> <li> <code>\+</code> et <code>-</code> : agrandit ou réduit la vue.</li> <li> <code>m</code> : bascule le marquage de l’image sélectionnée.</li> </ul> <h5 id="toc-mode-image">Mode image</h5> <ul> <li> <code>n</code> ou la <code>barre d’espace</code> : passe à la prochaine image.</li> <li> <code>p</code> ou <code>backspace</code> : passe à l’image précédente.</li> </ul> <p>Navigation</p> <ul> <li> <code>h</code>, <code>j</code>, <code>k</code>, <code>l</code> ou les flèches du clavier : permet de naviguer dans l’image.</li> <li> <code>H</code>, <code>J</code>, <code>K</code>, <code>L</code> : permet de naviguer aux extrémités de l’image.</li> </ul> <p>Agrandissement (zoom)</p> <ul> <li> <code>=</code> : agrandit à 100%.</li> <li> <code>w</code> : agrandit à 100% et proportionne l’image afin qu'elle couvre la fenêtre en entier.</li> <li> <code>W</code> : proportionne l’image afin qu’elle couvre la fenêtre en entier.</li> <li> <code>e</code> : proportionne l’image selon la largeur de la fenêtre.</li> <li> <code>E</code> : proportionne l’image selon la hauteur de la fenêtre.</li> </ul> <p>Rotation</p> <ul> <li> <code>|</code> : Inverse l’image horizontalement.</li> <li> <code>\-</code> : inverse l’image verticalement.</li> </ul> <p>Autres:</p> <ul> <li> <code>a</code> : bascule l’antialiasing.</li> <li> <code>A</code> : bascule la visibilité de la transparence de l’image.</li> <li> <code>s</code> : bascule le mode diaporama. Un nombre peut être entré avant d’appuyer sur « s » afin de configurer le nombre de secondes avant de passer à une autre image.</li> </ul> <h5 id="toc-mode-vignette">Mode vignette</h5> <ul> <li> <code>h</code>, <code>j</code>, <code>k</code>, <code>l</code> ou les flèches du clavier : permet de naviguer dans la liste d’image.</li> <li> <code>R</code> : recharge toutes les vignettes.</li> </ul> <h4 id="toc-configuration-des-raccourcis-clavier">Configuration des raccourcis clavier</h4> <p>Pour configurer les raccourcis clavier, puisque le programme se veut simple et semble suivre la philosophie du groupe <a href="https://suckless.org/philosophy/">Suckless.org</a>, il faut modifier le fichier source config.c et recompiler le programme. Mais puisque le programme utilise des bibliothèques courantes, donc se trouve probablement en paquet dans les dépôts de votre distribution, la compilation sur un système d’exploitation Linux est possible sans problème.</p> <h3 id="toc-options">Options</h3> <ul> <li> <code>\-f</code>: lance l’application en mode plein écran</li> <li> <code>\-i</code>: visualise les images dont les chemins ont été spécifiés dans l’entrée standard.</li> <li> <code>\-o</code> : lors de la fermeture, donne en sortie standard les chemins des fichiers marqués.</li> <li> <code>\-r</code> : cherche de manière récursive les dossiers spécifiés.</li> <li> <code>\-S</code>: démarre en mode diaporama (slideshow), un nombre qui définit le délai entre chaque image doit suivre cette option. </li> </ul> <h3 id="toc-extensions-et-configurations">Extensions et configurations</h3> <p>Il est aussi possible d’utiliser SXIV dans des scripts en interagissant avec le programme par l’entrée et la sortie standard si on lance SXIV avec l’option <code>-o</code>. Les chemins des images marquées à l’aide de <code>ctrl+m</code> lors de l’utilisation de l’application sont envoyés à la sortie standard. Si on le démarre avec l’option <code>-i</code>, SXIV ouvrira les images dont les chemins ont été envoyées à son entrée standard.</p> <p>On peut alors s'imaginer un script, ou une simple commande, qui copie ses fichiers sélectionnés dans un autre dossier.</p> <p>Exemple :</p> <pre><code>sh sxiv ~/pictures -o | xargs cp -t ~/pictures_selected -v </code></pre> <p>Ici l’argument <code>-o</code> spécifie que les chemins des fichiers marqués lors de l’utilisation de SXIV à l’aide de <code>ctrl+m</code> sont envoyés à la sortie standard. Cette sortie standard est ensuite redirigée, à l’aide de l’opérateur <code>|</code>, vers xargs. Ce programme envoie les fichiers en argument de <code>cp</code>. Ensuite <code>cp</code> copie les fichiers dans le dossier suivant l’argument <code>-t</code>. L’option -v permet de suivre le progrès des opérations de copies.</p> <p>On peut aussi ajouter des raccourcis clavier à SXIV. Lorsque l’on appuie sur CTRL la prochaine touche du clavier est envoyée à un script externe situé à <code>~/.config/sxiv/exec/key-handler</code>. Un script qui démontre cette fonctionnalité est inclus lors de l’installation et se situe à <code>/usr/share/sxiv/exec/key-handler</code>.</p> <p>Il est aussi possible de personnaliser la partie gauche de la barre de statut qui affiche les informations du fichier sélectionné à l’aide d’un script. Ce script doit être situé à <code>~/.config/sxiv/exec/image-info</code>. Un script d’exemple est disponible à <code>/usr/share/sxiv/exec/image-info</code>. </p> <h3 id="toc-conclusion">Conclusion</h3> <p>En conclusion, SXIV est un visualiseur d’image qui effectue sa tâche à l’aide d’une interface simple et complète. De plus, il offre des mécanismes qui permettent de le personnaliser et de l’utiliser dans toute sorte de scénarios. Entre autres pour filtrer manuellement des images. Donc, il est parfait pour les systèmes avec peu de ressources ou pour les gens qui préfèrent les programmes ayant des interfaces graphiques simples et une interface clavier complète.</p> </div><div><a href="https://linuxfr.org/news/presentation-de-sxiv-un-visualiseur-d-image-minimaliste.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/122561/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/presentation-de-sxiv-un-visualiseur-d-image-minimaliste#comments">ouvrir dans le navigateur</a> </p>
    • Li chevron_right

      Enquête sur la sécurité des logiciels Open Source

      Blazy Florence · pubsub.eckmul.net / linuxfr_news · Sunday, 20 December, 2020 - 12:38 · 2 minutes

    <div><p>Les Hubs Cyber &amp; Security et Open Source du Pôle Systematic mènent une <a href="https://systematic-paris-region.org/enquete-securite-des-logiciels-open-source">enquête sur les pratiques et besoins relatifs à la sécurité des logiciels Open Source</a>.</p> <p>L’Open Source apporte d'importants avantages pour la sécurité des applications, pouvant même être un avantage concurrentiel pour les industriels proposant des solutions de haut niveau de sécurité. De plus, certains processus de développement qui contribuent à la sécurité sont largement diffusés dans l’Open Source, et de nombreux outils Open Source sont disponibles pour la détection de vulnérabilités et les évaluations de sécurité. Enfin, l’Open Source est un élément indispensable de la confiance pour toutes les applications/infrastructures avec un fort risque pour la société en cas de détournement.</p> </div><ul><li>lien nᵒ 1 : <a title="https://systematic-paris-region.org/enquete-securite-des-logiciels-open-source/" hreflang="fr" href="https://linuxfr.org/redirect/107533">En savoir plus sur l&#39;enquête</a></li><li>lien nᵒ 2 : <a title="https://framaforms.org/enquete-sur-les-pratiques-et-besoins-relatifs-a-la-securite-open-source-1601027929" hreflang="fr" href="https://linuxfr.org/redirect/107534">Répondre à l&#39;enquête (formulaire Framaforms)</a></li><li>lien nᵒ 3 : <a title="https://systematic-paris-region.org/hubs-enjeux/hub-open-source/" hreflang="fr" href="https://linuxfr.org/redirect/107535">Hub Open Source Systematic</a></li></ul><div><p>En parallèle, toutes les entreprises utilisent aujourd’hui des logiciels Open Source. Comme pour tout logiciel, se pose donc la question du maintien de la sécurité du logiciel au cours du temps. Les logiciels Open Source, de part leur nature collaborative, requièrent une approche active du maintien de leur sécurité qui ne peut se résumer à attendre la prochaine livraison du logiciel. Cette approche repose sur des pratiques et outils qu’il est nécessaire de connaître.</p> <p>Afin de mieux cerner les besoins des utilisateurs et offreurs de solutions Open Source, les HUB Cybersécurité et Open Source vous proposent de répondre à ce <a href="https://framaforms.org/enquete-sur-les-pratiques-et-besoins-relatifs-a-la-securite-open-source-1601027929">sondage anonyme de 20 questions</a>. Après analyse, les résultats du sondage seront diffusés par le pôle et des actions spécifiques menées afin de répondre aux besoins identifiés. </p> <p>Parce que nous sommes tous dépendants de la sécurité Open Source d’une manière ou d’une autre !</p> </div><div><a href="https://linuxfr.org/news/enquete-sur-la-securite-des-logiciels-open-source.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/122608/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/enquete-sur-la-securite-des-logiciels-open-source#comments">ouvrir dans le navigateur</a> </p>
    • Li chevron_right

      Agenda du Libre pour la semaine 52 de l'année 2020

      Benoît Sibaud · pubsub.eckmul.net / linuxfr_news · Saturday, 19 December, 2020 - 18:30 · 20 minutes

    <div><p><abbr title="Note des modérateurs">N. D. M. :</abbr> vu le contexte de pandémie de Covid‑19 et les restrictions locales ou nationales (<a href="https://fr.wikipedia.org/wiki/Pand%C3%A9mie_de_maladie_%C3%A0_coronavirus_de_2020_en_Belgique">Belgique</a>, <a href="https://fr.wikipedia.org/wiki/Pand%C3%A9mie_de_maladie_%C3%A0_coronavirus_de_2020_en_France">France</a>, <a href="https://fr.wikipedia.org/wiki/Pand%C3%A9mie_de_maladie_%C3%A0_coronavirus_de_2020_au_Qu%C3%A9bec">Québec</a> et <a href="https://fr.wikipedia.org/wiki/Pand%C3%A9mie_de_maladie_%C3%A0_coronavirus_de_2020_en_Suisse">Suisse</a>) sur les rassemblements, certains événements sont susceptibles d’être annulés (que les organisateurs aient pensé à mettre à jour l’Agenda du Libre ou non).</p> <p>Calendrier Web, regroupant des événements liés au Libre (logiciel, salon, atelier, <em>install party</em>, conférence), annoncés par leurs organisateurs. Voici un récapitulatif de la semaine à venir. Le détail de chacun de ces 6 événements (France: 5, Belgique: 1) est en seconde partie de dépêche.</p> </div><ul><li>lien nᵒ 1 : <a title="https://april.org" hreflang="fr" href="https://linuxfr.org/redirect/107549">April</a></li><li>lien nᵒ 2 : <a title="https://www.agendadulibre.org" hreflang="fr" href="https://linuxfr.org/redirect/107550">Agenda du Libre</a></li><li>lien nᵒ 3 : <a title="https://www.agendadulibre.org/maps?future=false&amp;period%5Bweek%5D=52&amp;period%5Byear%5D=2020" hreflang="fr" href="https://linuxfr.org/redirect/107551">Carte des événements</a></li><li>lien nᵒ 4 : <a title="https://www.agendadulibre.org/events/new" hreflang="fr" href="https://linuxfr.org/redirect/107552">Proposer un événement</a></li><li>lien nᵒ 5 : <a title="https://www.agendadulibre.org/orgas" hreflang="fr" href="https://linuxfr.org/redirect/107553">Annuaire des organisations</a></li><li>lien nᵒ 6 : <a title="https://linuxfr.org/news/agenda-du-libre-pour-la-semaine-51-de-l-annee-2020" hreflang="fr" href="https://linuxfr.org/redirect/107554">Agenda de la semaine précédente</a></li><li>lien nᵒ 7 : <a title="https://agendadulibre.qc.ca" hreflang="fr" href="https://linuxfr.org/redirect/107555">Agenda du Libre Québec</a></li></ul><div><h2 class="sommaire">Sommaire</h2> <ul class="toc"> <li> <ul> <li> <a href="#toc-fr-mapathon-missing-maps---le-lundi-21-d%C3%A9cembre-2020-de-18h00-%C3%A0-20h00">[FR] </a><a href="https://www.agendadulibre.org/events/22987">Mapathon Missing Maps</a> - Le lundi 21 décembre 2020 de 18h00 à 20h00.</li> <li> <a href="#toc-fr-nantes-visioconf%C3%A9rence-monnaie-libre---le-lundi-21-d%C3%A9cembre-2020-de-19h30-%C3%A0-21h00">[FR Nantes] </a><a href="https://www.agendadulibre.org/events/23080">Visioconférence Monnaie Libre</a> - Le lundi 21 décembre 2020 de 19h30 à 21h00.</li> <li> <a href="#toc-fr-brignoles-visioconf%C3%A9rence-groupe-monnaie-libre---le-lundi-21-d%C3%A9cembre-2020-de-21h00-%C3%A0-23h00">[FR Brignoles] </a><a href="https://www.agendadulibre.org/events/23042">Visioconférence Groupe Monnaie Libre</a> - Le lundi 21 décembre 2020 de 21h00 à 23h00.</li> <li> <a href="#toc-fr-beauvais-sensibilisation-et-partage-autour-du-libre---le-mercredi-23-d%C3%A9cembre-2020-de-18h00-%C3%A0-20h00">[FR Beauvais] </a><a href="https://www.agendadulibre.org/events/22409">Sensibilisation et partage autour du Libre</a> - Le mercredi 23 décembre 2020 de 18h00 à 20h00.</li> <li> <a href="#toc-be-liege-caf%C3%A9-crypt%C3%A9---ateliers-dautod%C3%A9fense-num%C3%A9rique---le-samedi-26-d%C3%A9cembre-2020-de-13h30-%C3%A0-17h30">[BE Liege] </a><a href="https://www.agendadulibre.org/events/22477">Café Crypté - ateliers d’autodéfense numérique</a> - Le samedi 26 décembre 2020 de 13h30 à 17h30.</li> <li> <a href="#toc-fr-toulouse-visioconf%C3%A9rence-monnaie-libre---le-samedi-26-d%C3%A9cembre-2020-de-19h00-%C3%A0-22h00">[FR Toulouse] </a><a href="https://www.agendadulibre.org/events/23057">Visioconférence Monnaie Libre</a> - Le samedi 26 décembre 2020 de 19h00 à 22h00.</li> </ul> </li> </ul> <h3 id="toc-fr-mapathon-missing-maps---le-lundi-21-décembre-2020-de-18h00-à-20h00">[FR] <a href="https://www.agendadulibre.org/events/22987">Mapathon Missing Maps</a> - Le lundi 21 décembre 2020 de 18h00 à 20h00.</h3> <p>Vous êtes confiné.e.s ? Vous voudriez investir un peu de votre temps libre pour participer à la cartographie de camps de réfugiés avec nous et d’autres bénévoles ces prochaines semaines, afin d’avoir un impact positif sur les conditions de vie de ces derniers ?</p> <p>Vous aimeriez apprendre ou vous perfectionner en cartographie à distance à partir d’images satellites ?</p> <p>Rencontrer de nouvelles personnes autour d’un bon café et dans le confort de votre foyer ?</p> <p>Venez participer à notre atelier de cartographie solidaire et participative (Mapathon) ce lundi de 18h à 20h ! Les mapathons en ligne, ça a lieu chaque lundi, c’est 100% depuis votre fauteuil, gratuit, simple et accessible à tou.te.s !</p> <p>Inscription sur la page Eventbrite ci-contre : <a href="https://www.eventbrite.ca/e/128471629101">https://www.eventbrite.ca/e/128471629101</a></p> <p>Ou à l’adresse mail : <a href="mailto:missingmaps@cartong.org">missingmaps@cartong.org</a></p> <ul> <li>En ligne, Auvergne-Rhône-Alpes, France</li> <li><a href="https://www.cartong.org/">https://www.cartong.org/</a></li> <li> <a href="https://www.agendadulibre.org/tags/openstreetmap">openstreetmap</a>, <a href="https://www.agendadulibre.org/tags/collaboratif">collaboratif</a>, <a href="https://www.agendadulibre.org/tags/num%C3%A9rique">numérique</a>, <a href="https://www.agendadulibre.org/tags/cartographie">cartographie</a>, <a href="https://www.agendadulibre.org/tags/participatif">participatif</a>, <a href="https://www.agendadulibre.org/tags/osm">osm</a> </li> </ul> <h3 id="toc-fr-nantes-visioconférence-monnaie-libre---le-lundi-21-décembre-2020-de-19h30-à-21h00">[FR Nantes] <a href="https://www.agendadulibre.org/events/23080">Visioconférence Monnaie Libre</a> - Le lundi 21 décembre 2020 de 19h30 à 21h00.</h3> <p>Vous vous interrogez sur les produits que vous achetez : d’où ça vient, comment c’est fabriqué, est-ce équitable, écologique?</p> <p>Avez-vous pensé à vous poser les mêmes questions concernant la monnaie que vous utilisez chaque jour?</p> <p>Dans le cadre de la transition écologique, la monnaie joue un rôle majeur.</p> <p><strong>Savez-vous qui crée les unités monétaires que vous “possédez”?</strong></p> <p>La <strong>monnaie libre</strong> permet de garantir la valeur et de <strong>privilégier l’humain</strong>.<br> Elle appartient à ses utilisateurs et non pas à une banque.<br> Elle est <strong>créée par les utilisateurs</strong> et non par la dette ni par minage.<br> Elle participe pleinement à la phase de résilience qui va suivre les bouleversements économiques majeurs qui s’annoncent.<br> Elle existe depuis 3,5 ans et ne nécessite <strong>aucun frais</strong> d’entrée ou de gestion.<br> C’est  une monnaie  qui peut être utilisée localement mais qui ne connaît pas de frontières<br> Elle intègre un <strong>dividende universel</strong> attribué automatiquement chaque jour.</p> <p>C’est une autre façon de voir le revenu universel et <strong>c’est opérationnel dès aujourd’hui.</strong></p> <p>Dans le but de faire toutes les visio concernant la monnaie libre au même endroit.  <strong>A partir du mois d’octobre nouvelle adresse pour les visio discussions : <a href="https://meet.jit.si/Monnaie-libre">https://meet.jit.si/Monnaie-libre</a> </strong><br> Un petit tuto pour utiliser jitsi : <a href="https://forum.monnaie-libre.fr/t/visioconference-avec-jistsi/10363">cliquez ici</a><br> Pour toutes questions préalables voir <a href="https://forum.monnaie-libre.fr/t/visio-conference-tous-les-lundi-soir/11888">Forum : visio-conference-tous-les-lundi-soir</a></p> <p>La réunion commence à 19h30 mais on teste les connexions à partir de 19h20 (privilégier le câble).</p> <p>Il n’y a pas vraiment de présentation, ces visioconférences sont faites pour faire connaissance (activez vos caméras), et répondre aux questions, en préparation de rencontres réelles pour utiliser cette monnaie.</p> <p>Quelques vidéos de présentation <a href="https://www.youtube.com/results?search_query=monnaie+libre+g1">sur youtube</a></p> <ul> <li>Jitsi, Nantes, Pays de la Loire, France</li> <li><a href="https://forum.monnaie-libre.fr/t/visio-conference-tous-les-lundi-soir/11888">https://forum.monnaie-libre.fr/t/visio-conference-tous-les-lundi-soir/11888</a></li> <li> <a href="https://www.agendadulibre.org/tags/monnaie-libre">monnaie-libre</a>, <a href="https://www.agendadulibre.org/tags/visio-conf%C3%A9rence">visio-conférence</a>, <a href="https://www.agendadulibre.org/tags/monded'apr%C3%A8s">monded'après</a>, <a href="https://www.agendadulibre.org/tags/g1">g1</a>, <a href="https://www.agendadulibre.org/tags/jitsi">jitsi</a>, <a href="https://www.agendadulibre.org/tags/monnaie-equitable">monnaie-equitable</a>, <a href="https://www.agendadulibre.org/tags/d%C3%A9croissance">décroissance</a>, <a href="https://www.agendadulibre.org/tags/resilience">resilience</a>, <a href="https://www.agendadulibre.org/tags/blockchain">blockchain</a>, <a href="https://www.agendadulibre.org/tags/creation-mon%C3%A9taire">creation-monétaire</a> </li> </ul> <h3 id="toc-fr-brignoles-visioconférence-groupe-monnaie-libre---le-lundi-21-décembre-2020-de-21h00-à-23h00">[FR Brignoles] <a href="https://www.agendadulibre.org/events/23042">Visioconférence Groupe Monnaie Libre</a> - Le lundi 21 décembre 2020 de 21h00 à 23h00.</h3> <p><strong><em>Visioconférences Monnaie Libre chaque lundi à 21h !</em></strong></p> <p><strong>La Monnaie Libre Ğ1 qu’est-ce que c’est ?</strong></p> <p>La monnaie libre s’appelle la June : Ğ1. Elle est différente de l’euro. Elle est aussi numérique (seules quelques unités sont imprimées sur des billets), mais surtout, elle est totalement libre. Et même plus encore, nous pouvons la créer !!</p> <p>Elle correspond un peu à un revenu complémentaire. Elle n’a pas de frontière, elle peut être créée et utilisée là où les gens le souhaitent !</p> <p><strong>Pourquoi créer une monnaie libre ?</strong></p> <p>Pour répondre à de nombreux problèmes…</p> <p>Endettement, surendettement, faillite, spéculation démesurée, corruption, chômage, pauvreté, inégalités sociales croissantes…</p> <p>En fait, c’est une autre façon de fonctionner en parallèle de l’euro. Une manière d’être un peu plus libre !</p> <p><strong>Réapprenons à vivre ensemble !</strong></p> <p>Pour rejoindre la visioconférence il vous suffit de cliquer sur ce lien =&gt; <a href="https://meet.jit.si/monnaielibre83?fbclid=IwAR3KoWXzb0xQtvL8QV4QpFQEtyAwA0ZPPi6mVNwpdhI1xv0VzJAp6klROac">https://meet.jit.si/monnaielibre83</a></p> <p>Dans la mesure du possible, il est recommandé de vous équiper d’un casque ou micro-casque, cela sera plus agréable au niveau son.</p> <p>Les premières sessions seront assez généralistes pour présenter la Monnaie Libre et procéder également à l’ouverture de comptes.</p> <p>Mais nous aborderons également les idées de projets que les membres ont ou pourraient avoir et nous organiserons des séances dédiées.<br> Par avance merci de partager et pour votre future participation.</p> <p>Prenez soin de vous et de vos proches.<br> Amicalement, Francis.</p> <ul> <li>Groupe Monnaie Libre Var, avenue de Lattre de Tassigny, Brignoles, Provence-Alpes-Côte d’Azur, France</li> <li><a href="https://meet.jit.si/monnaielibre83">https://meet.jit.si/monnaielibre83</a></li> <li> <a href="https://www.agendadulibre.org/tags/june">june</a>, <a href="https://www.agendadulibre.org/tags/%C4%9F1">ğ1</a>, <a href="https://www.agendadulibre.org/tags/monnaie-libre">monnaie-libre</a>, <a href="https://www.agendadulibre.org/tags/visio-conf%C3%A9rence">visio-conférence</a>, <a href="https://www.agendadulibre.org/tags/cr%C3%A9ation-mon%C3%A9taire">création-monétaire</a> </li> </ul> <h3 id="toc-fr-beauvais-sensibilisation-et-partage-autour-du-libre---le-mercredi-23-décembre-2020-de-18h00-à-20h00">[FR Beauvais] <a href="https://www.agendadulibre.org/events/22409">Sensibilisation et partage autour du Libre</a> - Le mercredi 23 décembre 2020 de 18h00 à 20h00.</h3> <p>Chaque mercredi soir, l’association propose une rencontre pour partager des connaissances, des savoir-faire, des questions autour de l’utilisation des logiciels libres, que ce soit à propos du système d’exploitation Linux, des applications libres ou des services en ligne libres.</p> <p>C’est l’occasion aussi de mettre en avant l’action des associations fédératrices telles que l’April ou Framasoft, dont nous sommes adhérents et dont nous soutenons les initiatives avec grande reconnaissance.</p> <ul> <li>Ecospace de la Mie au Roy, 136 rue de la Mie au Roy, Beauvais, Hauts-de-France, France</li> <li><a href="https://www.oisux.org">https://www.oisux.org</a></li> <li> <a href="https://www.agendadulibre.org/tags/oisux">oisux</a>, <a href="https://www.agendadulibre.org/tags/logiciels-libres">logiciels-libres</a>, <a href="https://www.agendadulibre.org/tags/framasoft">framasoft</a>, <a href="https://www.agendadulibre.org/tags/atelier">atelier</a>, <a href="https://www.agendadulibre.org/tags/rencontre">rencontre</a> </li> </ul> <h3 id="toc-be-liege-café-crypté---ateliers-dautodéfense-numérique---le-samedi-26-décembre-2020-de-13h30-à-17h30">[BE Liege] <a href="https://www.agendadulibre.org/events/22477">Café Crypté - ateliers d’autodéfense numérique</a> - Le samedi 26 décembre 2020 de 13h30 à 17h30.</h3> <p>Le Café crypté est un moment collectif qui se tient chaque mois durant lequel nous tentons résolument de limiter la casse dans notre utilisation des outils numériques et connectés pour celles et ceux qui se sentent obliger de les utiliser.</p> <p>Le Café tente de lever le voile sur les motifs et stratégies de vol et d’exploitation de nos données privées par la surveillance de masse des multinationales numériques (GAFAM) et des états (qu’ils soient dits démocratiques ou non).</p> <p>Le Café cherche à partager et construire des stratégies et pratiques d’autodéfense numérique afin de se prémunir de ces intrusions diverses et permanentes afin notamment de rappeler que le droit à l’anonymat est un droit qui ne se négocie pas.</p> <p>Le Café est technique mais pas excluant, il est politique mais pas partisan, il est complexe mais pas compliqué et, bien sur, il est collaboratif mais pas contraignant.</p> <p>Actuellement (en 2020-2021), les cafés cryptés se produisent tous les derniers samedi du mois, de septembre à juin entre 13h30 et 17h30 à la Cafétéria Collective Kali (rue Saint Thomas 32 à Liège)</p> <p>Venez quand vous voulez, l’espace et le bar sont ouverts.</p> <p>(oui, le café crypté fait aussi le café)</p> <p>Si vous voulez continuer à discuter de tout ça hors des cafés, vous pouvez discuter avec l’adresse <a href="mailto:---">crypto@bawet.org</a> (et la personne qui est derrière bien sur)</p> <p>Et, tous les documents que le café produit ainsi que les notes des cafés se trouvent ici : <a href="https://cloud.domainepublic.net/bawet/s/aq4GPibwDPrWA7G">cloud.domainepublic.net/bawet/s/aq4GPibwDPrWA7G</a></p> <ul> <li>CC Kali, Rue Saint Thomas 32, Liege, Wallonie, Belgique</li> <li><a href="http://crypto.bawet.org">http://crypto.bawet.org</a></li> <li> <a href="https://www.agendadulibre.org/tags/crypto-party">crypto-party</a>, <a href="https://www.agendadulibre.org/tags/atelier">atelier</a>, <a href="https://www.agendadulibre.org/tags/numerique">numerique</a>, <a href="https://www.agendadulibre.org/tags/caf%C3%A9-crypt%C3%A9">café-crypté</a> </li> </ul> <h3 id="toc-fr-toulouse-visioconférence-monnaie-libre---le-samedi-26-décembre-2020-de-19h00-à-22h00">[FR Toulouse] <a href="https://www.agendadulibre.org/events/23057">Visioconférence Monnaie Libre</a> - Le samedi 26 décembre 2020 de 19h00 à 22h00.</h3> <p>On vous propose une série d’apéro présentation en visioconférence:<br> La Monnaie Libre en Q&amp;R,<br> Présentation des projets d’Econolibre,<br> Présentation de projets de monnaie libristes,<br> Alors notre monde en Monnaie Libre, comment on le fait?</p> <p>Chaque samedi à partir de 19h à 22h</p> <p>Proposez des thèmes de discussion, basés sur la Monnaie Libre, dans la semaine qui précède…</p> <p>Cela nous permettra de nous réunir, de voir comment nous supportons cette folie Covid-19, De poser des questions sur la monnaie libre et de présenter les nouveaux projets de l’association ECONOLIBRE et des projets d’autres acteurs Monnaie Libre; de réfléchir aux projets que nous pouvons faire ensemble, et de mieux nous connaître.</p> <p>Rien de spécial à installer, ça se passera via le site web JitSi:<br> <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fmeet.jit.si%2Feconolibre%3Ffbclid%3DIwAR2jhMUe0U1tUWNEe0Y8mOp5nyLp82t8ocG2O_ZGUux7yD9y5Khf8FVUtTA&amp;h=AT2wECcwvPgjvPIimexqf3C4pC1v9fivcV0b-pKfSG1IS2C8yMmWR-4IfFd2qFlbGwu7VxPPnpNUso8Co2yeg-6p5qkySHnM9GB2IR3R_xsjp65n9BDjZPZasFN-UoMIGgrUZaw6Mg">https://meet.jit.si/econolibre</a></p> <p>On pourra décider d’autres dates de réunions-visio en format différent (ateliers, cours, etc.) qui sont proposés par l’équipe d’Econolibre.</p> <p>Détails de l’association sur notre site: <a href="https://econolibre.org/">https://econolibre.org</a></p> <p>On peut manger pendant les réunions (c’est un apéro).</p> <p>Un petit TUTO pour expliquer comment utiliser Jitsi:<br> <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fforum.monnaie-libre.fr%2Ft%2Fvisioconference-avec-jistsi%2F10363%3Ffbclid%3DIwAR2LJDtmnFin3Pe7rSUMhoOJL3nO9AeW9d3OSTLpc_ha5z2dfH7wrcx4bA0&amp;h=AT3cTTK43Mh5JpGjv8y3M9TtdFBtiMm8Gfvqfa3n2-KyobwTODqTIvqdHpviLxBg0gSjR1RR4hcyx6iCVUcvPE8QkVjgoK0x6f4ey8pB9wEQ5H-XQislJt7s59ZCkB399ySPhugHsw">https://forum.monnaie-libre.fr/t/visioconference-avec-jistsi/10363</a></p> <p>La réunion commence à 19h, mais on teste les connexions à partir de 18h50.</p> <p>(si besoin) Une présentation pour les nouveaux monnaie libristes est faite, qui dure moins de 30mn et sera suivie de questions réponses.</p> <p>Quelques vidéos de présentation sur notre chaine Youtube: (Econolibre)<br> <a href="https://www.youtube.com/channel/UC9e9jWjY8foLfJp_6KTIHRQ">https://www.youtube.com/channel/UC9e9jWjY8foLfJp_6KTIHRQ</a><br> et sur notre chaine Odysee :<br> <a href="https://odysee.com/@Econolibre:6">https://odysee.com/@Econolibre:6</a></p> <ul> <li>Apéro Monnaie Libre en Ligne, Toulouse, Occitanie, France</li> <li><a href="https://econolibre.org">https://econolibre.org</a></li> <li> <a href="https://www.agendadulibre.org/tags/monnaie-libre">monnaie-libre</a>, <a href="https://www.agendadulibre.org/tags/econolibre">econolibre</a>, <a href="https://www.agendadulibre.org/tags/visio-conf%C3%A9rence">visio-conférence</a>, <a href="https://www.agendadulibre.org/tags/%C7%A71">ǧ1</a>, <a href="https://www.agendadulibre.org/tags/june">june</a>, <a href="https://www.agendadulibre.org/tags/cryptomonnaie">cryptomonnaie</a>, <a href="https://www.agendadulibre.org/tags/economie">economie</a>, <a href="https://www.agendadulibre.org/tags/cr%C3%A9ation-mon%C3%A9taire">création-monétaire</a> </li> </ul> </div><div><a href="https://linuxfr.org/news/agenda-du-libre-pour-la-semaine-52-de-l-annee-2020-ef5da088-9fb0-40fa-b6c2-3604333dc057.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/122662/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/agenda-du-libre-pour-la-semaine-52-de-l-annee-2020-ef5da088-9fb0-40fa-b6c2-3604333dc057#comments">ouvrir dans le navigateur</a> </p>
    • Li chevron_right

      Portage de TapTempo en VHDL

      martoni · pubsub.eckmul.net / linuxfr_news · Thursday, 17 December, 2020 - 18:48 · 100 minutes

    <div><p>Ayant préparé tout le matériel pour faire du <a href="//linuxfr.org/news/taptempo-en-verilog">TapTempo en Verilog</a>, il était trop tentant de réaliser la même chose en <a href="https://fr.wikipedia.org/wiki/VHDL">VHDL</a>. L’occasion de se plonger dans ce langage de description matériel concurrent du Verilog.<br> L’occasion également de parler des avancées de GHDL, un simulateur libre du VHDL, et désormais également capable de faire la synthèse en conjonction avec Yosys.</p> <p>Pour comprendre TapTempo dans la culture <a href="//linuxfr.org/wiki/moule">moulesque</a> de LinuxFr.org, il est conseillé d’aller faire un petit tour sur la <a href="//linuxfr.org/wiki/taptempo">page wiki homonyme</a>.</p> </div><ul><li>lien nᵒ 1 : <a title="https://www.youtube.com/watch?v=heLm9gSVSTc" hreflang="fr" href="https://linuxfr.org/redirect/107436">La vidéo du projet en action.</a></li><li>lien nᵒ 2 : <a title="https://github.com/Martoni/TapTempoASIC" hreflang="en" href="https://linuxfr.org/redirect/107453">Le dépot du projet TapTempoASIC (contenant la version Verilog et VHDL)</a></li><li>lien nᵒ 3 : <a title="https://github.com/ghdl/ghdl-yosys-plugin" hreflang="en" href="https://linuxfr.org/redirect/107466">Le dépot du projet d&#39;extension à Yosys pour la synthèse avec GHDL</a></li><li>lien nᵒ 4 : <a title="https://github.com/ghdl/ghdl" hreflang="en" href="https://linuxfr.org/redirect/107467">Le dépot de GHDL, pour la synthèse et la simulation VHDL</a></li><li>lien nᵒ 5 : <a title="https://github.com/YosysHQ/yosys" hreflang="en" href="https://linuxfr.org/redirect/107468">Le dépot de Yosys, pour la synthèse Verilog</a></li></ul><div><h2 class="sommaire">Sommaire</h2> <ul class="toc"> <li><a href="#toc-le-vhdl">Le VHDL</a></li> <li> <a href="#toc-architecture-de-taptempo">Architecture de TapTempo</a><ul> <li> <a href="#toc-les-param%C3%A8tres-dans-un-package--taptempo_pkg">Les paramètres dans un package : </a><a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/taptempo_pkg.vhd">taptempo_pkg</a> </li> <li> <a href="#toc-un-cadenceur-timer-pour-tout-le-syst%C3%A8me--timepulse">Un cadenceur (timer) pour tout le système : </a><a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/timepulse.vhd">Timepulse</a> </li> <li> <a href="#toc-filtrage-des-rebonds--debounce">Filtrage des rebonds : </a><a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/debounce.vhd">debounce</a> </li> <li> <a href="#toc-mesure-de-la-p%C3%A9riode-dappuis--percount">Mesure de la période d’appuis : </a><a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/percount.vhd">percount</a> </li> <li> <a href="#toc-conversion-p%C3%A9riodefr%C3%A9quence-division--per2bpm">Conversion période/fréquence (division) : </a><a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/per2bpm.vhd">per2bpm</a> </li> <li> <a href="#toc-sortie-affichage-en-rapport-cyclique--pwmgen">Sortie «affichage» en rapport cyclique : </a><a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/pwmgen.vhd">pwmgen</a> </li> </ul> </li> <li> <a href="#toc-synth%C3%A8se-placement-routage-et-configuration">Synthèse, placement-routage et configuration</a><ul> <li><a href="#toc-ghdl--yosys-la-lune-de-miel">GHDL + Yosys, la lune de miel</a></li> <li><a href="#toc-placement-routage-avec-nextpnr">Placement routage avec NextPnR</a></li> <li><a href="#toc-en-avant-la-musique-avec-openfpgaloader">En avant la musique avec openFPGALoader</a></li> </ul> </li> <li><a href="#toc-conclusion">Conclusion</a></li> </ul> <p>Comme l’indique le titre de cette dépêche, nous allons effectuer un « portage » du projet TapTempo, qui était écrit en Verilog, vers le language VHDL. Nous aurons donc l’avantage de profiter d’une architecture déjà conçue. Et comme une partie des stimulus de simulation (banc de test) ont été écrit en Python avec <a href="https://github.com/cocotb/cocotb">CocoTB</a>, nous allons pouvoir les reprendre (presque) tels quels pour simuler notre version VHDL.</p> <p><img src="https://img.linuxfr.org/img/687474703a2f2f66616269656e6d2e65752f706172746167652f74617074656d706f636f6c6f726c696768742e4a5047/taptempocolorlight.JPG" alt="Vue d’ensemble du matériel pour TapTempo"></p> <h2 id="toc-le-vhdl">Le VHDL</h2> <p>Le VHDL – pour <a href="https://fr.wikipedia.org/wiki/Very_High_Speed_Integrated_Circuit"><strong>V</strong>HSIC</a> <strong>H</strong>ardware <strong>D</strong>escription <strong>L</strong>anguage – est un langage de description matérielle issu d’une commande du ministère de la Défense américaine, c’est donc en toute logique qu’il soit surtout populaire… en Europe !</p> <p>Le VHDL s’inspire fortement du langage <a href="http://https://fr.wikipedia.org/wiki/Ada_(langage)">ADA</a> pour décrire le comportement des circuits intégrés numériques. Cela permet de décrire un modèle que l’on peut ensuite simuler au moyen d’un simulateur. <br> Le simulateur VHDL OpenSource le plus connu est <a href="http://ghdl.free.fr/">GHDL</a>, initialement développé par le français <a href="//linuxfr.org/news/entretien-avec-tristan-gingold-auteur-de-ghdl">Tristan Gringold</a> comme une surcouche à GCC.<br> Il existe également un simulateur opensource nommé <a href="http://www.fabienm.eu/flf/nvc-lautre-simulateur-vhdl-libre/">nvc</a>, mais il est moins mature que GHDL. Les autres simulateurs OpenSource, comme <a href="http://freehdl.seul.org/">FreeHDL</a> ou VerilatorVHDL, sont plus anecdotiques.</p> <p>À partir d’une source VHDL il est également possible de générer un schéma de portes et de bascules logiques au moyen d’un logiciel de synthèse. Pendant longtemps, les seuls logiciels libres de synthèse HDL ciblaient le Verilog (<a href="https://symbiflow.readthedocs.io/projects/vtr/en/latest/odin/">OdinII</a> et <a href="http://www.clifford.at/yosys/">Yosys</a>). Mais depuis <a href="https://github.com/ghdl/ghdl-yosys-plugin">cette année</a> une extension GHDL est apparue pour Yosys. Si cette extension n’est pas encore vraiment stabilisée, elle n’en reste pas moins parfaitement utilisable comme nous allons le voir dans cet exemple.</p> <p>Le VHDL est très hiérarchique, on décrit des modules avec leurs entrées-sorties que l’on assemble ensuite à la manière d’un schéma bloc dans un composant «top».</p> <p>Dans le cas de TapTempo, l’interface du module «top» est déclarée dans une entité <a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/taptempo.vhd">comme ceci</a> :</p> <pre><code class="VHDL"><span class="k">entity</span> <span class="nc">taptempo</span> <span class="k">is</span> <span class="k">port</span> <span class="p">(</span> <span class="n">clk_i</span> <span class="o">:</span> <span class="k">in</span> <span class="kt">std_logic</span><span class="p">;</span> <span class="n">btn_i</span> <span class="o">:</span> <span class="k">in</span> <span class="kt">std_logic</span><span class="p">;</span> <span class="n">pwm_o</span> <span class="o">:</span> <span class="k">out</span> <span class="kt">std_logic</span> <span class="p">);</span> <span class="k">end</span> <span class="k">entity</span> <span class="nc">taptempo</span><span class="p">;</span></code></pre> <p>VHDL n’est pas sensible à la casse ! C’est quelque chose qui est très perturbant mais dans l’exemple ci-dessus <code>Entity</code> est exactement identique à <code>entity</code> ou <code>ENTITY</code>. En pratique, le simulateur mettra tout en minuscule.</p> <p>Le module possède deux entrées : l’horloge (<code>clk_i</code>) et le bouton (<code>btn_i</code>) ainsi qu’une sortie pwm (<code>pwm_o</code>) pour l’affichage. Il est possible de définir des paramètres pour la génération du module en utilisant le mot clef <a href="https://www.ics.uci.edu/%7Ejmoorkan/vhdlref/generics.html"><code>generic</code></a> de la même manière que le <code>port</code>. Pour plus de simplicité nous choisirons plutôt de mettre tous les paramètres dans un package séparé (nommé <a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/taptempo_pkg.vhd">taptempo_pkg.vhd</a>), à la manière des <code>include</code> du C/C++.</p> <p>Le type <code>std_logic</code> est utilisé pour représenter les états que peut prendre un signal. En simulation, il peut prendre 9 valeurs différentes :<br> - <code>0</code> : 0 logique;<br> - <code>1</code> : 1 logique;<br> - <code>Z</code> : Haute impédence;<br> - <code>X</code> : inconnue, plusieurs pilotes en conflit -&gt; erreur;<br> - <code>L</code> : 0 faible, peut-être vu comme une résistance de tirage à la masse (pull-down);<br> - <code>H</code> : 1 faible, peut-être vu comme une résistance de tirage à Vcc (pull-up);<br> - <code>W</code> : signal faible inconnu, quand il y a un conflit entre <code>L</code> et <code>H</code> mais qu’un troisième pilote fort (<code>0</code> ou <code>1</code>) pourrait tout de même mettre le signal à une valeur déterminable;<br> - <code>-</code> : pas d’importance;<br> - <code>U</code> : non initialisé.</p> <p>Dans la pratique on évitera d’utiliser toutes ces valeurs si on veut limiter les problèmes à la synthèse. Par exemple les valeurs 'L' et 'H' ne peuvent être synthétisées « à l’intérieur » d’un FPGA, les résistances de tirage ne sont disponibles que sur les entrées sorties.<br> Un bus de données bidirectionnel à l’extérieur du FPGA devra être séparé en deux bus dans le FPGA : un pour chaque direction.</p> <p>En réalité on se limite à '0' et '1'. Les valeurs 'U' et 'X' apparaissent dans les traces de simulation et nous avertissent d’un problème avec notre code (simulation ou synthèse).</p> <p>Le type <code>std_logic</code> peut être étendu en tableau avec <code>std_logic_vector</code> très pratique pour représenter des bus.</p> <h2 id="toc-architecture-de-taptempo">Architecture de TapTempo</h2> <p>L’architecture global de TapTempo qui est exactement la même que celle de la version Verilog est présenté dans le schéma ci-dessous:</p> <p><img src="https://img.linuxfr.org/img/687474703a2f2f66616269656e6d2e65752f706172746167652f736368656d615f74617074656d706f5f637261796f6e2e6a7067/schema_taptempo_crayon.jpg" alt="schema blocs taptempo"></p> <p>Le tempo en entrée est donné par une touche de morse</p> <p><img src="https://img.linuxfr.org/img/687474703a2f2f66616269656e6d2e65752f706172746167652f74617074656d706f5f656e747265655f6d6f7273655f6d6f6469662e6a7067/taptempo_entree_morse_modif.jpg" alt="Schéma de la touche morse"></p> <p>qui peut aisément être remplacé par un simple bouton poussoir (c’est d’ailleurs monté en parallèle du bouton de la colorlight). Cette entrée est synchronisée avec l’horloge du FPGA au moyen d’une double bascule en série pour éviter la métastabilité :</p> <pre><code class="VHDL"> <span class="c1">-- Synchronize btn</span> <span class="nc">btn_sync_p</span><span class="o">:</span> <span class="k">process</span> <span class="p">(</span><span class="n">clk_i</span><span class="p">,</span> <span class="n">rst</span><span class="p">)</span> <span class="k">begin</span> <span class="k">if</span> <span class="n">rst</span> <span class="o">=</span> <span class="sc">'1'</span> <span class="k">then</span> <span class="n">btn_s</span> <span class="o">&lt;=</span> <span class="sc">'0'</span><span class="p">;</span> <span class="n">btn_old</span> <span class="o">&lt;=</span> <span class="sc">'0'</span><span class="p">;</span> <span class="k">elsif</span> <span class="n">rising_edge</span><span class="p">(</span><span class="n">clk_i</span><span class="p">)</span> <span class="k">then</span> <span class="n">btn_s</span> <span class="o">&lt;=</span> <span class="n">btn_old</span><span class="p">;</span> <span class="n">btn_old</span> <span class="o">&lt;=</span> <span class="n">btn_i</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span> <span class="k">end</span> <span class="k">process</span> <span class="nc">btn_sync_p</span><span class="p">;</span></code></pre> <p>Le module <code>debounce</code> se charge ensuite de filtrer les rebonds et transfert le signal au module de mesure de la période d’appuis.</p> <p>Cette période divise ensuite une constante de temps représentant le nombre de cycle de <code>timepulse</code> pour donner la fréquence en <strong>b</strong>attement <strong>p</strong>ar <strong>m</strong>inute (bpm).</p> <p>Pour être « affichée », cette valeur est transformée en un signal périodique avec un rapport cyclique proportionnel au battement <code>bpm</code>.</p> <p>Ce signal cyclique s’affiche ensuite très bien au moyen d’un voltmètre à aiguille comme celui-ci :</p> <p><img src="https://img.linuxfr.org/img/687474703a2f2f66616269656e6d2e65752f706172746167652f766f6c746d657472655f74617074656d706f2e6a7067/voltmetre_taptempo.jpg" alt="Photo du voltmètre à aiguille"></p> <p>La graduation qui nous intéresse ici est celle qui va de 0 à 250.</p> <h3 id="toc-les-paramètres-dans-un-package--taptempo_pkg">Les paramètres dans un package : <a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/taptempo_pkg.vhd">taptempo_pkg</a> </h3> <p>Pour configurer les différentes constantes et définir des fonctions utiles, on utilise un « package » nommé <code>taptempo_pkg.vhd</code> qui sera inclus dans tous les modules du projet :</p> <pre><code class="VHDL"><span class="k">use</span> <span class="nn">work.taptempo_pkg.</span><span class="k">all</span><span class="p">;</span></code></pre> <p>La déclaration d’un package en VHDL s’effectue en deux temps :</p> <ul> <li>on déclare d’abord les «objets» que l’on va utiliser dans le <code>package</code> :</li> </ul> <pre><code class="VHDL"><span class="c1">-- La déclaration de ce que le package rend visible</span> <span class="k">package</span> <span class="n">taptempo_pkg</span> <span class="k">is</span> <span class="k">constant</span> <span class="n">CLK_PER_NS</span> <span class="o">:</span> <span class="kt">natural</span><span class="p">;</span> <span class="k">constant</span> <span class="n">BPM_MAX</span> <span class="o">:</span> <span class="kt">natural</span><span class="p">;</span> <span class="k">constant</span> <span class="n">BPM_SIZE</span> <span class="o">:</span> <span class="kt">natural</span><span class="p">;</span> <span class="k">constant</span> <span class="n">TP_CYCLE</span> <span class="o">:</span> <span class="kt">natural</span><span class="p">;</span> <span class="k">constant</span> <span class="n">BTN_PER_MAX</span> <span class="o">:</span> <span class="kt">natural</span><span class="p">;</span> <span class="k">constant</span> <span class="n">BTN_PER_SIZE</span> <span class="o">:</span> <span class="kt">natural</span><span class="p">;</span> <span class="k">constant</span> <span class="n">BTN_PER_MIN</span> <span class="o">:</span> <span class="kt">natural</span><span class="p">;</span> <span class="k">constant</span> <span class="n">MIN_US</span> <span class="o">:</span> <span class="kt">natural</span><span class="p">;</span> <span class="k">constant</span> <span class="n">MAX_COUNT</span> <span class="o">:</span> <span class="kt">natural</span><span class="p">;</span> <span class="k">constant</span> <span class="n">DEBOUNCE_PER_US</span><span class="o">:</span> <span class="kt">natural</span><span class="p">;</span> <span class="k">constant</span> <span class="n">DEB_MAX_COUNT</span> <span class="o">:</span> <span class="kt">natural</span><span class="p">;</span> <span class="k">constant</span> <span class="n">DEB_MAX_COUNT_SIZE</span> <span class="o">:</span> <span class="kt">natural</span><span class="p">;</span> <span class="k">constant</span> <span class="n">ZEROS</span> <span class="o">:</span> <span class="kt">std_logic_vector</span><span class="p">(</span><span class="mi">31</span> <span class="k">downto</span> <span class="mi">0</span><span class="p">);</span> <span class="c1">-- Usefull function for register size</span> <span class="k">function</span> <span class="n">log2ceil</span><span class="p">(</span><span class="n">m</span> <span class="o">:</span> <span class="kt">integer</span><span class="p">)</span> <span class="k">return</span> <span class="kt">integer</span><span class="p">;</span> <span class="k">end</span> <span class="k">package</span> <span class="nc">taptempo_pkg</span><span class="p">;</span></code></pre> <ul> <li>Puis on définit leurs valeurs et comportement dans le corps (<code>body</code>) :</li> </ul> <pre><code class="VHDL"><span class="k">package</span> <span class="k">body</span> <span class="n">taptempo_pkg</span> <span class="k">is</span> <span class="k">constant</span> <span class="n">CLK_PER_NS</span> <span class="o">:</span> <span class="kt">natural</span> <span class="o">:=</span> <span class="mi">40</span><span class="p">;</span> <span class="k">constant</span> <span class="n">BPM_MAX</span> <span class="o">:</span> <span class="kt">natural</span> <span class="o">:=</span> <span class="mi">250</span><span class="p">;</span> <span class="c1">-- period of tp in ns</span> <span class="k">constant</span> <span class="n">TP_CYCLE</span> <span class="o">:</span> <span class="kt">natural</span> <span class="o">:=</span> <span class="mi">5120</span><span class="p">;</span> <span class="c1">-- Debounce period in us</span> <span class="k">constant</span> <span class="n">DEBOUNCE_PER_US</span><span class="o">:</span> <span class="kt">natural</span> <span class="o">:=</span> <span class="mi">50</span><span class="n">_000</span><span class="p">;</span> <span class="k">constant</span> <span class="n">DEB_MAX_COUNT</span> <span class="o">:</span> <span class="kt">natural</span> <span class="o">:=</span> <span class="p">(</span><span class="mi">1000</span> <span class="o">*</span> <span class="p">(</span><span class="n">DEBOUNCE_PER_US</span> <span class="o">/</span> <span class="n">TP_CYCLE</span><span class="p">));</span> <span class="k">constant</span> <span class="n">DEB_MAX_COUNT_SIZE</span> <span class="o">:</span> <span class="kt">natural</span> <span class="o">:=</span> <span class="n">log2ceil</span><span class="p">(</span><span class="n">DEB_MAX_COUNT</span><span class="p">);</span> <span class="c1">-- constant MIN_NS : natural := 60000000000;</span> <span class="k">constant</span> <span class="n">MIN_US</span> <span class="o">:</span> <span class="kt">natural</span> <span class="o">:=</span> <span class="mi">60</span><span class="n">_000_000</span><span class="p">;</span> <span class="k">constant</span> <span class="n">BPM_SIZE</span> <span class="o">:</span> <span class="kt">natural</span> <span class="o">:=</span> <span class="n">log2ceil</span><span class="p">(</span><span class="n">BPM_MAX</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span> <span class="k">constant</span> <span class="n">BTN_PER_MAX</span> <span class="o">:</span> <span class="kt">natural</span> <span class="o">:=</span> <span class="mi">1000</span> <span class="o">*</span> <span class="p">(</span><span class="n">MIN_US</span> <span class="o">/</span> <span class="n">TP_CYCLE</span><span class="p">);</span> <span class="k">constant</span> <span class="n">BTN_PER_SIZE</span> <span class="o">:</span> <span class="kt">natural</span> <span class="o">:=</span> <span class="n">log2ceil</span><span class="p">(</span><span class="n">BTN_PER_MAX</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span> <span class="k">constant</span> <span class="n">BTN_PER_MIN</span> <span class="o">:</span> <span class="kt">natural</span> <span class="o">:=</span> <span class="mi">1000</span> <span class="o">*</span> <span class="p">(</span><span class="n">MIN_US</span> <span class="o">/</span> <span class="n">TP_CYCLE</span><span class="p">)</span> <span class="o">/</span> <span class="n">BPM_MAX</span><span class="p">;</span> <span class="k">constant</span> <span class="n">MAX_COUNT</span> <span class="o">:</span> <span class="kt">natural</span> <span class="o">:=</span> <span class="n">TP_CYCLE</span> <span class="o">/</span> <span class="n">CLK_PER_NS</span><span class="p">;</span> <span class="k">constant</span> <span class="n">ZEROS</span> <span class="o">:</span> <span class="kt">std_logic_vector</span><span class="p">(</span><span class="mi">31</span> <span class="k">downto</span> <span class="mi">0</span><span class="p">)</span> <span class="o">:=</span> <span class="mh">x"00000000"</span><span class="p">;</span> <span class="k">function</span> <span class="n">log2ceil</span><span class="p">(</span><span class="n">m</span> <span class="o">:</span> <span class="kt">integer</span><span class="p">)</span> <span class="k">return</span> <span class="kt">integer</span> <span class="k">is</span> <span class="k">begin</span> <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span> <span class="k">to</span> <span class="kt">integer</span><span class="na">'high</span> <span class="k">loop</span> <span class="k">if</span> <span class="mi">2</span> <span class="o">**</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="n">m</span> <span class="k">then</span> <span class="k">return</span> <span class="n">i</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span> <span class="k">end</span> <span class="k">loop</span><span class="p">;</span> <span class="k">end</span> <span class="k">function</span> <span class="nc">log2ceil</span><span class="p">;</span> <span class="k">end</span> <span class="k">package</span> <span class="k">body</span><span class="p">;</span></code></pre> <p>Vous noterez la lourdeur d’avoir à déclarer le type de la constante dans le package avant de donner sa valeur dans le <code>body</code>. Les mauvaises langues diront que ça n’est pas beaucoup plus lourd que le C++ et ses doubles fichier (*.h et *.cpp) pour définir une classe.</p> <h3 id="toc-un-cadenceur-timer-pour-tout-le-système--timepulse">Un cadenceur (timer) pour tout le système : <a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/timepulse.vhd">Timepulse</a> </h3> <p>Nous allons avoir besoin de compter le temps dans plusieurs blocs du projet. L’horloge câblée sur la colorlight est de 25Mhz. Comme nous n’avons pas besoin de précisions à la quarantaine de nanoseconde nous allons utiliser un compteur global pour générer des « pulses » toutes les 5,12µs. Ces pulses seront utilisés en entrée des blocs ayant besoin de compter le temps. Cela réduira la taille des compteurs puisqu’ils n’auront pas à repartir de l’horloge globale.</p> <p><a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/timepulse.vhd">Le code</a> est suffisamment concis pour que nous puissions le reproduire ici dans son intégralité.</p> <pre><code class="VHDL"><span class="k">library</span> <span class="nn">ieee</span><span class="p">;</span> <span class="k">use</span> <span class="nn">ieee.std_logic_1164.</span><span class="k">all</span><span class="p">;</span> <span class="k">use</span> <span class="nn">ieee.numeric_std.</span><span class="k">all</span><span class="p">;</span> <span class="k">use</span> <span class="nn">work.taptempo_pkg.</span><span class="k">all</span><span class="p">;</span> <span class="k">entity</span> <span class="nc">timepulse</span> <span class="k">is</span> <span class="k">port</span> <span class="p">(</span> <span class="c1">-- clock and reset</span> <span class="n">clk_i</span> <span class="o">:</span> <span class="k">in</span> <span class="kt">std_logic</span><span class="p">;</span> <span class="n">rst_i</span> <span class="o">:</span> <span class="k">in</span> <span class="kt">std_logic</span><span class="p">;</span> <span class="c1">-- timepulse output</span> <span class="n">tp_o</span> <span class="o">:</span> <span class="k">out</span> <span class="kt">std_logic</span> <span class="p">);</span> <span class="k">end</span> <span class="k">entity</span> <span class="nc">timepulse</span><span class="p">;</span> <span class="k">architecture</span> <span class="nc">RTL</span> <span class="k">of</span> <span class="nc">timepulse</span> <span class="k">is</span> <span class="k">signal</span> <span class="n">counter</span> <span class="o">:</span> <span class="kt">natural</span> <span class="k">range</span> <span class="mi">0</span> <span class="k">to</span> <span class="n">MAX_COUNT</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="k">begin</span> <span class="n">tp_o</span> <span class="o">&lt;=</span> <span class="sc">'1'</span> <span class="k">when</span> <span class="p">(</span><span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span> <span class="k">else</span> <span class="sc">'0'</span><span class="p">;</span> <span class="nc">counter_p</span><span class="o">:</span> <span class="k">process</span> <span class="p">(</span><span class="n">clk_i</span><span class="p">,</span> <span class="n">rst_i</span><span class="p">)</span> <span class="k">begin</span> <span class="k">if</span> <span class="n">rst_i</span> <span class="o">=</span> <span class="sc">'1'</span> <span class="k">then</span> <span class="n">counter</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">elsif</span> <span class="n">rising_edge</span><span class="p">(</span><span class="n">clk_i</span><span class="p">)</span> <span class="k">then</span> <span class="k">if</span> <span class="n">counter</span> <span class="o">&lt;</span> <span class="n">MAX_COUNT</span> <span class="k">then</span> <span class="n">counter</span> <span class="o">&lt;=</span> <span class="n">counter</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="k">else</span> <span class="n">counter</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span> <span class="k">end</span> <span class="k">process</span> <span class="nc">counter_p</span><span class="p">;</span> <span class="k">end</span> <span class="k">architecture</span> <span class="nc">RTL</span><span class="p">;</span></code></pre> <p>Tout module VHDL est constitué d’une partie entité <code>entity</code> pour décrire les interfaces d’entrées-sorties. Ici nous avons les deux entrées horloge <code>clk_i</code> et reset <code>rst_i</code> caractéristiques d’un système synchrone. L’unique sortie est le pulse généré toutes les 5,12µs.</p> <p>La description du fonctionnement du module est donnée ensuite dans le bloc « <em>architecture</em> ». En plus des signaux d’entrées-sorties, il est possible de déclarer des signaux interne au bloc. Nous avons déclaré ici le signal <code>counter</code> qui est un entier naturel borné de 0 à <code>MAX_COUNT + 1</code>. La possibilité de borner les signaux que l’on déclare en <em>integer</em> permet d’aider l’outil de synthèse à générer un bus de taille adaptée quand on ne souhaite pas déclarer un <code>std_logic_vector</code> avec une taille explicite.</p> <p>Attention, un <code>signal</code> n’a pas la même signification qu’une variable dans un programme procédural. Une variable prend une seule valeur qui changera au cours de l’exécution du programme. Un signal doit être vu comme une liste des différentes valeurs que prendra le signal au cours de la simulation. La première valeur de la liste sera son état initial, et à chaque événement sur le signal on ajoutera une valeur à la liste jusqu’à la fin de la simulation.</p> <p>Nous aurions également pu déclarer des constantes à cet endroit, mais comme dit dans l’introduction, une constante étant un paramètre modifiable nous avons préféré le mettre dans le package <code>taptempo_pkg</code>.</p> <p>Le corps de l’architecture de timepulse possède deux « process » concurrents qui s’exécutent en parallèle. Le premier est une assignation continue :</p> <pre><code class="VHDL"> <span class="n">tp_o</span> <span class="o">&lt;=</span> <span class="sc">'1'</span> <span class="k">when</span> <span class="p">(</span><span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span> <span class="k">else</span> <span class="sc">'0'</span><span class="p">;</span></code></pre> <p>Il fait passer <code>tp_o</code> à '1' quand le compteur <code>counter</code> atteint la valeur 0. Ce « process » est activé à chaque évenement/changement sur le signal <code>counter</code>.</p> <p>Le second process est plus étoffé :</p> <pre><code class="VHDL"> <span class="nc">counter_p</span><span class="o">:</span> <span class="k">process</span> <span class="p">(</span><span class="n">clk_i</span><span class="p">,</span> <span class="n">rst_i</span><span class="p">)</span> <span class="k">begin</span> <span class="c1">--...</span> <span class="k">end</span> <span class="k">process</span> <span class="nc">counter_p</span><span class="p">;</span></code></pre> <p>Ce process est exécuté à chaque événement surgissant sur les signaux déclarés dans la liste de sensibilité (ici <code>clk_i</code> et <code>rst_i</code>). Le contenu du <code>process</code> est quant à lui exécuté de manière séquentielle.</p> <pre><code class="VHDL"> <span class="k">if</span> <span class="n">rst_i</span> <span class="o">=</span> <span class="sc">'1'</span> <span class="k">then</span> <span class="c1">--...</span> <span class="k">elsif</span> <span class="n">rising_edge</span><span class="p">(</span><span class="n">clk_i</span><span class="p">)</span> <span class="k">then</span> <span class="c1">--...</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span></code></pre> <p>Cette structure décrit une <a href="https://fr.wikipedia.org/wiki/Bascule_(circuit_logique)#Bascule_D">bascule D</a> qui sera bien reconnue comme telle par le logiciel de synthèse.<br> Un reset asynchrone ré-initialise le compteur à 0:</p> <pre><code class="VHDL"> <span class="n">counter</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">;</span></code></pre> <p>Et sur un front montant de l’horloge</p> <pre><code class="VHDL"> <span class="k">elsif</span> <span class="n">rising_edge</span><span class="p">(</span><span class="n">clk_i</span><span class="p">)</span> <span class="k">then</span></code></pre> <p>on incrémente le compteur jusqu’à son maximum.</p> <pre><code class="VHDL"> <span class="k">if</span> <span class="n">counter</span> <span class="o">&lt;</span> <span class="n">MAX_COUNT</span> <span class="k">then</span> <span class="n">counter</span> <span class="o">&lt;=</span> <span class="n">counter</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="k">else</span> <span class="n">counter</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span></code></pre> <p>Notez l’utilisation de l’opérateur d’affectation non bloquant <code>&lt;=</code> qui n’affectera la valeur qu’à la fin de l’exécution du process.</p> <p>Si par exemple nous avons le code suivant dans un process :</p> <pre><code class="VHDL"> <span class="n">counter</span> <span class="o">&lt;=</span> <span class="mi">10</span><span class="p">;</span> <span class="n">counter</span> <span class="o">&lt;=</span> <span class="mi">5</span><span class="p">;</span></code></pre> <p>La valeur effective de <code>counter</code> à la fin de l’exécution de process sera 5. Et à aucun moment la valeur 10 n’apparaîtra dans <code>counter</code>.</p> <p>Pour visualiser les signaux de sortie du module on pourra se rendre dans <a href="https://github.com/Martoni/TapTempoASIC/tree/master/cocotb/test_timepulse">le répertoire</a> <code>cocotb/test_timepulse</code> du projet et lancer le test en donnant ghdl comme simulateur:</p> <pre><code class="Shell">$ <span class="nb">cd</span> test_timepulse $ <span class="nv">SIM</span><span class="o">=</span>ghdl make</code></pre> <p>Le même principe pourra être appliqué pour simuler tous les autres modules de TapTempo.</p> <p>La simulation consiste à laisser passer le temps pendant une miliseconde :</p> <pre><code class="python"><span class="nd">@cocotb.test</span><span class="p">()</span> <span class="n">async</span> <span class="k">def</span> <span class="nf">double_push_test</span><span class="p">(</span><span class="n">dut</span><span class="p">):</span> <span class="n">trg</span> <span class="o">=</span> <span class="n">TestTimePulse</span><span class="p">(</span><span class="n">dut</span><span class="p">)</span> <span class="n">trg</span><span class="o">.</span><span class="n">display_config</span><span class="p">()</span> <span class="n">trg</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Running test!"</span><span class="p">)</span> <span class="n">await</span> <span class="n">trg</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span> <span class="n">await</span> <span class="n">Timer</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">units</span><span class="o">=</span><span class="s2">"ms"</span><span class="p">)</span></code></pre> <p>La simulation génère un fichier nommé <code>timepulse.fst</code> visible avec <a href="https://github.com/gtkwave">gtkwave</a> :</p> <pre><code class="shell">$ gtkwave timepulse.fst</code></pre> <p>Comme visible dans l’image ci-dessous.</p> <p><img src="//img.linuxfr.org/img/687474703a2f2f7777772e66616269656e6d2e65752f6c696e757866722f74696d6570756c73655f776176652e6a7067/timepulse_wave.jpg" alt="Visualisation de la simulation timepulse avec gtkwave" title="Source : http://www.fabienm.eu/linuxfr/timepulse_wave.jpg"></p> <h3 id="toc-filtrage-des-rebonds--debounce">Filtrage des rebonds : <a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/debounce.vhd">debounce</a> </h3> <p>Le manipulateur morse génère des rebonds, le filtrage avait initialement été réglé à 20 ms sur la version Verilog. Pour être vraiment tranquille nous le monterons à 50 ms, mais c’est particulièrement long comme période. Comme pour le reste, cette configuration se trouve donc dans le package <code>taptempo_pkg.vhd</code>.</p> <p>Le module <code>debounce</code> va se charger de filtrer les rebonds au moyen d’une machine à états et d’un compteur.</p> <pre><code class="VHDL"><span class="k">entity</span> <span class="nc">debounce</span> <span class="k">is</span> <span class="k">port</span> <span class="p">(</span> <span class="c1">-- clock and reset</span> <span class="n">clk_i</span> <span class="o">:</span> <span class="k">in</span> <span class="kt">std_logic</span><span class="p">;</span> <span class="n">rst_i</span> <span class="o">:</span> <span class="k">in</span> <span class="kt">std_logic</span><span class="p">;</span> <span class="c1">-- inputs</span> <span class="n">tp_i</span> <span class="o">:</span> <span class="k">in</span> <span class="kt">std_logic</span><span class="p">;</span> <span class="n">btn_i</span> <span class="o">:</span> <span class="k">in</span> <span class="kt">std_logic</span><span class="p">;</span> <span class="c1">-- outputs</span> <span class="n">btn_o</span> <span class="o">:</span> <span class="k">out</span> <span class="kt">std_logic</span> <span class="p">);</span> <span class="k">end</span> <span class="k">entity</span><span class="p">;</span></code></pre> <p>Le comptage des pulsations du module timepulse s’effectue dans un process :</p> <pre><code class="VHDL"><span class="nc">counter_p</span><span class="o">:</span> <span class="k">process</span> <span class="p">(</span><span class="n">clk_i</span><span class="p">,</span> <span class="n">rst_i</span><span class="p">)</span> <span class="k">begin</span> <span class="k">if</span> <span class="n">rst_i</span> <span class="o">=</span> <span class="sc">'1'</span> <span class="k">then</span> <span class="n">counter</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">elsif</span> <span class="n">rising_edge</span><span class="p">(</span><span class="n">clk_i</span><span class="p">)</span> <span class="k">then</span> <span class="k">if</span> <span class="n">tp_i</span> <span class="o">=</span> <span class="sc">'1'</span> <span class="k">then</span> <span class="k">if</span> <span class="p">(</span><span class="n">state_reg</span> <span class="o">=</span> <span class="n">s_cnt_high</span><span class="p">)</span> <span class="k">or</span> <span class="p">(</span><span class="n">state_reg</span> <span class="o">=</span> <span class="n">s_cnt_low</span><span class="p">)</span> <span class="k">then</span> <span class="n">counter</span> <span class="o">&lt;=</span> <span class="n">counter</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="k">else</span> <span class="n">counter</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span> <span class="k">end</span> <span class="k">process</span> <span class="nc">counter_p</span><span class="p">;</span></code></pre> <p>La machine à états est constituée de 4 états :</p> <pre><code class="VHDL"> <span class="k">type</span> <span class="n">t_state</span> <span class="k">is</span> <span class="p">(</span><span class="n">s_wait_low</span><span class="p">,</span> <span class="n">s_wait_high</span><span class="p">,</span> <span class="n">s_cnt_high</span><span class="p">,</span> <span class="n">s_cnt_low</span><span class="p">);</span> <span class="k">signal</span> <span class="n">state_reg</span> <span class="o">:</span> <span class="n">t_state</span><span class="p">;</span></code></pre> <p>Deux états d’attentes et deux états de comptages. Dans un état d’attente <code>s_wait_</code> on attend un front du bouton. Quand un front survient on passe dans un état de comptage <code>s_cnt_</code>.</p> <p>Dans un état de comptage, le compteur s’incrémente et passe à l’état d’attente lorsqu’il arrive à son maximum.</p> <p>De cette manière, seuls les fronts intervenant dans un état d’attente sont pris en compte. Une fois la machine à états dans un état de comptage, plus aucun front du bouton n’est « écouté ».</p> <h3 id="toc-mesure-de-la-période-dappuis--percount">Mesure de la période d’appuis : <a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/percount.vhd">percount</a> </h3> <p>Le module <code>percount</code> (<code>per</code>iod <code>count</code>er) va compter le temps d’une période entre deux appuis sur le bouton. </p> <p>Si on passe sur les signaux désormais bien connus <code>clk_i</code>, <code>rst_i</code> et <code>tp_i</code>; l’entrée du module est <code>btn_i</code> qui représente la valeur du bouton (appuyé ou non) sans rebond.</p> <p>Les deux signaux de sortie sont :<br> - Un vecteur <code>btn_per_o</code> représentant la valeur de la période mesurée<br> - Un signal <code>btn_per_valid</code> donnant la validité de la valeur précédente. La valeur de <code>btn_per_o</code> est considérée comme bonne uniquement si <code>btn_per_valid</code> est à '1'.</p> <p>Dans un premier <code>process</code> détecte les fronts descendants du bouton :</p> <pre><code class="VHDL"> <span class="n">btn_fall</span> <span class="o">&lt;=</span> <span class="n">btn_old</span> <span class="k">and</span> <span class="p">(</span><span class="k">not</span> <span class="n">btn_i</span><span class="p">);</span> <span class="nc">btn_p</span><span class="o">:</span> <span class="k">process</span> <span class="p">(</span><span class="n">clk_i</span><span class="p">,</span> <span class="n">rst_i</span><span class="p">)</span> <span class="k">begin</span> <span class="k">if</span> <span class="n">rst_i</span> <span class="o">=</span> <span class="sc">'1'</span> <span class="k">then</span> <span class="n">btn_old</span> <span class="o">&lt;=</span> <span class="sc">'0'</span><span class="p">;</span> <span class="k">elsif</span> <span class="n">rising_edge</span><span class="p">(</span><span class="n">clk_i</span><span class="p">)</span> <span class="k">then</span> <span class="n">btn_old</span> <span class="o">&lt;=</span> <span class="n">btn_i</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span> <span class="k">end</span> <span class="k">process</span> <span class="nc">btn_p</span><span class="p">;</span></code></pre> <p>Puis dans un second process on compte le temps et on remet à 0 le compteur quand un front descendant du bouton surgit :</p> <pre><code class="VHDL"> <span class="c1">--...</span> <span class="k">elsif</span> <span class="n">rising_edge</span><span class="p">(</span><span class="n">clk_i</span><span class="p">)</span> <span class="k">then</span> <span class="k">if</span> <span class="n">btn_fall</span> <span class="o">=</span> <span class="sc">'1'</span> <span class="k">then</span> <span class="n">counter_valid</span> <span class="o">&lt;=</span> <span class="sc">'1'</span><span class="p">;</span> <span class="k">elsif</span> <span class="n">counter_valid</span> <span class="o">=</span> <span class="sc">'1'</span> <span class="k">then</span> <span class="n">counter</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">counter_valid</span> <span class="o">&lt;=</span> <span class="sc">'0'</span><span class="p">;</span> <span class="k">elsif</span> <span class="p">(</span><span class="n">tp_i</span> <span class="o">=</span> <span class="sc">'1'</span><span class="p">)</span> <span class="k">and</span> <span class="p">(</span><span class="n">counter</span> <span class="o">&lt;</span> <span class="n">BTN_PER_MAX</span><span class="p">)</span> <span class="k">then</span> <span class="n">counter</span> <span class="o">&lt;=</span> <span class="n">counter</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span> <span class="c1">-- ...</span></code></pre> <h3 id="toc-conversion-périodefréquence-division--per2bpm">Conversion période/fréquence (division) : <a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/per2bpm.vhd">per2bpm</a> </h3> <p>C’est la partie « dure » du système, il va falloir faire une division d’une constante par la période mesurée.</p> <svg viewbox="0 -1381.785489002541 13403 2302.0139780050818" style="width: 31.084ex; height: 5.301ex; vertical-align: -2.169ex; margin: 1px 0px; position: static;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs id="MathJax_SVG_glyphs"><path id="STIXWEBMAINI-62" stroke-width="10" d="M163 290h1c68 113 123 151 193 151c67 0 116 -43 116 -120c0 -158 -165 -332 -320 -332c-57 0 -130 23 -130 53v6l142 523c6 24 9 38 9 47c0 22 -5 23 -64 25v17c67 8 103 14 153 23l5 -5l-21 -82zM388 306c0 61 -26 86 -70 86c-48 0 -94 -42 -137 -115 c-44 -74 -72 -171 -72 -231c0 -23 15 -34 46 -34c43 0 86 21 123 59c60 62 110 161 110 235Z"></path><path id="STIXWEBMAINI-70" stroke-width="10" d="M215 428l-29 -100c54 81 111 113 171 113c74 0 115 -47 115 -125c0 -165 -151 -327 -297 -327c-23 0 -44 4 -69 17c-17 -70 -40 -152 -40 -166c0 -22 15 -29 62 -29v-16h-203v16c43 1 56 16 68 63l115 432c11 40 16 66 16 71c0 24 -28 27 -44 27h-22l-2 15l156 22 c3 0 5 -2 5 -4c0 0 -1 -5 -2 -9zM382 313c0 57 -17 85 -62 85c-53 0 -112 -54 -135 -114c-29 -75 -65 -204 -65 -238c0 -22 20 -38 48 -38c53 0 101 33 145 95c48 67 69 140 69 210Z"></path><path id="STIXWEBMAINI-6D" stroke-width="10" d="M704 105l-5 -7c-53 -74 -97 -107 -144 -107c-26 0 -40 16 -40 46c0 10 3 27 13 66l58 227c5 20 7 33 7 38c0 12 -9 21 -20 21c-30 0 -81 -47 -131 -117c-49 -69 -69 -118 -108 -272h-75l27 93c44 152 68 258 68 271c0 16 -9 25 -22 25c-34 0 -93 -58 -149 -143 c-34 -52 -48 -88 -96 -246h-75l43 144c40 133 55 216 55 228c0 15 -14 22 -41 22h-25v16l162 31l3 -2l-58 -209c89 145 159 211 220 211c40 0 60 -24 60 -60c0 -19 -13 -75 -40 -152c70 111 111 161 160 192c24 15 43 20 63 20c37 0 58 -27 58 -63c0 -7 -2 -23 -3 -28 l-68 -251c-6 -23 -10 -41 -10 -45c0 -11 4 -16 12 -16c17 0 35 16 65 53l21 26Z"></path><path id="STIXWEBMAIN-3D" stroke-width="10" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66Z"></path><path id="STIXWEBMAIN-31" stroke-width="10" d="M394 0h-276v15c74 4 95 25 95 80v449c0 34 -9 49 -30 49c-10 0 -27 -5 -45 -12l-27 -10v14l179 91l9 -3v-597c0 -43 20 -61 95 -61v-15Z"></path><path id="STIXWEBMAIN-30" stroke-width="10" d="M476 330c0 -172 -63 -344 -226 -344c-171 0 -226 186 -226 350c0 177 69 340 230 340c131 0 222 -141 222 -346zM380 325c0 208 -44 325 -132 325c-83 0 -128 -118 -128 -321s44 -317 130 -317c85 0 130 115 130 313Z"></path><path id="STIXWEBMAIN-30" stroke-width="10" d="M476 330c0 -172 -63 -344 -226 -344c-171 0 -226 186 -226 350c0 177 69 340 230 340c131 0 222 -141 222 -346zM380 325c0 208 -44 325 -132 325c-83 0 -128 -118 -128 -321s44 -317 130 -317c85 0 130 115 130 313Z"></path><path id="STIXWEBMAIN-30" stroke-width="10" d="M476 330c0 -172 -63 -344 -226 -344c-171 0 -226 186 -226 350c0 177 69 340 230 340c131 0 222 -141 222 -346zM380 325c0 208 -44 325 -132 325c-83 0 -128 -118 -128 -321s44 -317 130 -317c85 0 130 115 130 313Z"></path><path id="STIXWEBMAIN-D7" stroke-width="10" d="M597 22l-46 -47l-231 230l-231 -230l-46 46l230 231l-230 231l47 46l230 -230l231 230l46 -45l-230 -232Z"></path><path id="STIXWEBMAINI-4D" stroke-width="10" d="M872 653v-16c-57 -9 -67 -23 -81 -74l-123 -443c-7 -25 -14 -46 -14 -62c0 -26 18 -40 81 -42l-1 -16h-271v16c65 7 85 24 102 86l126 459l-376 -561h-17l-62 546l-118 -428c-5 -18 -9 -43 -9 -54c0 -28 19 -44 70 -48v-16h-197v16c52 6 68 22 100 134l114 401 c8 27 12 44 12 52c0 19 -24 31 -74 34v16h181l56 -492l335 492h166Z"></path><path id="STIXWEBMAINI-49" stroke-width="10" d="M384 653v-16c-56 -7 -65 -16 -82 -77l-120 -429c-9 -32 -15 -56 -15 -76c0 -28 12 -32 69 -39v-16h-244v16c55 10 69 19 84 75l120 441c7 25 13 46 13 62c0 25 -16 40 -72 43v16h247Z"></path><path id="STIXWEBMAINI-4E" stroke-width="10" d="M727 653v-16c-63 -14 -65 -16 -102 -145l-146 -507h-18l-230 550l-114 -422c-6 -21 -9 -41 -9 -54c0 -28 18 -39 70 -43v-16h-198v16c56 8 70 24 106 152l117 415c-15 35 -39 54 -86 54v16h160l207 -499l106 388c6 21 8 32 8 44c0 36 -12 46 -69 51v16h198Z"></path><path id="STIXWEBMAIN-5F" stroke-width="10" d="M500 -125h-500v50h500v-50Z"></path><path id="STIXWEBMAINI-55" stroke-width="10" d="M765 653v-16c-62 -14 -66 -19 -104 -149l-83 -285c-22 -75 -54 -133 -97 -169c-43 -37 -93 -52 -158 -52c-131 0 -221 69 -221 164c0 54 18 121 44 216l52 189c5 18 9 33 9 45c0 26 -18 39 -80 41v16h272v-16c-68 -7 -85 -22 -104 -91l-63 -226 c-27 -95 -40 -157 -40 -179c0 -71 60 -118 138 -118c113 0 175 68 220 232l64 233c16 59 23 94 23 103c0 30 -17 41 -70 46v16h198Z"></path><path id="STIXWEBMAINI-53" stroke-width="10" d="M508 667l-40 -200l-18 3c0 102 -22 163 -119 163c-69 0 -112 -37 -112 -100c0 -49 8 -65 99 -156c91 -92 113 -135 113 -200c0 -114 -87 -195 -202 -195c-31 0 -58 7 -104 23c-27 10 -36 12 -47 12c-20 0 -36 -9 -43 -32h-18l34 224l20 -2c-2 -9 -2 -16 -2 -23 c0 -98 60 -167 144 -167c77 0 131 52 131 128c0 43 -14 73 -60 123l-39 42c-14 15 -26 29 -39 42c-60 64 -75 96 -75 150c0 105 82 164 178 164c31 0 64 -5 85 -14c21 -8 33 -11 46 -11c22 0 31 5 45 26h23Z"></path><path id="STIXWEBMAINI-62" stroke-width="10" d="M163 290h1c68 113 123 151 193 151c67 0 116 -43 116 -120c0 -158 -165 -332 -320 -332c-57 0 -130 23 -130 53v6l142 523c6 24 9 38 9 47c0 22 -5 23 -64 25v17c67 8 103 14 153 23l5 -5l-21 -82zM388 306c0 61 -26 86 -70 86c-48 0 -94 -42 -137 -115 c-44 -74 -72 -171 -72 -231c0 -23 15 -34 46 -34c43 0 86 21 123 59c60 62 110 161 110 235Z"></path><path id="STIXWEBMAINI-74" stroke-width="10" d="M296 428l-5 -32h-84l-87 -328c-1 -4 -2 -11 -2 -14c0 -13 6 -16 15 -16c16 0 32 16 81 79l13 -7c-60 -92 -91 -121 -143 -121c-27 0 -46 12 -46 37c0 11 8 42 16 74l78 296h-75c-1 3 -1 6 -1 6c0 11 9 20 33 25c32 7 97 56 133 110c4 6 10 9 14 9c6 0 9 -3 9 -8 c0 0 0 -5 -1 -7l-28 -103h80Z"></path><path id="STIXWEBMAINI-6E" stroke-width="10" d="M460 117l14 -13c-68 -93 -93 -113 -140 -113c-25 0 -47 16 -47 54c0 10 2 23 16 75l44 162c8 31 14 67 14 79c0 18 -9 29 -24 29c-40 0 -85 -49 -148 -142c-45 -67 -53 -90 -100 -248h-75l96 350c1 5 2 11 2 17c0 20 -14 26 -65 27v16c81 16 109 20 162 31l4 -2l-67 -218 c100 160 167 220 231 220c43 0 65 -25 65 -61c0 -18 -4 -39 -10 -60l-56 -203c-10 -36 -14 -53 -14 -61c0 -9 4 -18 16 -18c14 0 32 16 61 53c7 8 14 17 21 26Z"></path><path id="STIXWEBMAIN-5F" stroke-width="10" d="M500 -125h-500v50h500v-50Z"></path><path id="STIXWEBMAINI-70" stroke-width="10" d="M215 428l-29 -100c54 81 111 113 171 113c74 0 115 -47 115 -125c0 -165 -151 -327 -297 -327c-23 0 -44 4 -69 17c-17 -70 -40 -152 -40 -166c0 -22 15 -29 62 -29v-16h-203v16c43 1 56 16 68 63l115 432c11 40 16 66 16 71c0 24 -28 27 -44 27h-22l-2 15l156 22 c3 0 5 -2 5 -4c0 0 -1 -5 -2 -9zM382 313c0 57 -17 85 -62 85c-53 0 -112 -54 -135 -114c-29 -75 -65 -204 -65 -238c0 -22 20 -38 48 -38c53 0 101 33 145 95c48 67 69 140 69 210Z"></path><path id="STIXWEBMAINI-65" stroke-width="10" d="M358 109l12 -12c-57 -70 -121 -108 -204 -108c-81 0 -135 54 -135 137c0 155 149 315 299 315c53 0 82 -26 82 -68c0 -86 -105 -164 -284 -187c-10 -20 -10 -46 -10 -61c0 -55 37 -91 93 -91c44 0 75 16 147 75zM152 252l-17 -44c86 21 124 39 161 74c31 30 50 66 50 97 c0 24 -7 39 -35 39c-57 0 -125 -77 -159 -166Z"></path><path id="STIXWEBMAINI-72" stroke-width="10" d="M176 223l16 35c19 42 53 95 94 138c26 27 56 45 79 45c28 0 47 -21 47 -51s-17 -54 -47 -54c-18 0 -26 11 -35 26c-6 10 -9 14 -16 14c-18 0 -46 -33 -82 -94c-43 -74 -61 -114 -111 -282h-76l81 292c14 52 16 61 16 82s-18 26 -38 26c-8 0 -16 -1 -31 -3v17l155 27l3 -2 Z"></path><path id="STIXWEBMAIN-5F" stroke-width="10" d="M500 -125h-500v50h500v-50Z"></path><path id="STIXWEBMAINI-69" stroke-width="10" d="M264 599c0 -28 -23 -51 -49 -51c-29 0 -48 21 -48 53c0 31 20 53 47 53s50 -26 50 -55zM222 114l13 -11c-55 -84 -87 -114 -137 -114c-33 0 -49 18 -49 55c0 20 7 55 22 111l48 177c5 18 9 36 9 44c0 20 -10 23 -64 24v16c39 3 59 6 160 25l4 -3l-94 -343 c-5 -17 -10 -30 -10 -44c0 -10 6 -15 14 -15c17 0 41 21 84 78Z"></path><path id="STIXWEBMAIN-D7" stroke-width="10" d="M597 22l-46 -47l-231 230l-231 -230l-46 46l230 231l-230 231l47 46l230 -230l231 230l46 -45l-230 -232Z"></path><path id="STIXWEBMAINI-54" stroke-width="10" d="M633 653l-44 -164l-17 2c2 17 3 33 3 46c0 53 -36 81 -101 81h-58l-137 -490c-6 -21 -14 -44 -14 -66c0 -31 12 -39 53 -43l35 -3v-16h-288v16c69 6 92 21 107 75l143 527c-158 0 -190 -16 -238 -124l-18 4l42 155h532Z"></path><path id="STIXWEBMAINI-50" stroke-width="10" d="M146 653h241c147 0 218 -52 218 -148c0 -54 -27 -109 -68 -143c-46 -38 -116 -57 -205 -57c-42 0 -64 2 -90 8l-53 -193c-7 -27 -14 -48 -14 -63c0 -23 15 -35 69 -41v-16h-244v16c57 8 66 17 84 82l116 414c13 47 17 68 17 83c0 27 -14 35 -71 42v16zM320 592l-69 -245 c29 -5 34 -5 52 -5c62 0 97 6 128 24c44 25 71 69 71 134c0 89 -48 123 -130 123c-28 0 -46 -8 -52 -31Z"></path><path id="STIXWEBMAIN-5F" stroke-width="10" d="M500 -125h-500v50h500v-50Z"></path><path id="STIXWEBMAINI-43" stroke-width="10" d="M689 664l-37 -200l-18 3c-12 107 -61 163 -149 163c-74 0 -144 -38 -199 -97c-72 -77 -108 -191 -108 -301c0 -140 64 -205 175 -205c82 0 142 29 229 119l18 -15c-90 -106 -170 -149 -273 -149c-153 0 -261 96 -261 261c0 141 77 272 187 350c64 46 140 73 219 73 c33 0 75 -2 117 -17c20 -7 32 -7 41 -7c20 0 30 6 38 22h21Z"></path><path id="STIXWEBMAINI-59" stroke-width="10" d="M633 653v-16c-29 -10 -37 -20 -70 -61l-219 -270l-36 -123c-23 -79 -30 -106 -30 -127c0 -25 14 -34 53 -37l36 -3v-16h-289v16c66 4 89 17 107 81l59 205l-76 267c-15 52 -21 60 -77 68v16h239v-16c-60 -6 -72 -14 -72 -36c0 -15 12 -59 36 -144l31 -110l39 46 c105 124 149 186 149 213c0 17 -11 25 -40 28l-29 3v16h189Z"></path><path id="STIXWEBMAINI-43" stroke-width="10" d="M689 664l-37 -200l-18 3c-12 107 -61 163 -149 163c-74 0 -144 -38 -199 -97c-72 -77 -108 -191 -108 -301c0 -140 64 -205 175 -205c82 0 142 29 229 119l18 -15c-90 -106 -170 -149 -273 -149c-153 0 -261 96 -261 261c0 141 77 272 187 350c64 46 140 73 219 73 c33 0 75 -2 117 -17c20 -7 32 -7 41 -7c20 0 30 6 38 22h21Z"></path><path id="STIXWEBMAINI-4C" stroke-width="10" d="M559 180l-58 -180h-509v16c56 6 64 15 82 78l122 438c8 27 11 47 11 62c0 29 -15 39 -77 43v16h273v-16c-60 -4 -85 -20 -101 -77l-120 -429c-6 -23 -10 -40 -10 -54c0 -31 23 -41 105 -41c100 0 131 5 180 38c32 21 54 54 82 112Z"></path><path id="STIXWEBMAINI-45" stroke-width="10" d="M634 653l-31 -154l-22 2c2 17 3 33 3 46c0 60 -35 73 -192 73c-57 0 -67 -4 -73 -26l-66 -233h78c90 0 101 12 139 97l18 -4l-68 -232l-20 5c5 22 7 34 7 52c0 17 -2 26 -7 31c-11 10 -38 15 -78 15h-78l-32 -112c-25 -88 -36 -134 -36 -146c0 -24 23 -34 79 -34 c98 0 152 12 203 39c32 17 56 45 94 98l16 -8l-62 -162h-507v16c56 10 65 16 81 74l123 442c6 20 11 52 11 64c0 27 -15 35 -77 41v16h497Z"></path></defs><g stroke="black" fill="black" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><use xlink:href="#STIXWEBMAINI-62"></use><use xlink:href="#STIXWEBMAINI-70" x="505" y="0"></use><use xlink:href="#STIXWEBMAINI-6D" x="1014" y="0"></use><use xlink:href="#STIXWEBMAIN-3D" x="2018" y="0"></use><g transform="translate(3106,0)"><rect stroke="none" width="10176" height="60" x="0" y="220"></rect><g transform="translate(1640,676)"><use xlink:href="#STIXWEBMAIN-31"></use><use xlink:href="#STIXWEBMAIN-30" x="505" y="0"></use><use xlink:href="#STIXWEBMAIN-30" x="1010" y="0"></use><use xlink:href="#STIXWEBMAIN-30" x="1515" y="0"></use><use xlink:href="#STIXWEBMAIN-D7" x="2242" y="0"></use><use xlink:href="#STIXWEBMAINI-4D" x="3109" y="0"></use><use xlink:href="#STIXWEBMAINI-49" x="3986" y="0"></use><use xlink:href="#STIXWEBMAINI-4E" x="4375" y="0"></use><use xlink:href="#STIXWEBMAIN-5F" x="5107" y="0"></use><use xlink:href="#STIXWEBMAINI-55" x="5612" y="0"></use><use xlink:href="#STIXWEBMAINI-53" x="6382" y="0"></use></g><g transform="translate(60,-686)"><use xlink:href="#STIXWEBMAINI-62"></use><use xlink:href="#STIXWEBMAINI-74" x="505" y="0"></use><use xlink:href="#STIXWEBMAINI-6E" x="806" y="0"></use><use xlink:href="#STIXWEBMAIN-5F" x="1311" y="0"></use><use xlink:href="#STIXWEBMAINI-70" x="1816" y="0"></use><use xlink:href="#STIXWEBMAINI-65" x="2325" y="0"></use><use xlink:href="#STIXWEBMAINI-72" x="2774" y="0"></use><use xlink:href="#STIXWEBMAIN-5F" x="3191" y="0"></use><use xlink:href="#STIXWEBMAINI-69" x="3696" y="0"></use><use xlink:href="#STIXWEBMAIN-D7" x="4201" y="0"></use><use xlink:href="#STIXWEBMAINI-54" x="5068" y="0"></use><use xlink:href="#STIXWEBMAINI-50" x="5706" y="0"></use><use xlink:href="#STIXWEBMAIN-5F" x="6322" y="0"></use><use xlink:href="#STIXWEBMAINI-43" x="6827" y="0"></use><use xlink:href="#STIXWEBMAINI-59" x="7521" y="0"></use><use xlink:href="#STIXWEBMAINI-43" x="8159" y="0"></use><use xlink:href="#STIXWEBMAINI-4C" x="8853" y="0"></use><use xlink:href="#STIXWEBMAINI-45" x="9417" y="0"></use></g></g></g></svg> <p>Pour éviter d’avoir à utiliser les blocs multiplieurs dédiés de l’ECP5 et rester « portable » nous allons poser cette division comme on le ferait à la main.</p> <p>Pour ce faire, on va mettre le dividende dans un registre nommé <code>remainder</code> (pour le reste) :</p> <pre><code class="VHDL"><span class="n">remainder</span> <span class="o">&lt;=</span> <span class="kt">std_logic_vector</span><span class="p">(</span><span class="n">to_unsigned</span><span class="p">((</span><span class="n">MIN_US</span> <span class="o">/</span> <span class="n">TP_CYCLE</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">,</span> <span class="n">remainder</span><span class="na">'length</span><span class="p">));</span></code></pre> <p>Et le diviseur dans un registre <code>divisor</code>:</p> <pre><code class="VHDL"><span class="k">if</span> <span class="n">to_integer</span><span class="p">(</span><span class="kt">unsigned</span><span class="p">(</span><span class="n">btn_per_i</span><span class="p">))</span> <span class="o">&lt;</span> <span class="n">BTN_PER_MIN</span> <span class="k">then</span> <span class="n">divisor</span> <span class="o">&lt;=</span> <span class="kt">std_logic_vector</span><span class="p">(</span><span class="n">to_unsigned</span><span class="p">(</span><span class="n">BTN_PER_MIN</span><span class="p">,</span> <span class="n">BTN_PER_SIZE</span><span class="p">))</span> <span class="o">&amp;</span> <span class="n">ZEROS</span><span class="p">(</span><span class="n">DIVIDENTWIDTH</span><span class="o">-</span><span class="mi">1</span> <span class="k">downto</span> <span class="mi">0</span><span class="p">);</span> <span class="k">else</span> <span class="n">divisor</span> <span class="o">&lt;=</span> <span class="n">btn_per_i</span> <span class="o">&amp;</span> <span class="n">ZEROS</span><span class="p">(</span><span class="n">DIVIDENTWIDTH</span><span class="o">-</span><span class="mi">1</span> <span class="k">downto</span> <span class="mi">0</span><span class="p">);</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span></code></pre> <p>Notez la la valeur minimum de <code>btn_per_i</code> qui nous évitera les problèmes de division par 0 ainsi que des valeurs de bpm trop élevées.</p> <p>La division est cadencée par une machine à états de 3 états :</p> <pre><code class="VHDL"><span class="k">type</span> <span class="n">t_state</span> <span class="k">is</span> <span class="p">(</span><span class="n">s_init</span><span class="p">,</span> <span class="n">s_compute</span><span class="p">,</span> <span class="n">s_result</span><span class="p">);</span> <span class="k">signal</span> <span class="n">state_reg</span> <span class="o">:</span> <span class="n">t_state</span><span class="p">;</span></code></pre> <p>Un état initial pour démarrer, un état de calcul et un état durant lequel la valeur de sortie est considérée comme bonne.</p> <p>L’algorithme de division consiste en une série de décalage à droite du diviseur :</p> <pre><code class="VHDL"><span class="n">divisor</span> <span class="o">&lt;=</span> <span class="s">"0"</span> <span class="o">&amp;</span> <span class="n">divisor</span><span class="p">(</span><span class="n">REGWIDTH</span><span class="o">-</span><span class="mi">1</span> <span class="k">downto</span> <span class="mi">1</span><span class="p">);</span></code></pre> <p>Et de décalages à gauche du quotient :</p> <pre><code class="VHDL"><span class="k">if</span> <span class="p">(</span><span class="kt">unsigned</span><span class="p">(</span><span class="n">divisor</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="kt">unsigned</span><span class="p">(</span><span class="n">remainder</span><span class="p">))</span> <span class="k">then</span> <span class="n">remainder</span> <span class="o">&lt;=</span> <span class="kt">std_logic_vector</span><span class="p">(</span><span class="kt">unsigned</span><span class="p">(</span><span class="n">remainder</span><span class="p">)</span> <span class="o">-</span> <span class="kt">unsigned</span><span class="p">(</span><span class="n">divisor</span><span class="p">));</span> <span class="n">quotient</span> <span class="o">&lt;=</span> <span class="n">quotient</span><span class="p">(</span><span class="n">REGWIDTH</span><span class="o">-</span><span class="mi">2</span> <span class="k">downto</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&amp;</span> <span class="s">"1"</span><span class="p">;</span> <span class="k">else</span> <span class="n">quotient</span> <span class="o">&lt;=</span> <span class="n">quotient</span><span class="p">(</span><span class="n">REGWIDTH</span><span class="o">-</span><span class="mi">2</span> <span class="k">downto</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&amp;</span> <span class="s">"0"</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span></code></pre> <p>Avec ajout d’un '1' ou d’un '0' en fonction de la valeur du diviseur et du reste. Lorsque le reste est supérieur au diviseur, on le soustrait du diviseur et on ajoute un bit '1' au moment du décalage du quotient. Sinon on ajoute le bit '0' sans toucher au registre de reste (<code>remainder</code>).</p> <p>Les registres <code>remainder</code>, <code>divisor</code> et <code>quotient</code> sont des <code>std_logic_vector</code> qui ne représente rien d’autre qu’un « paquet de bits » pour le langage. Si l’on souhaite effectuer des opérations de comparaison ou des additions soustraction dessus il faut donc dire au VHDL que ses bits représentent un nombre (ici non signé) en les « castant » avec <code>unsigned()</code>. Et si l’on souhaite assigner le résultat à un <code>std_logic_vector</code> il faut « caster » à nouveau avec <code>std_logic_vector</code>. Ces multiples conversion de type peuvent vite devenir un casse-tête quand on fait du VHDL.</p> <p>L’esperluette <code>&amp;</code> est ici un opérateur de concaténation de deux vecteurs <code>std_logic_vector</code>.</p> <p>Le résultat de la division est donné en continu par les bits de poids faible du registre <code>divisor</code> :</p> <pre><code class="VHDL"><span class="n">bpm_o</span> <span class="o">&lt;=</span> <span class="n">quotient</span><span class="p">(</span><span class="n">BPM_SIZE</span><span class="o">-</span><span class="mi">1</span> <span class="k">downto</span> <span class="mi">0</span><span class="p">);</span> <span class="n">bpm_valid</span> <span class="o">&lt;=</span> <span class="sc">'1'</span> <span class="k">when</span> <span class="n">state_reg</span> <span class="o">=</span> <span class="n">s_result</span> <span class="k">else</span> <span class="sc">'0'</span><span class="p">;</span></code></pre> <p><code>bpm_o</code> est considéré comme valide lorsque l’état de la machine à états est <code>s_result</code>.</p> <h3 id="toc-sortie-affichage-en-rapport-cyclique--pwmgen">Sortie «affichage» en rapport cyclique : <a href="https://github.com/Martoni/TapTempoASIC/blob/master/hdl/vhdl/pwmgen.vhd">pwmgen</a> </h3> <p>La sortie « d’affichage » de la valeur consiste à générer un signal périodique <code>pwm_o</code> dont le rapport cyclique est proportionnel à la valeur de <code>bpm_o</code>.</p> <p>On va pour cela compter de 0 à BPM_MAX :</p> <pre><code class="VHDL"><span class="c1">-- count</span> <span class="nc">count_p</span><span class="o">:</span> <span class="k">process</span> <span class="p">(</span><span class="n">clk_i</span><span class="p">,</span> <span class="n">rst_i</span><span class="p">)</span> <span class="k">begin</span> <span class="k">if</span> <span class="n">rst_i</span> <span class="o">=</span> <span class="sc">'1'</span> <span class="k">then</span> <span class="n">count</span> <span class="o">&lt;=</span> <span class="n">BPM_MAX</span><span class="p">;</span> <span class="k">elsif</span> <span class="n">rising_edge</span><span class="p">(</span><span class="n">clk_i</span><span class="p">)</span> <span class="k">then</span> <span class="k">if</span> <span class="n">tp_i</span> <span class="o">=</span> <span class="sc">'1'</span> <span class="k">then</span> <span class="k">if</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">then</span> <span class="n">count</span> <span class="o">&lt;=</span> <span class="n">BPM_MAX</span><span class="p">;</span> <span class="k">else</span> <span class="n">count</span> <span class="o">&lt;=</span> <span class="n">count</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span> <span class="p">;</span> <span class="k">end</span> <span class="k">if</span> <span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span> <span class="k">end</span> <span class="k">process</span> <span class="nc">count_p</span><span class="p">;</span></code></pre> <p>Tant que la valeur du compteur se trouvera en dessous d’un seuil <code>pwmthreshold</code> elle sera à '1', une fois le seuil dépassé elle passera à '0':</p> <pre><code class="VHDL"><span class="c1">-- pwm output</span> <span class="n">pwm_o</span> <span class="o">&lt;=</span> <span class="sc">'1'</span> <span class="k">when</span> <span class="p">(</span><span class="n">count</span> <span class="o">&lt;</span> <span class="n">pwmthreshold</span><span class="p">)</span> <span class="k">else</span> <span class="sc">'0'</span><span class="p">;</span></code></pre> <p>Ce seuil ne doit pas changer de valeur pendant le comptage, on va donc devoir utiliser un registre intermédiaire <code>bpm_reg</code> pour stocker la valeur de <code>bpm_i</code> d’entrée :</p> <pre><code class="VHDL"><span class="c1">-- Latching bpm_i on bpm_valid</span> <span class="nc">bpm_register_p</span><span class="o">:</span> <span class="k">process</span> <span class="p">(</span><span class="n">clk_i</span><span class="p">,</span> <span class="n">rst_i</span><span class="p">)</span> <span class="k">begin</span> <span class="k">if</span> <span class="n">rst_i</span> <span class="o">=</span> <span class="sc">'1'</span> <span class="k">then</span> <span class="n">bpm_reg</span> <span class="o">&lt;=</span> <span class="n">BPM_RESET</span><span class="p">;</span> <span class="n">pwmthreshold</span> <span class="o">&lt;=</span> <span class="n">BPM_RESET</span><span class="p">;</span> <span class="k">elsif</span> <span class="n">rising_edge</span><span class="p">(</span><span class="n">clk_i</span><span class="p">)</span> <span class="k">then</span> <span class="k">if</span> <span class="n">bpm_valid</span> <span class="o">=</span> <span class="sc">'1'</span> <span class="k">then</span> <span class="n">bpm_reg</span> <span class="o">&lt;=</span> <span class="n">to_integer</span><span class="p">(</span><span class="kt">unsigned</span><span class="p">(</span><span class="n">bpm_i</span><span class="p">));</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">count</span> <span class="o">=</span> <span class="n">BPM_MAX</span><span class="p">)</span> <span class="k">then</span> <span class="n">pwmthreshold</span> <span class="o">&lt;=</span> <span class="n">bpm_reg</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span> <span class="k">end</span> <span class="k">if</span><span class="p">;</span> <span class="k">end</span> <span class="k">process</span> <span class="nc">bpm_register_p</span><span class="p">;</span></code></pre> <p>Notez, à nouveau, la conversion d’un <code>std_logic_vector</code> (<code>bpm_i</code>) vers un entier naturel (<code>bpm_reg</code>) par le double « cast » <code>to_integer(unsigned())</code></p> <h2 id="toc-synthèse-placement-routage-et-configuration">Synthèse, placement-routage et configuration</h2> <p>Nous voici arrivé à la véritable information de cette dépêche : <strong>il est désormais possible de faire de la synthèse VHDL avec un logiciel libre</strong>.<br> Le VHDL est le langage avec lequel les étudiants français abordent le monde du FPGA en général. Je l’ai personnellement beaucoup pratiqué en utilisant ghdl pour la simulation et gtkwave pour visualiser les chronogrammes. Mais jusqu’à cette année, j’ai toujours dû passer sur les monstres propriétaires fournis gratuitement par les fabricants de FPGA pour la partie synthèse. Monstres de plusieurs dizaines de Giga-octets à télécharger, souvent précompilé pour une architecture 32 ou 64 bits mais pas les deux, incluant des machines virtuelles java et autres librairies graphique bugués quand on change la langue du système (coucou le <a href="https://forums.xilinx.com/t5/Memory-Interfaces-and-NoC/MIG-missing-input-clock-option/m-p/746423/highlight/true#M10242">MIG de Vivado</a>). Quand ils ne sont tout simplement pas compatibles Linux (de plus en plus rare cependant). Bref, la synthèse VHDL n’était pas une sinécure.</p> <p>La simulation n’était pas en reste non plus, car si GHDL fonctionnait plutôt bien, il n’était pas des plus rapides à l’époque. Et impossible de faire de la simulation mixte en mélangeant du VHDL et du Verilog.</p> <p>Impossible également d’utiliser la formule 1 de la simulation qu’est <a href="https://www.veripool.org/wiki/verilator">Verilator</a>, un simulateur un peu spécial qui converti son design en un objet C++, le testbench étant ensuite écrit comme du C++ «normal». Le rapport de performance est d’au moins <a href="http://www.fabienm.eu/flf/icarus-vs-verilator/">100 fois plus rapide</a>.</p> <p>Pour être honnête, signalons qu’il existe bien le logiciel français <a href="http://coriolis.lip6.fr/">Alliance</a>, mais c’est très orienté <a href="https://fr.wikipedia.org/wiki/Application-specific_integrated_circuit">ASIC</a>, et je n’ai jamais réussi à le faire fonctionner correctement. Peut-être que si des développeurs d’Alliance traînent sur LinuxFR, ils pourront nous en parler.</p> <p>Bref, la lumière est arrivée cette année avec le développement du greffon <a href="https://github.com/ghdl/ghdl-yosys-plugin">ghdl pour yosys</a> ainsi que les avancées à toute vapeur de la partie «synthèse» de <a href="https://github.com/ghdl/ghdl">ghdl</a>. Comme nous allons le voir dans la section suivante.</p> <h3 id="toc-ghdl--yosys-la-lune-de-miel">GHDL + Yosys, la lune de miel</h3> <p>Pour pouvoir synthétiser TapTempo il va falloir compiler et installer les trois projet suivant :</p> <ul> <li>GHDL : Le logiciel de simulation ainsi que de synthèse (ne pas oublier d’option de synthèse dans la configuration avant compilation) ;</li> <li>Yosys : le logiciel de synthèse Verilog, véritable couteau suisse pour le FPGA et plus si affinité ;</li> <li>ghdl-yosys-plugin : le greffon qui permet de compiler une librairie <code>ghdl.so</code> à copier dans le répertoire <code>YOSYS_PREFIX/share/yosys/plugins/</code> de yosys.</li> </ul> <p>Il est fortement conseillé de prendre les dernières versions du code des projets ci-dessus et de les compiler « à la main » car ces projets avancent vite et bougent beaucoup, les paquets des différentes distributions linux sont déjà largement obsolètes.</p> <p>Une fois installé on peut lancer yosys avec le greffon ghdl comme ceci :</p> <pre><code class="shell">$ yosys -m ghdl <span class="o">[</span>...<span class="o">]</span> Yosys <span class="m">0</span>.9+3686 <span class="o">(</span>git sha1 bc085761, clang <span class="m">8</span>.0.0-svn345496-1~exp1+0~20181029105533.852~1.gbpf10f36 -fPIC -Os<span class="o">)</span> yosys&gt;</code></pre> <p>Puis charger nos sources VHDL avec la commande ghdl, en précisant bien le nom du « top » que l’on souhaite élaborer avec l’option <code>-e</code>.</p> <pre><code class="shell">yosys&gt; ghdl --std<span class="o">=</span><span class="m">08</span> debounce.vhd per2bpm.vhd percount.vhd pwmgen.vhd rstgen.vhd taptempo_pkg.vhd taptempo.vhd timepulse.vhd -e taptempo <span class="m">1</span>. Executing GHDL. Importing module taptempo. Importing module rstgen. Importing module timepulse. Importing module debounce. Importing module percount. Importing module per2bpm. Importing module pwmgen_250.</code></pre> <p>Et c’est tout ! Maintenant on peut reprendre les commandes et la procédure que l’on avait utilisée dans le cas de <a href="//linuxfr.org/news/taptempo-en-verilog#toc-synth%C3%A8se-sur-colorlight">TapTempo en Verilog pour faire la synthèse</a>, le placement routage et le chargement.</p> <p>Notez que comme les sources ont été chargées et parsé dans yosys, il est parfaitement possible de le convertir en Verilog grâce à la commande <code>write_verilog</code>:</p> <pre><code>yosys&gt; write_verilog taptempo_converted.v 2. Executing Verilog backend. Dumping module `\debounce'. Dumping module `\per2bpm'. Dumping module `\percount'. Dumping module `\pwmgen_250'. Dumping module `\rstgen'. Dumping module `\taptempo'. Dumping module `\timepulse'. </code></pre> <p>La version Verilog ainsi générée pourra être simulée avec verilator ou icarus par exemple pour faire de la simulation mixte, ou tout simplement pour accélérer la simulation dans le cas de verilator.</p> <p>Pour synthétiser sur la colorlight qui est munie d’un FPGA ECP5 de chez Lattice, on utilisera la commande synth_ecp5 avec une sortie netlist au format json.</p> <pre><code>yosys&gt; synth_ecp5 -json taptempo.json [...] === taptempo === Number of wires: 540 Number of wire bits: 1515 Number of public wires: 540 Number of public wire bits: 1515 Number of memories: 0 Number of memory bits: 0 Number of processes: 0 Number of cells: 785 CCU2C 109 L6MUX21 9 LUT4 452 PFUMX 25 TRELLIS_FF 190 2.50. Executing CHECK pass (checking for obvious problems). Checking module taptempo... Found and reported 0 problems. 2.51. Executing JSON backend. </code></pre> <p>Arrivé à cette étape il peut être intéressant de comparer avec la version Verilog les ressources utilisées par le même projet :</p> <pre><code>$ yosys yosys&gt; read_verilog debounce.v per2bpm.v percount.v pwmgen.v rstgen.v taptempo.v timepulse.v yosys&gt; synth_ecp5 -json taptempo.json ... === taptempo === Number of wires: 487 Number of wire bits: 1435 Number of public wires: 487 Number of public wire bits: 1435 Number of memories: 0 Number of memory bits: 0 Number of processes: 0 Number of cells: 751 CCU2C 105 L6MUX21 1 LUT4 441 PFUMX 13 TRELLIS_FF 191 8.50. Executing CHECK pass (checking for obvious problems). Checking module taptempo... Found and reported 0 problems. 8.51. Executing JSON backend. </code></pre> <p>Nous obtenons un design légèrement plus petit avec la version Verilog, mais les ordres de grandeurs sont tout de même respecté.</p> <h3 id="toc-placement-routage-avec-nextpnr">Placement routage avec NextPnR</h3> <p><a href="https://github.com/YosysHQ/nextpnr">NextPnR</a> est un logiciel de placement routage qui prend le schéma (<a href="https://fr.wikipedia.org/wiki/Netlist">netlist</a>) de cellules «primitives» généré par le logiciel de synthèse et associe chaque cellule à une cellule disponible dans le FPGA. NextPnR effectue également le routage qui consiste à établir les connexions entre les différentes cellules.</p> <p>C’est également à cette étape que l’on va préciser la configuration du FPGA (taille, IO…). En plus du fichier <em>json</em> de synthèse nous donnerons un second fichier de configuration des IO nommé <code>taptempo.lpf</code> décrivant nos trois signaux d’entrées-sortie :</p> <pre><code>LOCATE COMP "clk_i" SITE "P6"; IOBUF PORT "clk_i" IO_TYPE=LVCMOS33; FREQUENCY PORT "clk_i" 25 MHZ; LOCATE COMP "btn_i" SITE "M13"; IOBUF PORT "btn_i" IO_TYPE=LVCMOS33; LOCATE COMP "pwm_o" SITE "P4"; IOBUF PORT "pwm_o" IO_TYPE=LVCMOS33; </code></pre> <p>Toutes les commandes de synthèse données ici sont bien évidemment disponibles dans un <a href="https://github.com/Martoni/TapTempoASIC/blob/master/synthesis/colorlight_vhdl/Makefile">Makefile</a> sur le dépot. Pour faire le placement routage nous pourrions taper la commande suivante :</p> <pre><code>$ nextpnr-ecp5 --25k --package CABGA256 --speed 6 --json taptempo.json --textcfg taptempo_out.config --lpf taptempo.lpf --freq 25 </code></pre> <p>Qui ne donnera <strong>pas</strong> le fichier de configuration nommé <strong>bitstream</strong> permettant de configurer le FPGA !</p> <p>Car les spécifications des FPGA sont gardées jalousement par les constructeurs, et il faut des heures et des heures d’ingénieries inverses pour venir à bout de ces informations. Travail qui a été effectué via le projet <a href="https://github.com/SymbiFlow/prjtrellis">Trellis</a> et qui nous permet de convertir la sortie texte précédente <code>taptempo_out.config</code> en un bitstream reconnu par l’EPC5 :</p> <pre><code>$ ecppack taptempo_out.config taptempo.bit </code></pre> <p>Et l’on décroche enfin le Saint Grââl permettant de configurer la colorlight : le bitstream <code>taptempo.bit</code>.</p> <h3 id="toc-en-avant-la-musique-avec-openfpgaloader">En avant la musique avec openFPGALoader</h3> <p>Arrivé à cette étape il serait vraiment dommage d’être contraint de relancer l’ide proprio du constructeur juste pour télécharger le bitstream dans le FPGA via une sonde USB-Jtag !</p> <p>C’est là que l’on peut dégainer le projet <a href="https://github.com/trabucayre/openFPGALoader">openFPGALoader</a> qui a pour ambition de permettre la configuration de tous les FPGA existant avec toutes les sondes disponibles sur le marché.</p> <pre><code>$ openFPGALoader taptempo.bit Open file taptempo.bit DONE Parse file DONE Enable configuration: DONE SRAM erase: DONE Loading: [==================================================] 100.000000% Done Disable configuration: DONE </code></pre> <p>Et voila, on peut maintenant taper taper taper <a href="https://www.youtube.com/watch?v=heLm9gSVSTc">jusqu’au bout de la nuit</a>.</p> <h2 id="toc-conclusion">Conclusion</h2> <p>Le VHDL est très verbeux, les évolutions du langage ont tenté de corriger un peu le tir mais cela reste tout de même verbeux. Certaine caractéristiques comme l’insensibilité à la casse font un peu penser à un langage d’un autre âge. Cependant, l’héritage du langage Ada fait de VHDL un langage très strict et déterministe de part sa conception contrairement au <a href="https://insights.sigasi.com/opinion/jan/verilogs-major-flaw/">Verilog</a>.</p> <p>Le typage fort peut-être considéré à première vu comme un défaut ralentissant l’écriture du code. Mais il n’en est rien, après avoir souffert de « compiler » votre porte-gramme pour la simulation, vous aurez l’agréable surprise de voir votre système fonctionner parfaitement sur le FPGA du (presque) premier coup.</p> <p>Le vocabulaire VHDL est très vaste et on se contente en général des structures de code connue dont on sait qu’elles « synthétiseront » correctement, ce qui donne une impression de ne jamais pouvoir atteindre la maîtrise du langage.</p> <p>Il y a quelques années je m’étais <a href="//linuxfr.org/users/martoni/journaux/le-vhdl-prend-il-l-eau">posé la question</a> de la popularité du VHDL par rapport au Verilog. En effet, même si le VHDL est presque aussi bien supporté que le Verilog par les outils des constructeurs, ça n’était pas le cas des logiciels libres. C’est encore largement le cas aujourd’hui, même certain logiciels non libre supportent en priorité le Verilog. Le constructeur Gowin par exemple ne permettait que la synthèse Verilog avec son outil maison. Il fallait installer le logiciel tier <a href="https://www.synopsys.com/implementation-and-signoff/fpga-based-design/synplify-pro.html">synplify</a> de synopsis pour pouvoir accéder à la synthèse VHDL.</p> <p>Cette extension de ghdl pour Yosys change la donne. Car, comme nous l’avons vu, il est possible de l’utiliser pour convertir son projet en Verilog et avoir accès à tous l’écosystème libre Verilog. Il est également possible de faire de la <a href="http://pepijndevos.nl/2019/08/15/open-source-formal-verification-in-vhdl.html">vérification formelle pour le VHDL</a>. </p> <p>Avoir la compétence VHDL dans son CV est une assez bonne idée car c’est souvent par ce mot que l’on résume le développement ASIC/FPGA/SoC. En Europe, le VHDL est très apprécié de l’industrie et particulièrement de l’industrie de défense.</p> <p>Mais si c’est juste pour mesurer le tempo, ce n’est peut-être pas la voie la plus rapide et la plus simple ;)</p> </div><div><a href="https://linuxfr.org/news/portage-de-taptempo-en-vhdl.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/122462/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/portage-de-taptempo-en-vhdl#comments">ouvrir dans le navigateur</a> </p>
    • Li chevron_right

      Kumiko, découpe de bande dessinée et lecture case par case

      njean · pubsub.eckmul.net / linuxfr_news · Thursday, 17 December, 2020 - 11:17 · 2 minutes

    <div><p>Lire une bande dessinée, chouette ! Sur un écran de téléphone, un peu moins.</p> <p><em>Kumiko</em> est un petit outil qui détecte les cases sur une page de bande dessinée, et fournit ces informations à un lecteur « case par case ». Plus besoin de zoomer à la main pour lire les bulles.</p> <p>Vous voulez voir, essayer ?</p> </div><ul><li>lien nᵒ 1 : <a title="https://kumiko.njean.me/demo" hreflang="en" href="https://linuxfr.org/redirect/107526">Site de démo</a></li><li>lien nᵒ 2 : <a title="https://framagit.org/nicooo/kumiko" hreflang="en" href="https://linuxfr.org/redirect/107527">Informations et code source</a></li><li>lien nᵒ 3 : <a title="https://framagit.org/nicooo/kumiko/-/tree/master/tests/images" hreflang="en" href="https://linuxfr.org/redirect/107528">Modèles de pages de BD</a></li></ul><div><p><img src="//img.linuxfr.org/img/68747470733a2f2f6672616d616769742e6f72672f6e69636f6f6f2f6b756d696b6f2f2d2f7261772f6d61737465722f646f632f696d672f786b63642e706e67/xkcd.png" alt="xkcd by Randall Munroe, #208, CC BY-NC 2.5" title="Source : https://framagit.org/nicooo/kumiko/-/raw/master/doc/img/xkcd.png"><a href="https://xkcd.com/208/">xkcd</a> par Randall Munroe, #208, CC BY‑NC 2.5</p> <p>Des exemples sont proposés sur le <a href="https://kumiko.njean.me/demo">site de démo</a>, essayez de lire <em>xkcd</em> ou <em>Pepper&amp;Carott</em> case par case !</p> <p>Essayez aussi d’envoyer vos propres images pour voir comment <em>Kumiko</em> s’en sort.</p> <p>Le projet, sous licence AGPL, est codé en Python et fait bon usage de la bibliothèque de reconnaissance d’images <a href="https://opencv.org/">OpenCV</a>, pour l’instant principalement pour la détection de contours. Le lecteur case par case est basé sur du JavaScript dans le navigateur.</p> <p>Au fur et à mesure, des <a href="https://framagit.org/nicooo/kumiko/-/tree/master/tests/images">modèles de pages existants</a> sont ajoutés pour servir de tests de non‑régression. <em>Kumiko</em> pourra ainsi découper proprement toujours plus de cases.</p> <p>Au plaisir de vos retours sur ce projet !</p> </div><div><a href="https://linuxfr.org/news/kumiko-decoupe-de-bande-dessinee-et-lecture-case-par-case.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/122594/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/kumiko-decoupe-de-bande-dessinee-et-lecture-case-par-case#comments">ouvrir dans le navigateur</a> </p>
    • Li chevron_right

      Revue de presse — décembre 2020

      Florent Zara · pubsub.eckmul.net / linuxfr_news · Thursday, 17 December, 2020 - 09:44 · 5 minutes

    <div><p><strong>Déconfinés</strong> en France et c'est aussi le cas de GNU/Linux Magazine France qui qui sort son numéro de décembre. Beaucoup de magazines sortis en novembre sont encore disponibles. Voici donc un petit tour subjectif et parti{e,a}l des sorties de la presse papier qui sont disponibles dans vos kiosques à journaux préférés (et nous continuons à vous inciter à les faire vivre si vous le pouvez).</p> <p><img src="//img.linuxfr.org/img/68747470733a2f2f75706c6f61642e77696b696d656469612e6f72672f77696b6970656469612f636f6d6d6f6e732f7468756d622f632f63622f4a6f75726e616c2e7376672f33323070782d4a6f75726e616c2e7376672e706e67/320px-Journal.svg.png" alt="Image une de Journal" title="Source : https://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Journal.svg/320px-Journal.svg.png"></p> <p>Sans plus attendre, en décembre 2020, <strong><em>GNU/Linux Magazine France</em></strong> n<sup>o</sup> 243 vous incite à utiliser l'<a href="https://fr.wikipedia.org/wiki/Environnement_de_d%C3%A9veloppement">EDI</a> VSCode.</p> <p>Et toujours disponibles :</p> <ul> <li> <strong><em>Linux Pratique</em></strong> n<sup>o</sup> 122 découvre le pare‑feu NFTables ;</li> <li> <strong><em>MISC</em></strong> magazine n<sup>o</sup> 112 consacre son dossier à la sécurité de l’orchestrateur Kubernetes ;</li> <li> <strong><em>GNU/Linux Magazine</em> hors‑série</strong> n<sup>o</sup> 111 ou comment bien déboguer ;</li> <li> <strong><em>Linux Pratique</em> hors‑série</strong> n<sup>o</sup> 48 sécurise les serveurs et le réseau local ;</li> <li> <strong><em>Linux Identity</em></strong> n<sup>o</sup> 25 fait le tour des distributions de nouvelle génération.</li> <li>Le numéro double du <strong>Virus Informatique</strong> 44 et 45 avec sa contre‑enquête sur le dossier Quantic Dream notamment ;</li> <li> <strong><em>Planète Linux</em></strong> n<sup>o</sup> 117 qui fait le tour des environnements de bureau libres (jusque fin novembre) ;</li> <li> <strong><em>Hackable</em></strong> n<sup>o</sup> 35 qui veut vous initier aux FPGA sans bourse délier (jusque fin décembre) ;</li> <li> <strong><em>MISC</em> hors‑série</strong> magazine n<sup>o</sup> 22 qui consacre son dossier au vaste sujet de la sécurité système (jusque fin novembre).</li> </ul> <p>Tour d’horizon plus détaillé dans la suite de cette dépêche.</p> </div><ul><li>lien nᵒ 1 : <a title="https://connect.ed-diamond.com/" hreflang="fr" href="https://linuxfr.org/redirect/107410">Éditions Diamond (Linux Magazine, Linux Pratique, Hackable)</a></li><li>lien nᵒ 2 : <a title="http://www.dppresse.com/posts/pl117/" hreflang="fr" href="https://linuxfr.org/redirect/107411">DP Presse (Planète Linux)</a></li><li>lien nᵒ 3 : <a title="http://www.acbm.com/" hreflang="fr" href="https://linuxfr.org/redirect/107412">ACBM (Le Virus Informatique)</a></li><li>lien nᵒ 4 : <a title="https://linuxidentity.com/" hreflang="fr" href="https://linuxfr.org/redirect/107413">Linux Identity</a></li><li>lien nᵒ 5 : <a title="https://linuxfr.org/news/revue-de-presse-novembre-2020" hreflang="fr" href="https://linuxfr.org/redirect/107414">Revue de presse précédente (novembre 2020)</a></li></ul><div><h2 id="toc-les-sommaires-du-numéro-de-décembre2020">Les sommaires du numéro de décembre 2020</h2> <table> <thead> <tr> <th><img src="//img.linuxfr.org/img/68747470733a2f2f626f7574697175652e65642d6469616d6f6e642e636f6d2f31333439352d746869636b626f785f64656661756c742f676e756c696e75782d6d6167617a696e652d3234332e6a7067/gnulinux-magazine-243.jpg" alt="Mosaïque des couvertures GLMF 243" title="Source : https://boutique.ed-diamond.com/13495-thickbox_default/gnulinux-magazine-243.jpg"></th> <th></th> <th></th> <th></th> </tr> </thead> <tbody> <tr> <td></td> <td></td> <td></td> <td></td> </tr> </tbody> </table> <h3 id="toc-gnulinuxmagazine-numéro243"><a href="https://connect.ed-diamond.com/GNU-Linux-Magazine/GLMF-243">GNU/Linux Magazine numéro 243</a></h3> <p>Au sommaire de ce numéro de décembre 2020 :</p> <ul> <li>Utiliser Visual Studio Code pour coder en Python (situé dans la section « Actus &amp; Humeur » !) ;</li> <li>Implémentation du calcul symbolique et de la dérivation en Java ;</li> <li>Principes de l’orienté objet en C++ : héritage et polymorphisme ;</li> <li>Les structures de données des namespaces dans le noyau ;</li> <li>Créer un Custom Resource Controller pour Kubernetes ;</li> <li>Générez la documentation technique de vos projets Godot ;</li> <li>Déboguez vos codes PHP.</li> </ul> </div><div><a href="https://linuxfr.org/news/revue-de-presse-decembre-2020.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/122410/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/revue-de-presse-decembre-2020#comments">ouvrir dans le navigateur</a> </p>
    • Li chevron_right

      Sortie de PrestaShop 1.7.7.0

      Mathieu Ferment · pubsub.eckmul.net / linuxfr_news · Thursday, 17 December, 2020 - 08:44 · 2 minutes

    <div><p>Après presque un an de développement, PrestaShop vient de sortir la version 1.7.7 de son système de gestion de contenu (CMS) de commerce en ligne.</p> <p><img src="//img.linuxfr.org/img/68747470733a2f2f6173736574732e70726573746173686f70322e636f6d2f73697465732f64656661756c742f66696c65732f696d675f72696768745f6865616465725f6f7074696d697a65645f315f355f312e706e67/img_right_header_optimized_1_5_1.png" alt="Créer une boutique en ligne" title="Source : https://assets.prestashop2.com/sites/default/files/img_right_header_optimized_1_5_1.png"></p> <p>Cette version est principalement tournée vers des améliorations pour les utilisateurs marchands ; les pages du Back Office dédiées à l’administration des commandes ont été refaites entièrement et repensées pour faciliter la tâche au marchand.</p> <p>D’autres fonctionnalités ont été également livrées : la création/gestion de devises non officielles, une recherche textuelle plus intelligente… ainsi qu’un gros lot de corrections de bogues (160) et la compatibilité avec <a href="https://fr.wikipedia.org/wiki/PHP">PHP</a> 7.3 (il était temps !).</p> <p>La liste complète des nouveautés est disponible dans les <a href="https://build.prestashop.com/news/prestashop-1-7-7-0-available/">notes de publication</a> (en anglais).</p> <p>La communauté PrestaShop est très active, aussi bien sur le dépôt <a href="https://github.com/PrestaShop/PrestaShop/">GitHub</a>, qui sert également au suivi des bogues, que sur le <a href="https://www.prestashop.com/forums/">forum</a> ou le channel <a href="https://github.com/PrestaShop/open-source/blob/master/slack/readme.md">Slack</a>.<br> N’hésitez pas à venir échanger avec nos communautés de marchands ou de développeurs !</p> </div><ul><li>lien nᵒ 1 : <a title="https://www.prestashop.com/fr" hreflang="fr" href="https://linuxfr.org/redirect/107523">PrestaShop</a></li><li>lien nᵒ 2 : <a title="https://build.prestashop.com/news/prestashop-1-7-7-0-available/" hreflang="en" href="https://linuxfr.org/redirect/107524">Notes de publication de la version 1.7.7.0</a></li><li>lien nᵒ 3 : <a title="https://www.prestashop.com/fr/telecharger" hreflang="fr" href="https://linuxfr.org/redirect/107525">Téléchargement</a></li></ul><div></div><div><a href="https://linuxfr.org/news/sortie-de-prestashop-1-7-7-0.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/122593/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/sortie-de-prestashop-1-7-7-0#comments">ouvrir dans le navigateur</a> </p>