În electronica digitală, există doar două stări de tensiune prezente în orice punct al unui circuit: high sau low, fiind translatate în logica booleană ca 2 stări: adevărat pentru high și fals pentru low. Aceste două nivele de tensiune pot reprezenta de exemplu starea de pornit/oprit a unui comutator sau a unui tranzistor saturat, un bit într-un număr, etc. Pentru o înțelegere cât mai bună a termenului de logică booleană, vom face o scurtă trecere în revistă a sistemelor de numerație.
Sistemul zecimal
Cel mai familiar sistem de numerație din zilele noastre este sistemul zecimal, sistem ce utilizează zece unități (de la 0 până la 9). Scrierea folosind sistemul de numeraţie zecimal se mai numeşte scrierea în baza 10. Scrierea în baza 10 a unui număr natural de forma xy se face astfel: xy=x*10+y, în timp ce a unui număr de forma xyz se face sub forma: xyz = x*102+y*10+z. De exemplu:

Sistemul binar
Ținând cont de faptul că toate circuitele digitale “lucrează” cu două nivele de tensiune, este de la sine înțeleasă necesitatea unui sistem binar de numerație pentru a ține evidența informațiilor. Un număr binar este compus din două cifre binare, 0 și 1, care se mai numesc biți. De exemplu numărul zecimal 28 poate fi scris în sistem binar astfel:

Cel mai din stânga bit poartă denumirea de cel mai semnificativ bit, iar cel mai din dreapta de, cel mai puțin semnificativ bit. Metoda de conversie din sistem zecimal în sistem binar și invers este prezentată în figura de mai jos:

Metoda conversiei zecimal->binar stă la baza împărțirii la doi, ținând cont de restul rezultat. Primul rest devine cel mai puțin semnificativ bit (LSB), în timp ce ultimul rest va deveni cel mai semnificativ bit (MSB). În cazul conversiei inverse, după cum se poate observa și în figura de mai sus, fiecare bit se înmulțește cu coeficientul asociat lui, începând cu cel mai puțin semnificativ bit (LSB). După aflarea valorilor zecimale corespunzătoare biților de tip 1 (biții care sunt 0 vor fi egali cu zero și în zecimal deoarece înmulțirea cu zero este egală cu zero), toate acestea se adună rezultând în final echivalentul lui în zecimal.
Sistemul octal și hexazecimal
Pe lânga sistemul binar, sistemul octal și hexazecimal sunt celelalte două sisteme de numerație utilizate în electronica digitală. În sistemul octal (baza 8), sunt folosite doar 8 cifre: 0, 1, 2, 3, 4, 5, 6 și 7, în timp ce în sistemul hexazecimal sunt permise 16 cifre: 0, 1, 2, …, 8, 9, A, B, C, D, E și F (dacă ar fi să facem o analogie între sistemul zecimal și cel hexazecimal vom observa că: A=10, B=11, C=12, D=13, E=14, F=15). De exemplu:

Din moment ce numerele binare stau la baza sistemelor digitale, în situațiile în care (să zicem că) avem de lucrat cu o serie foarte mare de astfel de numere, sistemul hexazecimal vine în ajutorul nostru, permițându-ne o întelegere și manipulare mult mai ușoară. Conversile hexazecimal – binar, octal-binar și viceversa sunt prezentate în imaginea următoare:

Reprezentarea hexadecimală a numerelor binare apare de exemplu în aplicațiile de microcontrolere care utilizează linii de cod (de exemplu, în cadrul limbajului de asamblare) pentru abordarea locațiilor de memorie sau a altor sarcini specifice.
Numere Zecimale Codificate Binar – BCD
Numerele zecimale codificate binar sunt utilizate la reprezentarea unei cifre zecimale într-un grup de 4 cifre binare (biți) în același fel ca în cazul sistemului hexazecimal. De exemplu, numărul zecimal 150 este reprezentat în cod BCD astfel:

Având în vedere că nu vom utiliza foarte des acest sistem, conversia BCD în binar, octal, hexazecimal și viceversa va fi prezentată atunci când ne vom lovi de ea într-o anumită aplicație și(sau) proiect.
Atașat mai jos puteți vedea tabelul de conversie a primelor 15 numere zecimale în sistemele de numerație prezentate până acum.
| Zecimal | Binar | Octal | Hexazecimal | BCD |
|---|---|---|---|---|
| 00 | 0000 0000 | 00 | 00 | 0000 0000 |
| 01 | 0000 0001 | 01 | 01 | 0000 0001 |
| 02 | 0000 0010 | 02 | 02 | 0000 0010 |
| 03 | 0000 0011 | 03 | 03 | 0000 0011 |
| 04 | 0000 0100 | 04 | 04 | 0000 0100 |
| 05 | 0000 0101 | 05 | 05 | 0000 0101 |
| 06 | 0000 0110 | 06 | 06 | 0000 0110 |
| 07 | 0000 0111 | 07 | 07 | 0000 0111 |
| 08 | 0000 1000 | 10 | 08 | 0000 1000 |
| 09 | 0000 1001 | 11 | 09 | 0000 1001 |
| 10 | 0000 1010 | 12 | 0A | 0001 0000 |
| 11 | 0000 1011 | 13 | 0B | 0001 0001 |
| 12 | 0000 1100 | 14 | 0C | 0001 0010 |
| 13 | 0000 1101 | 15 | 0D | 0001 0011 |
| 14 | 0000 1110 | 16 | 0E | 0001 0100 |
| 15 | 0000 1111 | 17 | 0F | 0001 0101 |
| 16 | 0001 0001 | 20 | 10 | 0001 0110 |
Complementul față de 2
Cum se reprezintă un număr zecimal negativ în sistem binar? Prima soluție constă în utilizarea unui bit de semn. Această reprezentare este foarte simplă, fiind utilizată destul de rar. Ea constă în rezervarea unui bit (de obicei cel mai semnificativ) care ține cont de semnul numărului. Dacă bitul este zero, numărul este pozitiv; dacă bitul este egal cu unu, numărul este negativ. O variantă mult mai populară o constituie complementul față de 2. Pentru o întelegere cât mai ușoară a acestui procedeu, te învit să vizualizezi următorul exemplu:

Cazul 1: Zecimal în complement față de 2
Dacă numărul zecimal este pozitiv, complementul față de 2 este egal cu echivalentul lui binar.
Dacă numărul zecimal este negativ, se urmează pașii:
– Pasul 1: se face complementul față de 1 al echivalentului binar corespunzător numărului în zecimal prin trecerea din 0 în 1 al fiecărui element în parte (de exemplu, 1000 1111 se va transforma în 0111 0000);
– Pasul 2: adunăm valoarea 1 la complementul față de 1 rezultat din operația anterioară, rezultând astfel valoarea complementului față de 2.
Cazul 2: Complement față de 2 în zecimal
Dacă complementul față de 2 este pozitiv (bitul de semn, adică cel mai semnificativ bit, este egal cu 0), se face trecerea normală din sistem binar în sistem zecimal prin metoda prezentată în secțiunea Sistemul binar.
Dacă complementul față de 2 este negativ (bitul de semn este egal cu 1), valoarea numărului în sistem zecimal va fi de asemenea negativă. Valoarea acestuia se găsește astfel:
– Pasul 1: aplicăm complementul față de 1 întregului număr binar reprezentat în complement față de 2;
– Pasul 2: adunăm 1 la numărul binar obținut;
– Pasul 3: Se face trecerea în sistem zecimal a valorii obținute (prin intermediul metodei prezentate anterior), iar mai apoi se va trece semnul negativ în fața rezultatului obținut.
Aritmetica binară
Adunarea și scăderea numerelor binare, hexazecimale și a altor sisteme de numerație poate fi făcută cu ajutorul unui calculator sau a unui set de particularități specifice. Din moment ce metoda calculatorului nu este una viabilă (poate nu toată lumea are acces la unul, glumesc), în cele ce urmează îți voi prezenta metoda analitică acestor operații.
Adunarea
Adunarea a două numere binare se face exact ca cea a numerelor zecimale. Atunci când rezultatul adunării unei coloane este mai mare ca 1 (atunci când aduni 1 cu 1), rezultatul operației va fi egal cu 0, iar un 1 este adunat la următoarea coloană. De exemplu:

Scăderea
Scăderea a două numere binare nu este chiar așa de ușoară precum adunarea. Metoda convențională este puțin greoaie și cam rar folosită. Asul din mânecă îl reprezintă acum complementul față de 2. În acest caz, dispunând de bitul de semn, doar adunăm cele două numere. Această metodă este utilizată foarte des în cadrul circuitelor digitale deoarece ne permite efectuarea ambelor operații (adunare și scădere).

ASCII
Codul Standard American pentru Schimbul de Informații (American Standard Code for Information Interchange) este un sistem de codificare alfanumeric utilizat la transmiterea literelor, simbolurilor, numerelor și a caracterelor speciale între calculatoare și periferice (imprimantă, tastatură, mouse, etc.). Codul ASCII are la bază 128 de coduri diferite a câte 7-biți fiecare. De exemplu, codurile de la 000 0000 (00 în hexazecimal) până la 001 1111 (1F în hexazecimal) sunt rezervate pentru caracterele neimprimabile sau comenzi specifice precum: ESC (escape), DEL (delete), CR (cariage return), etc. Codurile de la 010 0000 (20 în hexazecimal) până la 111 1111 (7F în hexazecimal) sunt rezervate pentru caractere “printabile” precum: a, A, #, &, {, @, etc. Pentru mai multe detalii accesează link-ul acesta.
Acum, odată cu prezentarea celor mai uzuale sisteme de numerație vom trece la partea a doua a cursului de astăzi, parte dedicată porților logice.
Porțile logice
După cum am prezentat anterior, întrările și ieșirile circuitelor digitale se regăsesc în două stări de pontețial electric (sau niveluri logice) cărora li s-au atribuit cele două variabile logice 0 și 1. Această caracteristică permite folosirea algebrei Booleene ca și instrument de analiză și proiectare a lor. Acest tip de algebră (care operează numai cu două simboluri, 0 și 1) este mult mai simplă decât cea clasică, având la bază doar trei operații: adunarea logică, multiplicarea logică și negarea logică.
Negarea logică (NOT)
În figura de mai jos este prezentat simbolul acestui tip de poartă logică, tabela sa de adevăr precum și analogia acestuia cu cea a unui comutator.

Operația logică NU poate fi aplicată unei singure variabile de intrare. Această operație mai poartă denumirea de inversiune sau complementare și are funcția de a inversa (nega) valorea binară logică prezentă pe intrarea sa. După cum se poate vedea și în tabela sa de adevăr, avem două cazuri:
– dacă intrarea (A) =„0”, atunci nu(A) =„1” (A negat (inversat) este „1”);
– dacă intrarea (A) =„1”, atunci nu(A) =„0” (A negat (inversat) este „0”).
Făcând analogia cu un comutator, se poate oberva și în imaginea de mai sus că atunci când intrarea A este 0 (comutatorul este deschis), ieșirea (not A), reprezentată printr-un LED, va fi 1. În caz contrar, când intrarea A este 1, ieșirea va fi 0.
Produsul logic. Operația ȘI (AND)
Operația ȘI logic implementează operația de conjuncție logică, având următoarea interpretare:
– dacă cel puțin una dintre intrări se află în 0 logic, atunci ieșirea este în 0 logic;
– dacă ambele intrări sunt în 1 logic, atunci ieșirea este în 1 logic.
Simbolul, tabela de adevăr și analogia sa cu cea a unui comutator este prezentată în imaginea de mai jos:

Formal, multiplicarea logică dă aceleași rezultate cu înmulțirea clasică. După cum se poate observa și în circuitul electric ilustrat mai sus, ieșirea C (reprezentată printr-un LED) va fi activă doar atunci când cele două intrări (A, respectiv B) vor fi în 1 logic. Vizualizând tabela de adevăr, observăm prezența a patru cazuri:
– dacă A =„0” ȘI B =„0”, atunci C =„0” (A ȘI B este egal cu 0);
– dacă A =„0” ȘI B =„1”, atunci C =„0” (A ȘI B este egal cu 0);
– dacă A =„1” ȘI B =„0”, atunci C =„0” (A ȘI B este egal cu 0);
– dacă A =„1” ȘI B =„1”, atunci C =„1” (A ȘI B este egal cu 1).
Ecuația booleană este de forma:

Produsul logic. Operația ȘI-NU (NAND)
Operația NAND este formată prin compunerea operației NOT cu operația AND. În acest caz, ieșire va fi adevărată doar atunci când ambele intrări se află în 0 logic. Simbolul porții NAND este foarte asemănător cu cel al porții ȘI, singura diferență constând în adăugarea unui cerc înaintea dreptei utilizate la marcarea ieșiri din poartă.

În acest caz, ecuația booleană va fi de forma:

Adunarea logică. Operația SAU (OR)
Funcția logică SAU implementează operația de disjuncție logică și are la bază următoarea interpretare:
– ieșirea sa este adevărată dacă cel puțin una din intrări este adevărată;
– ieșirea sa este falsă dacă ambele intrări sunt false.
Simbolul se aseamănă cu cel al porții logice ȘI, singura excepție fiind forma sa puțin mai arcuită. Putem spune că adunarea logică este identică cu cea algebrică exceptând cazul în care cele două intrări sunt adevărate (1 logic). În acest caz, datorită faptului că nivelul logic al ieșirii nu poate fi 2, suma logică 1 + 1 va avea ca efect apariția nivelului logic 1 la ieșire. În cazul analogiei cu cea a unui comutator electric putem trage concluzia că atunci când unul dintre cele două comutatoare este închis, ieșirea va fi 1.

Prin analiza tabelei de adevăr putem trage următoarele concluzii:
– dacă A =„0” SAU B =„0”, atunci C =„0” (A SAU B este egal cu 0);
– dacă A =„0” SAU B =„1”, atunci C =„1” (A SAU B este egal cu 1);
– dacă A =„1” SAU B =„0”, atunci C =„1” (A SAU B este egal cu 1);
– dacă A =„1” SAU B =„1”, atunci C =„1” (A SAU B este egal cu 1).
Poarta logică SAU este caracterizată de următoarea ecuație booleană:

Adunarea logică. Operația SAU-NU (NOR)
Asemenea operației NAND, operația NOR este compusă la rândul ei prin compunerea operației OR cu operația NOT. Aici, ieșirea va fi adevărată (1 logic) doar atunci când ambele intrări sunt false (0 logic). Se poate observa în figura de mai jos tabela de adevăr, simbolul precum și analogia sa cu cea a unui circuit electric.

În acest caz, ecuația booleană este identică cu cea a porții logice SAU, exceptând prezența bării de negație:

Poarta SAU-EXCLUSIV (XOR)
Poarta logică XOR implementează operația de disjuncție exclusivă. Ea se comportă conform tabelului de adevăr ilustrat în figura de mai jos. Ieșirea este 1 numai dacă una și numai una dintre intrările porții este 1.

Se poate observa că această poartă logică are în componența sa 2 inversoare, 2 porți logice de tip AND și una de tip OR. Drep urmare, ecuația booleană a porții logice XOR este dată de relația:

Am reprodus mai jos câte o simulare pentru fiecare poartă logică în parte. În prima simulare este exemplificat rolul unei porți logice AND în aprindearea unui LED. Ținând cont de tabela de adevăr a acestei porți, observăm că ieșirea va fi activă (și implicit LED-ul) atunci când ambele intrări sunt active. În cazul porții logice NAND, LED-ul va sta aprins atât timp cât ambele intrări nu sunt active.

A doua simulare ilustreză de data aceasta principiul de funcționare a porților logice OR, respectiv NOR. În acest caz, LED-ul atașat pe ieșirea celor două porți logice va fi aprins atunci când:
– cel puțin una dintre intrări este activă (OR);
– ambele intrări ale porții logice sunt inactive (NOR).

Ultima simulare prezintă mecanismul de funcționare al porților NOT și XOR. În partea stângă se poate observa că LED-ul stă aprins atât timp cât intrarea este blocată în 0 logic (specific porții NOT), iar în partea dreaptă doar atunci când întrările nu sunt identice (specific porții XOR).

Și cu asta punem punct și cursului de astăzi. La prima vedere pare multă informație dar țin să menționez că am încercat pe cât posibil să creionez în linii cât mai mari o scurtă imagine de ansamblu legată de aceste două teme. În cursul viitor vom vorbi mai multe despre logica combinațională și îți voi arăta de ce indispensabilă în aplicațiile cu microcontrolere. Numai bine!
