Domanda:
How does a non-FPGA (ie a PC with a CPU, RAM, hard drive) mimic logic gates?
user3716057
2014-07-17 20:18:06 UTC
view on stackexchange narkive permalink

So che un FPGA utilizza le tabelle di ricerca (LUT) per sintetizzare le porte logiche. Una LUT è un blocco di RAM indicizzato da un numero di input. L'output è il valore memorizzato in quell'indirizzo di memoria. La magia è che la LUT può essere programmata per visualizzare quello che vuoi per un particolare input. Quindi, una LUT può essere programmata con la tabella della verità di qualsiasi porta logica per imitarla! È così che un FPGA sintetizza le porte logiche che specifichi nel tuo codice HDL.

Stavo pensando l'altro giorno, come fa un normale computer a imitare le porte logiche? Per quanto ne so (che non è lontano), se scrivo un programma in C ++, prima deve essere compilato in codice macchina in modo che la CPU possa leggerlo. Quindi quando premo "run", il codice macchina va in memoria per attendere l'elaborazione da parte della CPU. Non sono molto chiaro su cosa accadrà dopo, ma a un certo punto la CPU deve aver eseguito le operazioni logiche contenute nel mio programma, giusto? A differenza di un FGPA, la CPU non può semplicemente sintetizzare le risorse di cui ha bisogno. Allora come esegue il programma?

Le mie ipotesi:

  1. La CPU ha un numero di porte logiche predefinite. Quando incontra un'istruzione AND nel codice C ++ che sta eseguendo, utilizza uno dei suoi ANDgate. Se vede un'istruzione OR, utilizza una delle sue porte OR; se vede un'istruzione IF, usa una delle sue porte IF; ecc.

  2. Oppure, la logica è implementata nella memoria in qualche modo simile a una LUT. Questo ha più senso per me poiché non si basa su un numero limitato di risorse di gate. Se il mio programma richiede tonnellate di logica OR, ad esempio, la CPU non subirà colli di bottiglia a causa della mancanza di porte OR.

Quindi, quanto sono lontano?

Modifica: grazie per le risposte a tutti, ho imparato un bel po 'di CPU e ALU. Inoltre, la "porta IF" nella mia prima ipotesi è un errore di battitura, che dovrebbe essere "porta OR" (sebbene sia solo un esempio, qualsiasi porta logica andrebbe bene). Mi dispiace per questa confusione.

Cerca qualcosa come "cpu fai da te a 8 bit" o qualcosa di simile su Google.Ti darà uno sguardo dal basso verso l'alto, piuttosto che dall'alto verso il basso.
Non ho molta esperienza in questo campo, ma sono abbastanza sicuro che questo sia ciò a cui servono le parole d'istruzione nel linguaggio macchina
Sei risposte:
Chris Stratton
2014-07-17 20:51:45 UTC
view on stackexchange narkive permalink

In realtà la tua prima ipotesi non è così lontana come alcuni sostengono.

Una CPU è costruita attorno a qualcosa chiamato "Arithmetic Logic Unit" (ALU) e un'implementazione semplicistica di ciò è avere il porte logiche che implementano tutte le operazioni di base cablate in parallelo agli ingressi. Tutti i calcoli elementari possibili vengono così eseguiti in parallelo, con l'uscita di quello effettivamente desiderato selezionato da un multiplexor.

In una CPU estremamente semplice (modello lavagna), alcuni bit del codice operativo dell'istruzione attualmente in esecuzione sono collegati a quel multiplexor per dirgli quale risultato della funzione logica utilizzare. (Gli altri risultati indesiderati vengono semplicemente sprecati)

La tecnologia effettiva utilizzata per implementare i calcoli nell'ALU varia: potrebbe essere porte logiche "reali", o potrebbe essere LUT se la CPU è implementata all'interno un FPGA basato su LUT (un ottimo modo per comprendere gli elementi essenziali dell'elaborazione a programma memorizzato è progettare un semplice processore e costruirlo in un simulatore logico e forse poi in un FPGA).

Sì, questo è quello che stavo arrivando alla mia prima ipotesi.Quindi, quando la CPU ha bisogno di fare logica, usa i gate (o LUT o qualsiasi altra tecnologia) nella sua ALU per eseguire l'operazione.È possibile che la CPU subisca un collo di bottiglia a causa delle limitate risorse di calcolo?Ad esempio, ogni ciclo di clock dell'ALU può eseguire solo un numero di calcoli limitato dal numero di gate rilevanti di cui dispone.Finché l'FPGA ha spazio, può semplicemente costruire più porte per andare più veloce.Mi rendo conto che la logica viene eseguita in parallelo sull'FPGA rispetto alla sequenza per la CPU, ma c'è
deve essere un vantaggio per il numero grezzo di porte giusto?
Una CPU classica esegue solo un calcolo * utile * per clock (al massimo, spesso meno) poiché di tutti i calcoli possibili eseguiti in parallelo, solo uno è effettivamente * desiderato *.Le tecniche moderne, tuttavia, spesso incorporano più unità di esecuzione parallela, o facendo la stessa cosa su più set di dati (specialmente le GPU su una scheda grafica), o perseguendo due possibilità con quella sbagliata scartata (verrà preso il ramo condizionale o no?) o come core distinti effettivi che eseguono thread di programma diversi.Ma non è banale fare qualcosa di più veloce semplicemente gettando più cancelli contro di esso.
Vedo.Quindi, se una CPU avesse bisogno di eseguire molti XOR, ad esempio, una ALU con un numero enorme di porte XOR non lo farebbe necessariamente più veloce di una ALU con un numero inferiore.Quindi cosa determina il numero ottimale di un particolare tipo di cancello su una ALU?
Inoltre, volevi dire "tutti i calcoli possibili vengono eseguiti in sequenza", invece di "in parallelo"?
No, vengono eseguiti in parallelo, ma tutti i risultati vengono scartati tranne quello che corrisponde al calcolo effettivamente richiesto dall'opcode.Il numero di porte in ogni fase della pipeline del percorso dati * distinto è sostanzialmente determinato dalla larghezza della parola e dalla complessità dell'operazione combinatoria eseguita.
@user3716057: Dipende dall'architettura del processore.x86 ha istruzioni SIMD che consentono più operazioni in parallelo e vari [processori vettoriali] (http://en.wikipedia.org/wiki/Vector_processor) sono stati utilizzati per elaborare grandi quantità di dati in parallelo.Le GPU sono una di queste incarnazioni di un'idea simile, di un chip progettato per calcoli altamente paralleli.
@user3716057: La maggior parte delle moderne CPU di fascia alta in realtà viene fornita con più di una ALU.È così che possono eseguire più di un'operazione matematica / logica contemporaneamente.Inoltre, a volte le CPU sono dotate di ALU complesse separate che possono moltiplicare / dividere / aggiungere / o / xor ecc. E ALU semplici che possono solo aggiungere / o / e / xor in modo da poter programmare operazioni complesse e semplici insieme.
Dave Tweed
2014-07-17 20:40:36 UTC
view on stackexchange narkive permalink

Abbastanza lontano.

Una CPU è composta da porte reali (LUT non programmabili). Le operazioni chiave sui dati vengono eseguite in un blocco logico spesso noto come ALU (unità aritmetico-logica). All'interno di questo blocco c'è un insieme di porte che possono, ad esempio, ANDARE due operandi insieme, bit per bit. C'è un altro insieme di porte che possono sommarle e così via.

Quando si eseguono istruzioni sulla CPU, le istruzioni vengono decodificate una alla volta e la logica associata a tale istruzione viene attivata all'interno del ALU.

La differenza è un compromesso tra tempo e area. Se hai molti AND da fare, puoi farli in un FPGA usando molti LUT in parallelo e portarli a termine in un breve lasso di tempo. Se li esegui in una CPU, verranno eseguiti uno alla volta (in sequenza) nel minuscolo blocco di logica progettato per quell'attività.

Non è più o meno la mia prima ipotesi?
@user3716057, no, non proprio.Ad esempio, non esiste un gate "if".Il tuo codice è suddiviso in una serie di istruzioni individuali (limitate alla larghezza dei bus della CPU, ecc.).Possono essere centinaia di istruzioni per un codice di livello superiore molto piccolo.Come ha detto Dave, l'ALU esegue operazioni logiche, come AND, OR e operazioni aritmetiche, come ADD, SUB.Un'istruzione "if" nel codice C ++ potrebbe essere costituita da molte istruzioni macchina.
La parte del cancello AND andava bene, ma sei uscito dai binari con il cancello IF, che non esiste.Un'istruzione IF viene trasformata in una * serie * di istruzioni che confrontano i valori, mentre la simulazione presenta il risultato come se * fosse * stato eseguito in parallelo.
Oops errore di battitura, doveva essere OR.O davvero qualsiasi cancello.A parte questo, però, non sono sicuro di come la mia risposta sia "abbastanza lontana" dalla risposta di Dave.
@user3716057: È piuttosto lontano nel senso che non usa "una delle" sue porte AND ma attiva l'operazione AND dell'ALU che ** sempre ** opera sulla lunghezza della parola (8/16/32/68 bit)contemporaneamente a AND due registri insieme.Se vuoi operare su un singolo bit, devi usare in modo creativo le operazioni AND, OR, XOR, Left / Right Shift per ottenere ciò che desideri.
whatsisname
2014-07-17 20:45:33 UTC
view on stackexchange narkive permalink

La CPU non ha solo "un numero" di porte logiche pre-compilate. Un processore moderno ha da circa 50 milioni a diversi miliardi di transistor, corrispondenti a molti milioni di porte.

La CPU ha già tutte le risorse necessarie per eseguire il tuo programma C ++. Le risorse fornite soddisfano il set di istruzioni definito da quella piattaforma hardware, sia esso x86, ARM, MIPS, ecc. Queste istruzioni includono tutte istruzioni aritmetiche, spostamento della memoria, condizionali, ecc. Guarda i set di istruzioni della tua piattaforma per avere una comprensione di come la CPU stessa funziona effettivamente.

Quando la CPU esegue un'operazione "AND", mentre da qualche parte usa un cancello AND, ci sono milioni di porte AND nella CPU per tutti i tipi di operazioni.

Queste istruzioni sono tutte implementate nel layout dei transistor nel chip. Per vedere come funzionano alcuni di questi, cerca cose come infradito, Sommatori o altra logica digitale.

Ma è un numero limitato di cancelli.Quello che sto veramente ottenendo con la mia domanda è la seguente idea: se un FPGA ha bisogno di fare molti XOR, ad esempio, può farlo più velocemente sintetizzando più porte XOR e facendo tutta la logica in parallelo.Finché c'è ancora spazio sull'FPGA, è possibile costruire più gate.La CPU deve essere preparata per qualsiasi logica possibile, non può creare solo la logica di cui ha bisogno.Quindi, se il mio programma utilizza tonnellate di logica XOR ma nient'altro, la CPU non sarà in grado di sfruttare tutte le sue risorse.
@user3716057: Si tratta di compromessi.Ci sono CPU per scopi speciali che sono in grado di eseguire molti XOR in parallelo se questo è ciò di cui una particolare applicazione ha bisogno.Il popolare x86 ha istruzioni SIMD per questo genere di cose.Gli FPGA sono buoni per molte applicazioni e le CPU per scopi generali sono buoni per molte altre.
La tua prima frase è totalmente sbagliata.Ovviamente la CPU ha un numero di porte.Sembri obiettare a questo sulla base del fatto che è un numero elevato, il che è ... strano.
@OllieFord: Ho detto che per due ragioni, una, è che dire che una CPU ha solo "un numero di porte" trasmette un'idea sbagliata, come dire che il software è solo "uno e zero".Certo, entrambe sono vere, ma confondono l'idea.In secondo luogo, le CPU oggi non sono realmente progettate gate per gate, sono progettate da blocchi funzionali costituiti da poche e diverse migliaia di gate e transistor, disposti da software specializzato.Concentrarsi sui cancelli significa concentrarsi sul livello sbagliato.
Non sono d'accordo - penso che per una buona comprensione sia un'idea eccellente sapere cosa sia effettivamente una porta logica, come formano alcuni di quei blocchi funzionali e così via fino a come funziona il compilatore.
RBerteig
2014-07-18 02:22:50 UTC
view on stackexchange narkive permalink

Altre risposte hanno affrontato le domande specifiche a livello di dettaglio di dadi e bulloni, ma penso che qui ci sia un'opportunità per guardarle da una diversa angolazione. I processori oggi hanno molti milioni (miliardi nelle CPU desktop della generazione attuale) di transistor che implementano un numero relativamente elevato di porte. Sebbene solo alcune di queste porte siano effettivamente utilizzate per implementare il calcolo XOR , è difficile vederle nell'enorme foresta di funzioni di supporto.

I veterani qui ( Penso di poter ammettere di essermi guadagnato anche quell'etichetta) ho visto crescere quella foresta, ma è facile vedere come un nuovo arrivato sul campo con solo un po 'di esperienza di progettazione digitale potrebbe trovare difficile vedere i paralleli tra un hardware puro calcolo e una moderna CPU multi-core con molti livelli di cache, previsione dei rami ed esecuzione in pipeline.

Vi consiglio di trovare le schede tecniche e il materiale di riferimento del programmatore per diversi (ma uno alla volta) dei vecchi microprocessori a 8 bit degli anni '70 e '80. In molti casi, puoi persino trovare loro implementazioni open source sotto forma di emulatori software puri, nonché Verilog o VHDL da utilizzare in un FPGA.

Consiglio di iniziare da qui perché l ' 8080 (utilizzato nell'Altair 8800 del 1975 che ha lanciato il mercato dei computer più esigente), MC6800 (apparso in molti piccoli computer alla fine degli anni '70), 6809 (RadioShack Coco e altri), 6502 (Apple 1, Apple] [e molti altri) e molti altri come loro erano in gran parte progettato e implementato da singoli ingegneri o team molto piccoli e quindi doveva essere compreso appieno da un team molto piccolo. Dimostrano anche il numero minimo di funzionalità necessarie per una CPU di successo commerciale senza aggiungere memoria, cache o periferiche aggiuntive.

Gran parte del patrimonio dell'8080 è conservato nella pagina della famiglia Z80. Lo Z80 era l'estensione di Zilog della piattaforma Intel 8080 ei core che la implementano possono essere trovati ancora oggi. Un Verilog 8080 è su OpenCores.org, insieme a molte altre implementazioni 8080 e Z80. Esiste una grande quantità di documentazione, sistemi operativi, assemblatori e compilatori per l'architettura MCS80 e la sua vasta famiglia.

OpenCores ha un gran numero di core open source. Ci sono quasi 100 CPU pure, insieme ad altri 50 SOC circa che potrebbero essere la base per ulteriori esplorazioni.

Per curiosità, hai idea di quanto le caratteristiche architettoniche dei primi microcomputer assomigliassero ai computer precedenti (non "micro")?Penso che la maggior parte dei non microcomputer di solito operi con parole di dimensioni maggiori, ma posso certamente immaginare che per alcune applicazioni un computer a 8 bit o anche a 4 bit avrebbe potuto essere utile.
Ad esempio, penso che anche un computer a 4 bit potrebbe probabilmente gestire un sistema di punteggio automatizzato a tempo condiviso per 16 piste da bowling se potesse assemblare tre registri a quattro bit per formare indirizzi a 12 bit;costruire un computer a 4 bit da parti discrete sembrerebbe più economico che provare a progettare un sistema di punteggio automatizzato in qualche altro modo.
@supercat Alcune calcolatrici tascabili erano basate su una CPU a 4 bit, che si adattava abbastanza bene all'aritmetica BCD operando una cifra decimale alla volta.I risultati a 12 cifre decimali erano comuni.C'erano le prime macchine che utilizzavano un ALU a 1 bit in serie per eseguire calcoli utili su numeri maggiori.Molte delle prime macchine avevano dimensioni distinte per ALU, indirizzo e parola d'istruzione.L'8080 aveva un bus di indirizzi a 16 bit con un ALU a 8 bit e un accumulatore, per esempio.
Qualche "calcolatrice tascabile" è anteriore all'invenzione del microprocessore?Qualcuno di quelli che utilizzava una qualsiasi forma di CPU "documentata" che recuperava il codice da un archivio di codice indirizzabile (ROM), invece di utilizzare semplicemente la logica sequenziale per attivare varie azioni?
Simon Richter
2014-07-17 21:05:58 UTC
view on stackexchange narkive permalink

Come hai osservato, il contenuto della tabella di ricerca determina se una certa LUT è una porta OR (0, 1, 1, 1) e una porta AND (0, 0, 0, 1), una porta XOR (0 , 1, 1, 0) ecc.

La tabella di ricerca stessa è implementata utilizzando porte hardcoded, ovvero il risultato è

  (lut [0] AND NOT a AND NOT b) OR (lut [1] AND a AND NOT b) OR (lut [2] AND NOT a AND b) OR (lut [3] AND a AND b)  

Se tu guarda questa riga per riga, puoi vedere che solo una di queste righe può mai avere una logica, quindi questo seleziona una delle voci LUT. Allo stesso modo, puoi anche selezionare tra più origini dati:

Se op1 è il numero di registro a due bit, l'operando lhs può essere selezionato come

  (reg0 AND NOT op1 [0] AND NOT op1 [1]) OR (reg1 AND op1 [0] AND NOT op1 [1]) OR (reg2 AND NOT op1 [0 ] AND op1 [1]) OR (reg3 AND op1 [0] AND op1 [1])  

Quindi, opcode può selezionare l'operazione da eseguire:

  ((lhs AND rhs) AND NOT opcode [0] AND NOT opcode [1]) OR ((lhs OR rhs) AND opcode [0] AND NOT opcode [1]) OR ( (lhs + rhs) AND NOT codice operativo [0] AND codice operativo [1]) OR ((lhs - rhs) AND codice operativo [0] AND codice operativo [1])  

Dove res = (lhs + rhs) è definito come

  res [0] = lhs [0] XOR rhs [0]; res [1] = lhs [1] XOR rhs [1] XOR (lhs [0] AND rhs [0]); ...  

Quindi, alla fine, posso ridurre tutto a porte fisse, lasciando variabili solo gli input. Un FPGA è una di queste varianti, in cui i gate sono disposti in modo da eseguire una ricerca nella tabella.

In un sistema del mondo reale, ottimizzerei ulteriormente, ad es. combinare segnali equivalenti e tentare di ridurre al minimo la commutazione dei gate quando quel segnale viene successivamente eliminato da un gate AND e non avrà alcun effetto sul risultato:

  is_and_op = NOT opcode [0] AND NOT opcode [1];  

Più elementi del circuito vogliono sapere se stiamo attualmente eseguendo un'operazione "and".

  lhs_and = lhs AND is_and_op; rhs_and = rhs AND is_and_op;  

In caso contrario, passiamo degli zeri alle porte che eseguono l'operazione.

  res_and = lhs_and AND rhs_and;  

Questa è l'operazione effettiva, come prima.

  res = res_and AND is_and_op OR ...;  

La selezione può anche utilizzare la nostra scorciatoia.

La mia domanda era più su come una CPU esegue operazioni logiche.So come gli FPGA usano le LUT per costruire la logica.Come ha sottolineato un altro poster, le CPU non usano le LUT in questo modo.
Il punto è che una LUT è solo un insieme di porte fisse che implementa una logica di selezione che può quindi essere utilizzata per implementare una "porta" fornendo determinati input al processo di selezione.Cioè, tutto ciò che devi fare è fornire input, mentre l'hardware è fisso.
John
2014-07-18 16:42:57 UTC
view on stackexchange narkive permalink

La differenza tra una CPU e un FPGA è il parallelismo. Gli FPGA sono molto bravi a eseguire una serie di attività (logicamente) più semplici contemporaneamente con un ritardo minimo. Logiche e sequenze di operazioni più complesse sono soddisfatte meglio dall'ALU (Arithmetic and Logic Unit) della CPU.

Se sei interessato a un'emulazione software comune del design del gate, che viene tipicamente (se ingenuamente) impiegato per semplificare le funzioni logiche booleane, dai un'occhiata all ' algoritmo Quine – McCluskey. L'ho usato per progettare il mio software di sintesi presso Uni quando non potevo inoltrare il costoso studio e per divertimento.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...