Advanced Boolean Equation Language ABEL Advanced Boolean Equation Language
Généralités ABEL est un langage de programmation de PLD. C’est un langage HDL (Hardware Description Language) moins puissant que VHDL. ABEL: applications de petites et moyennes importances à implémenter dans les PAL,GAL FPGA et CPLD.
Description du Langage module mod_name [ ;] [title string] [ ;] [deviceID device deviceType ;] [declaration] [ ;] pin declarations ; other declarations ; equations [ ;] equations [" commentaires] truth_table (entree –>sortie)[ ;] table de vérité ; state_diagram etat[ ;] diagramme d’état ; [Test_Vectors (entree->sortie)] [ ;] vecteurs de tests ; end mod_name [ ;]
Exemple Half Adder A B SUM CARRY Half Adder module Addition; title 'addition 2 bits' // optionnel, information complémentaire Addition device 'P16H8'; // optionnel, permet de spécifier le type de matériel cible : PAL16P8 " input pins A, B pin 3, 5; // la spécification du numéro de broches est optionnelle " output pins SUM, Carry_out pin 15, 18 istype 'com'; // le compilateur fait la différence entre broches d’entrées et de sortie par le terme istype equations SUM = (A & !B) # (!A & B) ; // génération des sorties en fonction des entrées Carry_out = A & B; end ; Addition
Éléments syntaxiques Module : en règle générale le nom du module a le nom du fichier source *.abl (pour certains compilateurs c’est même obligatoire). Il peut y avoir plusieurs modules dans un source. Title : permet de préciser la fonction du module (optionnel).
Éléments syntaxiques Exemple : Device : optionnel. Cela permet d’associer au module un circuit associé (le module sera implémenter dans le circuit spécifié). Cependant pour garder le module indépendant du circuit (pour pouvoir réutiliser le module dans un autre circuit) il est préférable de ne pas utiliser cette directive. Il sera possible au niveau de la compilation de préciser le PLD cible. Exemple : Mon_decod device 'P16V8'; // cible PAL16V8
déclarations Pin : permet de préciser le nom des entrées et des sorties [!]pin_id pin [pin#] [istype 'attributes'] ; On peut spécifier plusieurs noms sur une seule ligne : [!]pin_id , pin_id, pin_id pin [pin#, [pin#, [pin#]]] [istype 'attributes'];
Exemple : IN1, IN2, A1 pin 2, 3, 4; // entrées avec numéro de broche spécifié OUT1 pin 9 istype 'reg'; // sortie de bascule active à l’état haut ENABLE pin; // entrées dont le numéro de broche n’est pas spécifier (à faire au niveau du compilateur) !Chip_select pin 12 istype 'com'; // sortie combinatoire active à l’état bas. !S0..!S6 pin istype 'com'; // sorties combinatoires actives à l’état bas
déclarations Autres déclarations : Il est possible de préciser des valeurs de constantes , de macros ou d’ensembles : A = 21; C=2*7; ADDR = [1,0,11]; LARGE = B & C; D = [D3, D2, D1, D0]; D = [D3..D0];
Les nombres La représentation des nombres peut être binaire, octale, décimale ou hexadécimale. Si rien n’est précisé, le compilateur adopte la base décimale.
Les opérateurs Les opérateurs logiques :
Les opérateurs Les opérateurs arithmétiques :
Les opérateurs Les opérateurs relationnels : Les opérateurs relationnels donnent des résultats vrais (-1) ou faux (0).
Les opérateurs Les opérateurs d’assignement : 2 types d’opérateurs d’assignement : combinatoire et séquentiel. = pour les opérations de logique combinatoire, dans ce cas le signal prend la valeur donnée sans retard. := pour les opérations de logique séquentielle, dans ce cas le signal prendra la valeur après le prochain front d’horloge.
Les opérateurs Les niveaux de précédence :
Les constantes surtout utilisées dans les vecteurs de tests
Les ensembles Un ensemble est une collection de signaux ou de constantes qui constitue un vecteur. Exemple 1: Signal = [D2,D1,D0];"déclaration de l’ensemble signal Signal = [1,0,1] & [0,1,1]; " résultat de signal égal à [0,0,1] Exemple 2: [A,B] = C & D; // Ce qui est équivalent à : A = C & D; B = C & D;
Les ensembles (suite) [A1,B1] = [D1,D2] & [C3,C2]; Exemple 3: [A1,B1] = [D1,D2] & [C3,C2]; // Ce qui est équivalent à : [A1,B1] = [D1 & C3, D2 & C2]; Exemple 4: X & [A,B,C]; [X&A, X&B, X&C]; 2 & [A,B,C]; //le nombre "2" est d’abord remplace par son //équivalent binaire (0010) . //On obtient alors : [0 & A, 1 & B, 0 & C];
Les ensembles (suite) Exemple 5: Génération du CS pour la sélection des boîtiers de mémoire Chip_Sel = !A7 & A6 & A5; //Cas classique Addr = [A7,A6,A5]; " déclaration d’un ensemble Addr Chip_Sel = Addr == [0,1,1];" même résultat qu’en Chip_Sel = Addr == 3; " décimal 3 est égal à 011.(même résultat qu’en ) Ce principe est très utile pour des variables de 16 bits ou plus.
Les ensembles (suite) Exemple 6 : Génération du CS pour la sélection des boîtiers de mémoire (suite) Addr = [a15..a0]; "déclaration d’un ensemble Addr 16 bits X = .X.; "simplification de la notation de .X. Chip_Sel = Addr == [1,0,1,X,X,X,X,X,X,X,X,X,X,X,X]; Chip_Sel = (Addr >= ^HA000) & (Addr <= ^HBFFF);
Les différentes solutions d’implémentation Combinatoire: Equations Table de vérité Séquentiel Diagramme d’état
Equations utiliser le terme Equations avant de commencer Équations à l’aide des opérateurs Structure « When…Then… Else…. » WHEN condition THEN element=expression; ELSE equation; Ou WHEN condition THEN equation;
Equations Exemples : SUM = (A & !B) # (!A & B) ; A0 := EN & !D1 & D3 & !D7; WHEN (A == B) THEN D1_out = A1; ELSE WHEN (A == C) THEN D1_out = A0; WHEN (A>B) THEN { X1 :=D1; X2 :=D2; }
Les tables de vérité Il existe plusieurs solutions : // table de vérité combinatoire TRUTH_TABLE ( in_ids -> out_ids ) inputs -> outputs ; ou // table de vérité à registre (état suivant actif sur front montant d’horloge) TRUTH_TABLE ( in_ids :> reg_ids ) inputs :> reg_outs ;
Les tables de vérité ou // possibilité en plus de préciser les sorties combinatoires fonctions des états présents TRUTH_TABLE ( in_ids :> reg_ids -> out_ids ) inputs :> reg_outs -> outputs ; avec "->" pour les sorties combinatoires et ":>" pour les sorties de bascules.
Les tables de vérité Les entrées peuvent être des signaux ou des ensembles de signaux. Un signal non spécifié est représenté par la constante ".X.".
Les tables de vérité Exemple 1 combinatoire: half adder (Cf exemple donné page 1 dans l’exemple) TRUTH_TABLE ( [ A, B] -> [SUM, CARRY] ) [ 0, 0 ] -> [0, 0 ] ; [ 0, 1 ] -> [1, 0 ] ; [ 1, 0 ] -> [1, 0 ] ; [ 1, 1 ] -> [1, 1 ] ;
Les tables de vérité En utilisant un ensembles IN = [A,B]; et OUT = [SUM, CARRY]; La table de vérité devient plus simple : TRUTH_TABLE (IN -> OUT ) 0 -> 0; 1 -> 2; 2 -> 2; 3 -> 3;
Les tables de vérité Exemple 2 combinatoire: On désire faire un OU exclusif entre 2 variables avec une entrée d’activation (EN). Cet exemple permet d’illustrer les sorties non spécifiées (.X.) TRUTH_TABLE ([EN, A, B] -> OUT ) [ 0, .X.,.X.] -> .X.; [ 1, 0 , 0 ] -> 0 ; [ 1, 0 , 1 ] -> 1 ; [ 1, 1 , 0 ] -> 1 ; [ 1, 1 , 1 ] -> 0 ;