Porte Logiche e Rappresentazione Grafica

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

A Y

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

A B Y

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

A B Y

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

A B Y

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

A B Y

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

A B Y

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

A B Y

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.

NOT AND OR XOR NAND NOR XNOR

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:

A B C AND OR Y

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.

  1. Forma a D con pallino sull’uscita.
  2. Triangolo con pallino sulla punta destra.
  3. Forma a scudo appuntito, senza pallino.
  4. Forma a scudo appuntito con doppia curva a sinistra e pallino sull’uscita.
  5. Forma a D senza pallino.
  6. Forma a scudo appuntito con doppia curva a sinistra, senza pallino.
  7. 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.

  1. Y = NOT A, con A = true.
  2. Y = A AND B, con A = true, B = false.
  3. Y = (NOT A) OR B, con A = true, B = false.
  4. Y = NOT (A AND B), con A = true, B = true.
  5. 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.

  1. «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.»
  2. «Una notifica di sicurezza viene inviata se la porta è aperta e il sistema di allarme non è disattivato.»
  3. «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.

  1. 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?
  2. Qual è la relazione tra un’espressione come ($A && $B) || $C scritta in PHP e un circuito logico composto da una porta AND seguita da una porta OR?
  3. Il pallino di negazione sulle porte NAND, NOR e XNOR corrisponde a cosa nel codice PHP e JavaScript? Fai un esempio concreto.
0 0 voti
Valutazione Media
Iscriviti
Notificami
guest
0 Commenti
Vecchi
Più recenti Le più votate
Feedback in linea
Visualizza tutti i commenti
Torna in alto