Sunteți pe pagina 1din 9

Universitatea Bucuresti Facultatea de Matematica-Informatica Specializarea Tehnologia Informatiei

Forme Canonice Generalizate

Jerca Vlad anul I gr. 152

Cuprins

1. Descrierea Metodei ................................................................................ 3 2. Exemple ............................................................................................... 4 3. Codarea in Limbajul C ............................................................................ 5 4. Executarea programului .......................................................................... 9

1. Descrierea Metodei
Pana acum am considerat ca exista doua forme canonice fundamentale, denumite forma canonica P si forma canonica S. Aceste forme contin numai operatorii {AND,OR, NOT}. Asa cum s-a discutat multimea {AND,OR, NOT} reprezinta o multime functional completa, constituind o baza normala in sinteza logica a retelelor digitale. Aparitia circuitelor {NAND, NOR} a impus o noua abordare a sintezei logice. S-a cerut extinderea formelor canonice initiale astfel incat sa includa noile functii NOR si NAND. Astfel, au aparut formele canonice generalizate, care includ formele canonice fundamentale (P si S). Formele canonice generalizate sunt impartite in doua grupuri : D si C ; D reprezinta grupul formelor disjunctive, iar C reprezinta grupul formelor conjunctive. Formele disjunctive sunt definite pe multimea F1 , adica multimea de combinatii de variabile pentru care f (x1 ,..., xn )=1 . Formele conjunctive sunt definite pe multimea F0 , adica multimea de combinatii de variabile pentru care f (x1 ,..., xn ) = 0 . Exista 8 forme canonice generalizate dintre care patru sunt disjunctive (D1 D2 D3 D4) si patru sunt conjunctive (C1 C2 C3 C4) . Formele canonice generalizate disjunctive sunt : D1: AND-OR D2: NAND-NAND D3: OR-NAND D4: NOR-OR f (x1 ,..., xn ) = U (xi 1 xi 2 ... xi n) f (x1 ,..., xn ) = U (xi 1, xi 2,..., xi n) f (x1 ,..., xn ) = U (xi 1+xi 2+ ...+ xi n) f (x1 ,..., xn ) = U (xi 1 xi 2 ... xi n)
1 1 1 1 2 2 n
F1

F1

F1

Formele canonice generalizate conjunctive sunt : C1: OR-AND C2: NOR-NOR C3: AND-NOR C4: NAND-AND f (x1 ,..., xn ) = (xi 1+xi 2+ ...+ xi n) f (x1 ,..., xn ) = U (xi 1 xi 2 ... xi n) f (x1 ,..., xn ) = (xi 1 xi 2 ... xi n) f (x1 ,..., xn ) = (xi 1, xi 2,..., xi n)
1 2 n
F0

1 1

2 2

F0

F0

F0

Fiecare forma este descrisa de doua functii logice. Prima functie logica specifica operatia dintre variabilele {x1 ,..., xn}iar cea de-a doua functie specifica operatia dintre termeni. Evident, D1si C1 corespund formelor fundamentale canonice P si S iar restul corespund unor forme canonice noi care incorporeaza functiile NAND si NOR.

2. Exemple
F55262 = 11 01 01 11 11 01 11 10 Deoarece greutatea functiei este k = w( f ) =12, inseamna ca functia este balansata catre 1. Vom folosi forma generalizata canonica conjunctiva. Sunt identificate combinatiile pentru care f (x1x2x3x4) = 0 , ceea ce corespunde cu determinarea multimii F0 : F0: OR-AND: NOR-NOR: AND-NOR: NAND-AND: F17 = 00 01 00 01 Deoarece greutatea functiei este k = w( f ) = 2, inseamna ca functia este balansata catre 0. Vom folosi forma generalizata canonica disjunctiva. Sunt identificate combinatiile pentru care f (x1x2x3x4) = 1 , ceea ce corespunde cu determinarea multimii F1 : (x1+x2+x3+x4) * (x1+x2+x3+x4) * (x1+x2+x3+x4) * (x1+x2+x3+x4) (x1+x2+x3+x4) * (x1+x2+x3+x4) * (x1+x2+x3+x4) * (x1+x2+x3+x4) (x1* x2* x3* x4) * (x1*x2* x3* x4) * (x1*x2* x3* x4) * (x1*x2* x3* x4) (x1&x2&x3&x4) * (x1&x2&x3&x4) * (x1&x2&x3&x4) * (x1&x2&x3&x4)

F1: AND-OR: NAND-NAND: OR-NAND: NOR-OR: (x1*x2*x3) + (x1*x2*x3) (x1&x2&x3) & (x1&x2&x3) (x1+x2+x3) & (x1+x2+x3) (x1+x2+x3) + (x1+x2+x3)

3. Codarea in limbajul C
#include<stdio.h> #include<conio.h> #include<math.h> void timp(int n) { for(int t=1;t<=n*100000;t++); } void afisez(char c[]) { int i=0; while(c[i]) { putchar(c[i]); timp(75); i++; } } int powpow (int n, int n1) { return pow(n,n1); } //intarzie

//

pow

void ToBinary(int vector[255], int a, int n) { int i, j=1; i=powpow(2,n); i=powpow(2,i-1); for( i=i ; i >= 1 ; i = i/2 ) { if( a/i >= 1 ) {

// incarc vectorul binar

vector[j]=1; a=a-i; j++; } else { vector[j]=0; j++; } } }

void ToBinaryEc(int a, int n, char c, int nr) { int i, j=1; i=powpow(2,n-1); for( i=i ; i >= 1 ; i = i/2 ) { if( a/i >= 1 ) { if(nr==0)

// pozitie binara

printf("!"); printf("x%d", j); if(j!=n) putchar(c); a=a-i; j++; } else { if(nr==1) printf("!"); printf("x%d", j); if(j!=n) putchar(c); j++; } } } void afisareVect(int vector[255], int n) { int i; printf("Numarul in binar:\t "); for (i=1;i<=powpow(2,n);i++) printf("%d", vector[i]); } // verifica balansul functiei void balans(int vector[255], int n, int *of, int *s) { int i, tempvar=0; for(i=1;i<=powpow(2,n);i++) if(vector[i]==1) tempvar++; // afisare vector

if(tempvar>powpow(2,n-1)) { *of=1; *s=powpow(2,n)-tempvar; } else if(tempvar<powpow(2,n-1)) { *of=0; *s=tempvar; } else { *of=2; *s=tempvar; } if(*of!=2) printf("\n\t\t\t Balanseaza spre %d\n", *of); else printf("\n\t\t\t Balans egal"); }

void ecuatii(int vector[255], int n, int s, char a, char b, int egal, int nr) { //afiseaza ecuatiile la puterea in int n1, tempvar=1; n1=powpow(2,n); for(int i=1;i<=n1;i++) { if(vector[i]==egal) { printf("("); ToBinaryEc(i-1,n,a,nr); printf(")"); if(tempvar!=s) { printf(" "); putchar(b);printf(" "); } tempvar++; } } }

//afiseaza toate ecuatiile pentru F0 void F0(int vector[255], int n, int s) { printf("\n\nF0:\n"); printf("\nOR-AND:\t\t"); ecuatii(vector, n, s, '+', '*', 0, 0); printf("\nNOR-NOR:\t"); ecuatii(vector, n, s, '|', '|', 0, 0); printf("\nAND-NOR:\t"); ecuatii(vector, n, s, '*', '|', 0, 1); printf("\nNAND-AND:\t"); ecuatii(vector, n, s, '&', '*', 0, 1); }

// OR AND // NOR NOR // AND NOR // NAND AND

//afiseaza toate ecuatiile pentru F1 void F1(int vector[255], int n, int s) { printf("\n\nF1:\n"); printf("\nAND-OR:\t\t"); ecuatii(vector, n, s, '*', '+', 1, 1); printf("\nNAND-NAND:\t"); ecuatii(vector, n, s, '&', '&', 1, 1); printf("\nOR-NAND:\t"); ecuatii(vector, n, s, '+', '&', 1, 0); printf("\nNOR-OR:\t\t"); ecuatii(vector, n, s, '|', '+', 1, 0); }

// AND OR // NAND NAND //OR NAND // NOR OR

int main () { int numar, ordin, vectBin[255], omegaf, semn; printf("Introduceti ordinul:\t "); scanf("%d", &ordin); printf("Introduceti numarul:\t "); scanf("%d", &numar); ToBinary(vectBin, numar, ordin); afisareVect(vectBin, ordin); balans(vectBin, ordin, &omegaf, &semn); if(omegaf==1) F0(vectBin, ordin, semn); else if (omegaf==0) F1(vectBin, ordin, semn); else { F1(vectBin, ordin, semn); F0(vectBin, ordin, semn); } printf("\n\nLegenda:\t& - NAND\t * - AND\t | - NOR\t + - OR"); afisez("\n\n\t\tCodat de Jerca Vlad gr. 152 sectia TI"); getch(); }

4. Executarea programului