{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Logique combinatoire - PLD - CORRECTION" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ressources** : \n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "**Sommaire**\n", "
\n",
" La figure ci-contre représente le boîtier DIP (Dual In Package) à 14 broches d’un circuit intégré de type SSI (Small Scale Integration) contenant quatre portes ET à deux entrées. Ces composants étaient soudés et interconnectés par des pistes de cuivre sur un circuit imprimé.\n", " | \n",
" \n", " \n", " | \n", "
\n", " \n", " | \n", "\n",
" On dispose aujourd’hui de circuits logiques programmables (Programmable Logic Devices) capables, selon leur complexité, de remplacer quelques dizaines à plusieurs centaines de milliers de circuits logiques \"classiques\". Le mot \"programmable\" ne signifie pas que le circuit exécute un programme, mais que les opérateurs logiques qu'il contient sont interconnectés à l'aide d'un programme ! Si la fonction réalisée ne correspond pas à celle attendue ou si on souhaite la faire évoluer, le composant pourra être \"effacé\" et reprogrammé. Pour en savoir plus. \n", " Un circuit logique programmable renferme un grand nombre d’opérateurs logiques combinatoires (ET, OU, NON, etc.) et séquentiels (bascules). Ce type de composant est utilisé lors de la conception ou lors de la réorganisation d’un produit nécessitant la mise en œuvre d’un grand nombre d’opérateurs logiques, car il améliore la fiabilité du produit, diminue son coût de fabrication et lui confère une certaine évolutivité. Wikipédia.\n", " | \n",
"
\n",
" On assure l’interconnexion des opérateurs logiques avec un outil de programmation (ordinateur + logiciel). \n", " Lorsque la fonction à intégrer dans le PLD est combinatoire et suffisamment simple, il suffit d'écrire les équations logiques booléennes de ses sorties avec le logiciel de programmation \n", " | \n",
" \n", " \n", " | \n", "
\n", " | La \"programmation\" d'un circuit logique programmable est réalisée avec un langage de description matériel ou un outil de saisie graphique. Après compilation de cette description, on obtient un fichier de configuration pour le circuit choisi. VHDL et Verilog sont les deux langages de description les plus répandus. Il existe cependant un outil, migen, basé sur Python qui vise à automatiser davantage le processus de conception. | \n",
"
Dessiné avec Scheme-it.
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Equations de la fonction \"Décodage\"\n", "On limite l'étude à trois des six sorties de la fonction. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> **Activité 1**\n", ">\n", "> Si l'activité n'a pas été préparée en cours, **écrivez** les équations de RAM, ROM et OE sur le **document réponse**. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Correction
\n", "Pour tester une sortie logique combinatoire, il est nécessaire d’écrire 2n vecteurs.
n représente le nombre d’entrées de la fonction.
Correction
\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.B Exemple d'utilisation des vecteurs de test\n", " * **Ressources** : listes, tuples, tests, boucle for... et f-strings en Python.\n", "\n", "Le langage Python dispose des opérateurs logiques **and**, **or** et **not** pour écrire des équations logiques. Les états logiques peuvent être représentés par des 1 et des 0. **0** <=>False, **1** <=> True. \n", "\n", "L'exemple ci-dessous illustre le test d'un opérateur **Ou Exclusif** à 2 entrées." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Exemple introductif\n", "# Code de test d'une fonction XOR\n", "'''\n", "Test d'une porte OU Exclusif à 2 entrées\n", "E1, E2 : entrées\n", "S : sortie (on note Sa la sortie attendue et So est la sortie obtenue !)\n", "'''\n", "Vecteurs_XOR = [(0, 0, 0), (0, 1, 1), (1, 0, 1), (1, 1, 0)] # Une liste de tuples matérialise la table des vecteurs de test\n", "print(\"[E1,E2] -> S \")\n", "for E1, E2, Sa in Vecteurs_XOR:\n", " So = (not(E1) and E2 or E1 and not(E2)) # Equation de la porte OU Exclusif, parenthèses INDISPENSABLES !\n", " if Sa == So: # Remplacer and par or pour simuler des erreurs dans la table\n", " print(f\"[{E1},{E2}] -> {Sa}\") \n", " else:\n", " print(f\"[{E1},{E2}] -> Erreur\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ">**Activité 3. Simulons des erreurs de frappe !**Correction
\n", "a) Une erreur (So=/=Sa) est identifiée dans la table par le mot \"Erreur\"
\n", "b) Lors du test d’un composant réel, les causes erreurs peuvent être :
\n", "