Dai simboli sulla carta ai circuiti dentro ogni dispositivo digitale
Dalle Tabelle ai Simboli: perché servono le Porte Logiche
Nelle lezioni precedenti abbiamo imparato a descrivere gli operatori logici con le tabelle di verità e a usarli nel codice PHP e JavaScript. Esiste però un terzo modo di rappresentare la logica booleana, usato dagli ingegneri elettronici e dai progettisti di processori: i simboli grafici.
Ogni operatore logico ha un simbolo standardizzato chiamato porta logica (in inglese logic gate). Collegando le porte logiche tra loro su un disegno, si ottiene lo schema di un circuito logico: una rappresentazione visiva che mostra come i segnali attraversano le varie operazioni logiche per produrre un risultato.
Definizione
Una Porta Logica (logic gate) è la rappresentazione grafica di un operatore logico. Ogni porta ha uno o più ingressi (input), un’uscita (output) e una forma caratteristica che permette di riconoscere immediatamente quale operatore rappresenta. I simboli delle porte logiche seguono standard internazionali condivisi in tutto il mondo.
Perché uno sviluppatore dovrebbe conoscere questi simboli? Perché ogni istruzione logica che scriviamo nel codice — ogni &&, ogni ||, ogni ! — corrisponde fisicamente a una porta logica all’interno del processore che esegue quel codice. Capire questa corrispondenza aiuta a comprendere come funziona la macchina su cui i nostri programmi girano.
Nota
Esistono due standard principali per disegnare le porte logiche: lo standard ANSI/IEEE (americano, con forme curve caratteristiche) e lo standard IEC (europeo, con forme rettangolari). In questa lezione utilizziamo lo standard ANSI/IEEE, che è il più diffuso nei libri di testo, nei software di simulazione e nei materiali didattici a livello mondiale.
Le Convenzioni grafiche: input, output e il Pallino di Negazione
Prima di vedere i singoli simboli, impariamo tre regole grafiche che valgono per tutte le porte logiche.
Gli input entrano sempre da sinistra. I segnali in ingresso sono rappresentati da linee orizzontali che arrivano al lato sinistro della porta. L’operatore NOT ha un solo input; tutti gli altri ne hanno due.
L’output esce sempre da destra. Il risultato dell’operazione è una singola linea che esce dal lato destro della porta.
Il pallino indica la negazione. Un piccolo cerchio posizionato sull’uscita di una porta indica che il risultato viene invertito (cioè viene applicato un NOT). È questo il segno grafico che distingue le porte derivate (NAND, NOR, XNOR) dalle porte base (AND, OR, XOR).
Regola fondamentale
Per trasformare il simbolo di una porta base nel simbolo della corrispondente porta derivata, basta aggiungere un pallino sull’uscita. AND con pallino = NAND. OR con pallino = NOR. XOR con pallino = XNOR. Questo è il corrispettivo grafico del principio di derivazione tramite negazione che abbiamo studiato nella Lezione A3.
I Simboli delle sette Porte Logiche
Porta NOT
1 input ⟶ 1 output
La porta NOT ha la forma di un triangolo con un pallino sulla punta destra. Il triangolo rappresenta il passaggio del segnale; il pallino indica l’inversione. Un solo input entra da sinistra, l’output invertito esce da destra.
| A | Y = NOT A |
|---|---|
| 0 | 1 |
| 1 | 0 |
Nel codice: !$A in PHP, !A in JavaScript.
Porta AND
2 input ⟶ 1 output
La porta AND ha la forma di una D maiuscola: lato sinistro piatto, lato destro a semicerchio. Nessun pallino sull’uscita.
| A | B | Y = A AND B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Nel codice: $A && $B in PHP, A && B in JavaScript.
Porta OR
2 input ⟶ 1 output
La porta OR ha una forma appuntita che ricorda uno scudo o una freccia curva. Il lato sinistro è leggermente concavo, il lato destro termina in una punta.
| A | B | Y = A OR B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
Nel codice: $A || $B in PHP, A || B in JavaScript.
Porta XOR
2 input ⟶ 1 output
La porta XOR è identica alla porta OR, ma con una linea curva aggiuntiva sul lato sinistro, leggermente distanziata dal corpo. Questa doppia curva è il segno distintivo che permette di riconoscere la XOR rispetto alla OR.
| A | B | Y = A XOR B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Nel codice: $A ^ $B in PHP, A ^ B in JavaScript.
Porta NAND
2 input ⟶ 1 output
La porta NAND ha lo stesso corpo della porta AND (la forma a D), ma con un pallino di negazione sull’uscita. AND + pallino = NAND.
| A | B | Y = A NAND B |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Nel codice: !($A && $B) in PHP, !(A && B) in JavaScript.
Porta NOR
2 input ⟶ 1 output
La porta NOR ha lo stesso corpo della porta OR (la forma a scudo appuntito), ma con un pallino di negazione sull’uscita. OR + pallino = NOR.
| A | B | Y = A NOR B |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 0 |
Nel codice: !($A || $B) in PHP, !(A || B) in JavaScript.
Porta XNOR
2 input ⟶ 1 output
La porta XNOR ha lo stesso corpo della porta XOR (la forma a scudo con la doppia curva sul lato sinistro), ma con un pallino di negazione sull’uscita. XOR + pallino = XNOR.
| A | B | Y = A XNOR B |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Nel codice: !($A ^ $B) in PHP, !Boolean(A ^ B) in JavaScript.
Galleria riepilogativa dei sette Simboli
Ecco tutti e sette i simboli in un’unica vista. Notate il pattern: le tre porte derivate (NAND, NOR, XNOR) sono identiche alle porte base (AND, OR, XOR) ma con il pallino di negazione sull’uscita.
Come riconoscere le Porte a colpo d’occhio
Passo 1: guarda la forma del corpo. Se è una D (lato piatto a sinistra, semicerchio a destra), è nella famiglia AND. Se ha una forma a scudo appuntito, è nella famiglia OR. Se ha lo scudo appuntito con una doppia curva a sinistra, è nella famiglia XOR. Se è un triangolo con un solo input, è un NOT.
Passo 2: guarda se c’è il pallino sull’uscita. Se non c’è, è la porta base. Se c’è, è la versione negata (derivata).
Dalla Porta al Circuito: come si collegano le Porte tra loro
Definizione
Un Circuito Logico è un insieme di porte logiche collegate tra loro in modo che l’output di una porta possa diventare l’input di un’altra. Collegando più porte in sequenza o in parallelo, si possono costruire operazioni logiche complesse a partire da operazioni semplici.
Il principio è lo stesso del LEGO: con pochi tipi di mattoncini (le sette porte) si possono costruire strutture di qualsiasi complessità. Il processore del vostro smartphone contiene miliardi di transistor organizzati in porte logiche collegate tra loro in circuiti estremamente complessi, ma il principio di base è sempre lo stesso.
Vediamo un esempio concreto. Consideriamo l’espressione logica che descrive il controllo di accesso a un’area riservata:
Y = (A AND B) OR C
Questa espressione dice: «prima calcola A AND B, poi prendi quel risultato e combinalo con C usando OR». In codice PHP e JavaScript si scriverebbe così:
<?php
// Y = (A AND B) OR C
// Esempio: accesso consentito se (password corretta E badge valido) OPPURE utente amministratore
$password_corretta = true;
$badge_valido = false;
$utente_admin = true;
$accesso = ($password_corretta && $badge_valido) || $utente_admin;
var_dump($accesso); // Output: bool(true)
?>
// Y = (A AND B) OR C
let passwordCorretta = true;
let badgeValido = false;
let utenteAdmin = true;
let accesso = (passwordCorretta && badgeValido) || utenteAdmin;
console.log(accesso); // Output: true
Il circuito logico corrispondente collega una porta AND (che riceve A e B) e una porta OR (che riceve il risultato della AND e il segnale C). Graficamente:
Il segnale A e il segnale B entrano nella porta AND. Il risultato della AND esce e diventa uno degli input della porta OR. L’altro input della OR è il segnale C, che arriva direttamente dall’esterno. L’output finale Y è il risultato dell’intera espressione.
Il principio fondamentale
Qualsiasi espressione logica, per quanto complessa, può essere rappresentata come un circuito fatto di porte logiche collegate tra loro. E viceversa: qualsiasi circuito può essere descritto da un’espressione logica e da una tabella di verità. Questi tre strumenti — espressione, circuito, tabella — sono tre modi diversi di descrivere la stessa identica cosa. Nel codice utilizziamo le espressioni; nell’hardware si usano i circuiti; nelle tabelle di verità si verifica la correttezza del ragionamento.
Esercizi di Verifica
Esercizio 1 — Riconosci la Porta
Per ciascuna delle seguenti descrizioni, indica il nome della porta logica corrispondente e scrivi come si esprime nel codice PHP e JavaScript.
- Forma a D con pallino sull’uscita.
- Triangolo con pallino sulla punta destra.
- Forma a scudo appuntito, senza pallino.
- Forma a scudo appuntito con doppia curva a sinistra e pallino sull’uscita.
- Forma a D senza pallino.
- Forma a scudo appuntito con doppia curva a sinistra, senza pallino.
- Forma a scudo appuntito con pallino sull’uscita.
Esercizio 2 — Dal Circuito al Codice
Per ciascuna delle seguenti espressioni logiche, scrivi il codice PHP e JavaScript corrispondente, usando le variabili e i valori indicati. Poi calcola il risultato atteso.
Y = NOT A, con A = true.Y = A AND B, con A = true, B = false.Y = (NOT A) OR B, con A = true, B = false.Y = NOT (A AND B), con A = true, B = true.Y = (A OR B) AND C, con A = false, B = true, C = true.
Esercizio 3 — Dal Codice alla Porta
Per ciascuna delle seguenti righe di codice PHP, indica quale porta logica (o combinazione di porte) viene utilizzata e scrivi la corrispondente espressione logica in forma simbolica.
<?php
$A = true;
$B = false;
$C = true;
$Y1 = !$A;
$Y2 = $A && $B;
$Y3 = $A || $B;
$Y4 = !($A || $B);
$Y5 = (!$A) && $C;
?>
Esercizio 4 — Dalla Specifica al Circuito e al Codice
Leggi le seguenti specifiche in linguaggio naturale. Per ciascuna, scrivi l’espressione logica corrispondente, indica quali porte logiche sarebbero necessarie per realizzarla come circuito, e scrivi il codice PHP.
- «Un sistema di irrigazione automatica si attiva se il sensore di umidità segnala terreno secco e il timer di programmazione è attivo, oppure se è stato premuto il pulsante di avvio manuale.»
- «Una notifica di sicurezza viene inviata se la porta è aperta e il sistema di allarme non è disattivato.»
- «L’accesso alla rete è consentito solo se nessuna delle due condizioni seguenti è vera: connessione da indirizzo sconosciuto, tentativo di accesso fuori orario.»
Esercizio 5 — Riflessione
Rispondi alle seguenti domande scrivendo almeno tre righe per ciascuna risposta.
- Perché uno sviluppatore che scrive codice in PHP o JavaScript dovrebbe conoscere i simboli delle porte logiche, anche se non progetterà mai un circuito elettronico?
- Qual è la relazione tra un’espressione come
($A && $B) || $Cscritta in PHP e un circuito logico composto da una porta AND seguita da una porta OR? - Il pallino di negazione sulle porte NAND, NOR e XNOR corrisponde a cosa nel codice PHP e JavaScript? Fai un esempio concreto.