Iniciarei do nível mais baixo que possa ser relevante (posso começar de um nível ainda mais baixo, mas provavelmente são irrelevantes), iniciando de Atom, Eletricidade, Transistores, Logic Gates, Circuitos Integrados (Chip / CPU) ) e termina na Assembléia (presumo que você esteja familiarizado com os níveis mais altos).
No início
Átomo
O átomo é uma estrutura composta de elétrons, prótons e nêutrons (que são compostos de partículas elementares ). A parte mais interessante do átomo para computadores e eletrônicos são os elétrons porque os elétrons são móveis (isto é, podem se mover com relativa facilidade, ao contrário de prótons e nêutrons que são mais difíceis de se mover) e podem flutuar livremente sem serem mantidos dentro um átomo.
Normalmente, cada átomo tem um número igual de prótons e elétrons, que chamamos de estado "neutro". Por acaso, é possível que um átomo perca ou obtenha elétrons extras. Dizem que átomos nesse estado desequilibrado são átomos de "carga positiva" (mais prótons do que elétrons) e átomos de "carga negativa" (mais elétrons que próton), respectivamente.
Os elétrons são inconstrutíveis e indestrutíveis (não na mecânica quântica, mas isso é irrelevante para o nosso propósito); Portanto, se um átomo perde um elétron, outro átomo próximo precisa receber os elétrons extras ou o elétron precisa liberar-se em um elétron flutuante livre, por outro lado, como o elétron é inconstrutível, para ganhar elétrons extras, um átomo precisa absorvê-lo de átomos próximos ou de um elétron flutuante livre. A mecânica dos elétrons é tal que, se houver um átomo carregado negativamente próximo a um átomo carregado positivamente, alguns elétrons migrarão até que ambos os átomos tenham a mesma carga.
Eletricidade
A eletricidade é apenas um fluxo de elétrons de uma área com número muito alto de átomos com carga negativa para uma área com número muito alto de átomos com carga positiva. Certas reações químicas podem criar uma situação em que temos um nó com muitos átomos com carga negativa (chamado "ânodo") e outro nó com muitos átomos com carga positiva (chamado "cátodo"). Se conectarmos dois nós com carga oposta a um fio, massas de elétrons fluirão do ânodo para o cátodo, e esse fluxo é o que chamamos de "corrente elétrica".
Nem todos os fios podem transmitir elétrons de maneira igualmente fácil, os elétrons fluem muito facilmente em materiais "condutores" do que em materiais "resistentes". Um material "condutor" possui baixa resistência elétrica (por exemplo, fios de cobre nos cabos) e um material "resistente" possui alta resistência elétrica (por exemplo, isolamento do cabo de borracha). Alguns materiais interessantes são chamados de semicondutores (por exemplo, silicons), porque podem alterar sua resistência facilmente, sob certas condições um semicondutor pode atuar como condutor e, em outras condições, pode se transformar em um resistor.
A eletricidade sempre prefere fluir através do material com menor resistência; portanto, se um cátodo e um ânodo estiverem conectados com dois fios, um com resistência muito alta e outro com resistência muito baixa, a maioria dos elétrons fluirá através do cabo de baixa resistência e quase nenhum flui através do material de alta resistência.
A Idade Média
Switches e transistores
Interruptores / flip-flops são como os interruptores de luz comuns; um interruptor pode ser colocado entre dois pedaços de fio para cortar e / ou restaurar o fluxo de eletricidade. Os transistores funcionam exatamente da mesma maneira que um interruptor de luz, exceto que, em vez de conectar e desconectar fisicamente os fios, um transistor conecta / desconecta o fluxo de eletricidade, alterando sua resistência, dependendo da existência de eletricidade no nó base e, como você já deve ter adivinhado Sei que transistores são feitos de semicondutores porque podemos alterar o semicondutor para se tornar um resistor ou um condutor para conectar ou desconectar correntes elétricas.
Um tipo comum de transistor, o transistor de junção bipolar NPN (BJT), possui três nós: "base", "coletor" e "emissor". Em um NPN BJT, a eletricidade pode fluir do nó "emissor" para o nó "coletor" somente quando o nó "base" é carregado. Quando o nó base não é carregado, praticamente nenhum elétron pode fluir através dele e, quando o nó base é carregado, os elétrons podem fluir entre o emissor e o coletor.
O comportamento de um transistor
(Eu sugiro que você leia isso antes de continuar, pois ele pode explicar melhor do que eu com gráficos interativos)
Digamos que temos um transistor conectado a uma fonte elétrica em sua base e coletor e, em seguida, conectamos um cabo de saída próximo ao coletor (veja a Figura 3 em http://www.spsu.edu/cs/faculty/bbrown/web_lectures / transistores / ).
Quando aplicamos eletricidade a nenhuma base ou coletor, nenhuma eletricidade pode fluir, uma vez que não há eletricidade para falar:
B C | E O
0 0 | 0 0
Quando aplicamos eletricidade ao coletor, mas não à base, a eletricidade não pode fluir para o emissor, pois a base se torna um material de alta resistência; portanto, a eletricidade escapa para o fio de saída:
B C | E O
0 1 | 0 1
Quando aplicamos eletricidade à base, mas não ao coletor, também não há eletricidade que possa fluir, pois não há diferença de carga entre o coletor e o emissor:
B C | E O
1 0 | 0 0
Quando aplicamos eletricidade à base e ao coletor, obtemos eletricidade fluindo através do transistor, mas como o transistor agora possui menor resistência que o fio de saída, quase nenhuma eletricidade flui através do fio de saída:
B C | E O
1 1 | 1 O
Portões lógicos
Quando conectamos o emissor de um transistor (E1) ao coletor de outro transistor (C2) e, em seguida, conectamos uma saída próxima à base do primeiro transistor (O) (veja a Figura 4 em http://www.spsu.edu / cs / faculdade / bbrown / web_lectures / transistors / ), então algo interessante acontece. Digamos também que sempre aplicamos eletricidade ao coletor do primeiro transistor (C1) e, portanto, brincamos apenas com os nós de base dos transistores (B1, B2):
B1 B2 C1 E1/C2 | E2 O
----------------------+----------
0 0 1 0 | 0 1
0 1 1 0 | 0 1
1 0 1 0 | 0 1
1 1 1 1 | 1 0
Vamos resumir a tabela para ver apenas B1, B2 e O:
B1 B2 | O
---------+-----
0 0 | 1
0 1 | 1
1 0 | 1
1 1 | 0
Eis que , se você estiver familiarizado com a Boolean Logic e / ou Logic Gates, observe que esse é precisamente o portão NAND. E se você estiver familiarizado com a lógica booleana e / ou portas lógicas, também deve saber que um NAND (assim como o NOR) está funcionalmente completo , ou seja, usando apenas o NAND, é possível construir todos os outros portões lógicos e o resto da verdade tabelas. Em outras palavras, você pode projetar um chip de computador inteiro usando apenas portas NAND.
De fato, a maioria das CPUs é (ou costumava ser?) Projetada usando NAND apenas uma vez que é mais barato fabricar do que usar uma combinação de NAND, NOR, AND, OR etc.
Derivando os outros operadores booleanos do NAND
Eu não descreveria como criar todos os operadores booleanos, apenas o NOT e o gate AND, você pode encontrar o resto em outro lugar.
Dado um operador NAND, podemos construir uma porta NOT:
Given one input B
O = NAND(B, B)
Output O
Dado um operador NAND e NOT, podemos construir um portão AND:
Given two inputs B1, B2
C = NAND(B1, B2)
O = NOT(C) // or NAND(C,C)
Output O
Podemos construir outros portões lógicos de maneira semelhante. Como a porta NAND é funcionalmente completa , também é possível construir portas lógicas com mais de 2 entradas e mais de 1 saída, não discutirei como construir essas portas lógicas aqui.
Idade do Iluminismo
Construindo uma máquina de Turing a partir de portas booleanas
Uma CPU é apenas uma versão mais complicada de uma máquina de Turing. Os registradores da CPU são o estado interno da máquina de Turing e a RAM é uma fita da máquina de Turing.
Uma máquina de Turing (CPU) pode fazer três coisas:
- ler um 0 ou 1 da fita (ler uma célula da memória da RAM)
- alterar seu estado interno (alterar seus registros)
- mover para a esquerda ou direita (leia várias posições da RAM)
- escreva 0 ou 1 na fita (escreva para uma célula da memória na RAM)
Para nosso propósito, estamos construindo a Máquina de Turing de dois estados e três símbolos da Wolfram usando lógica combinatória (as CPUs modernas usariam microcódigo, mas são mais complexas do que o necessário para o nosso propósito).
A tabela de estados da Máquina de Turing da Wolfram (2,3) é a seguinte:
A B
0 P1,R,B P2,L,A
1 P2,L,A P2,R,B
2 P1,L,A P0,R,A
Queremos reencodificar a tabela de estados acima como uma tabela de verdade:
Let I1,I2 be the input from the tape reader (0 = (0,0), 1 = (0,1), 2 = (1,0))
Let O1,O2 be the tape writer (symbol encoding same as I1,I2)
Let M be connected to the machine's motor (0 = move left, 1 = move right)
Let R be the machine's internal state (A = 0, B = 1)
(R(t) is the machine's internal state at timestep t, R(t+1) at timestep t+1)
(Note that we used two input and two outputs since this is a 3-symbol Turing machine.)
R 0 1
I1,I2
(0,0) (0,1),1,1 (1,0),0,0
(0,1) (1,0),0,0 (1,0),1,1
(1,0) (0,1),0,0 (0,0),1,0
The truth table for the state table above:
I1 I2 R(t) | O1 O2 M R(t+1)
-------------+--------------------
0 0 0 | 0 1 1 1
0 0 1 | 1 0 0 0
0 1 0 | 1 0 0 0
0 1 1 | 1 0 1 1
1 0 0 | 0 1 0 0
1 0 1 | 0 0 1 0
Eu realmente não vou construir uma porta lógica (não sei como desenhá-la no SE e provavelmente será enorme), mas como sabemos que a porta NAND está funcionalmente completa , temos uma maneira para encontrar uma série de portas NAND que implementarão essa tabela de verdade.
Uma propriedade importante da Turing Machine é que é possível emular um computador de programa armazenado usando uma máquina de Turing que possui apenas uma tabela de estados fixos. Portanto, qualquer Universal Turing Machine pode ler seu programa a partir da fita (RAM), em vez de ter que ter suas instruções codificadas na tabela de estado interna. Em outras palavras, nossa (2,3) Máquina de Turing pode ler suas instruções dos pinos I1, I2 (como software), em vez de ser codificada na implementação da porta lógica (como hardware).
Microcódigos
Devido à crescente complexidade das CPUs modernas, torna-se proibitivamente difícil usar a lógica combinatória sozinha para projetar uma CPU inteira. A CPU moderna é geralmente projetada como um intérprete de instruções de microcódigos; um microcódigo é um pequeno programa incorporado à CPU que é usado pela CPU para interpretar o código real da máquina. Esse próprio interpretador de microcódigo geralmente é projetado usando lógica combinatória.
Registro, cache e RAM
Esquecemos algo acima. Como nos lembramos de algo? Como implementamos a fita e a RAM? A resposta está em um componente eletrônico chamado Capacitor. Um capacitor é como uma bateria recarregável; se um capacitor estiver carregado, ele reterá elétrons extras e também poderá retornar elétrons ao circuito.
Para gravar em um capacitor, enchemos o capacitor com elétron (escreva 1) ou drenamos todos os elétrons no capacitor até que ele fique vazio (escreva 0). Para ler o valor de um capacitor, tentamos descarregá-lo. Se, quando tentamos descarregar, não há eletricidade fluindo, o capacitor está vazio (leia 0), mas se detectarmos eletricidade, o capacitor deve ser carregado (ler 1). Você pode notar que a leitura de um capacitor drena sua reserva de elétrons; as RAMs modernas têm o circuito para recarregar periodicamente o capacitor, para que possam reter sua memória enquanto houver eletricidade.
Existem vários tipos de capacitores usados em uma CPU, os registros da CPU e os caches de CPU de nível mais alto são feitos usando "capacitores" de alta velocidade, que são realmente construídos a partir de transistores (portanto, quase não há "atraso" para ler / gravar a partir de eles), eles são chamados de RAM estática (SRAM); enquanto a memória principal RAM é feita usando menos energia, mas capacitores mais lentos e muito mais baratos, eles são chamados de RAM dinâmica (DRAM).
Relógio
Um componente muito importante de uma CPU é o relógio. Um relógio é um componente que "marca" regularmente para sincronizar o processamento. Um relógio normalmente contém um quartzo ou outros materiais com um período de oscilação conhecido e relativamente constante, e o circuito do relógio mantém e mede essa oscilação para manter seu senso de tempo.
As operações da CPU são realizadas entre os ticks do relógio e a leitura / gravação é feita nos ticks para garantir que todos os componentes se movam de forma síncrona e não pisem entre si enquanto estiverem em estados intermediários. Em nossa (2,3) Máquina de Turing, entre os tiques do relógio, a eletricidade passa pelos portões lógicos para calcular a saída da entrada (I1, I2, R (t)); e, no relógio, o gravador grava O1, O2 na fita, o motor se move dependendo do valor de M e o registro interno é gravado a partir do valor de R (t + 1), depois o leitor de fita lerá a fita atual e carregará I1, I2 e o registro interno será relido novamente para R (t).
Conversando com Periféricos
Observe como a (2,3) Turing Machine faz interface com seu motor. Essa é uma visão muito simplificada de como uma CPU pode interagir com um hardware arbitrário. O hardware arbitrário pode ouvir ou gravar em um fio específico para entradas / saídas. No caso da Máquina de Turing (2,3), sua interface com o motor é apenas um único fio que instrui o motor a girar no sentido horário ou anti-horário.
O que não foi dito nesta máquina é que o Motor precisava de outro "relógio" que funcionasse em sincronia com o "relógio" interno da Máquina para saber quando iniciar e parar de funcionar, portanto, este é um exemplo de transmissão de dados síncrona . A outra alternativa comumente usada, a transmissão assíncrona usa outro fio, chamado linha de interrupção, para comunicar pontos de sincronização entre a CPU e o dispositivo assíncrono.
Idade digital
Código da máquina e montagem
A linguagem assembly é um mnemônico legível por humanos para códigos de máquina. No caso mais simples, há um mapeamento individual entre o código de montagem e a máquina; embora em linguagens assembly modernas, algumas instruções possam ser mapeadas para vários opcodes.
Linguagem de programação
Todos nós estamos familiarizados com isso, não estamos?
Ufa, finalmente terminei, digitei tudo isso em apenas 4 horas, por isso tenho certeza de que há um erro em algum lugar (sou principalmente um programador, não engenheiro elétrico nem físico, então pode haver várias coisas que são flagrantemente erradas). Por favor, se você encontrou um erro, não hesite em dar um @yell ou consertar você mesmo se tiver o representante ou criar uma resposta complementar.