Comenzaré desde el nivel más bajo que pueda ser relevante (puedo comenzar desde un nivel aún más bajo, pero probablemente sean demasiado irrelevantes), comenzando desde Atom, Electricidad, Transistores, Puertas lógicas, Circuitos integrados (Chip / CPU ) y finaliza en la Asamblea (supongo que está familiarizado con los niveles superiores).
Al principio
Átomo
El átomo es una estructura compuesta de electrones, protones y neutrones (que a su vez están compuestos de partículas elementales ). La parte más interesante del átomo para las computadoras y la electrónica son los electrones porque los electrones son móviles (es decir, pueden moverse con relativa facilidad, a diferencia de los protones y los neutrones, que son más difíciles de mover) y pueden flotar libremente por sí mismos sin estar dentro. un átomo.
Por lo general, cada átomo tiene el mismo número de protones y electrones, llamamos a este estado "neutral". Como sucede, es posible que un átomo pierda o gane electrones adicionales. Se dice que los átomos en este estado desequilibrado son átomos "cargados positivamente" (más protones que electrones) y átomos "cargados negativamente" (más electrones que protones) respectivamente.
Los electrones son indestructibles e indestructibles (no es así en mecánica cuántica, pero eso es irrelevante para nuestro propósito); así que si un átomo pierde un electrón, algún otro átomo cercano tuvo que recibir los electrones adicionales o el electrón tuvo que liberarse en un electrón flotante libre, por el contrario, dado que el electrón no es construible, para ganar un electrón adicional, un átomo tuvo que extraerlo de los átomos cercanos o de un electrón flotante libre. La mecánica de los electrones es tal que si hay un átomo cargado negativamente cerca de un átomo cargado positivamente, algunos electrones migrarán hasta que ambos átomos tengan la misma carga.
Electricidad
La electricidad es solo un flujo de electrones desde un área con un número muy alto de átomos con carga negativa a un área con un número muy alto de átomos con carga positiva. Ciertas reacciones químicas pueden crear una situación en la que tenemos un nodo con muchos átomos con carga negativa (llamado "ánodo") y otro nodo con muchos átomos con carga positiva (llamado "cátodo"). Si conectamos dos nodos con carga opuesta con un cable, las masas de electrones fluirán del ánodo al cátodo, y este flujo es lo que llamamos "corriente eléctrica".
No todos los cables pueden transmitir electrones con la misma facilidad, los electrones fluyen mucho más fácilmente en materiales "conductores" que en materiales "resistentes". Un material "conductor" tiene baja resistencia eléctrica (p. Ej., Alambres de cobre en los cables) y un material "resistente" tiene alta resistencia eléctrica (p. Ej., Aislamiento del cable de goma). Algunos materiales interesantes se denominan semiconductores (por ejemplo, silicio), porque pueden alterar su resistencia fácilmente, bajo ciertas condiciones un semiconductor podría actuar como conductor y en otras condiciones podría convertirse en una resistencia.
La electricidad siempre prefiere fluir a través del material con menor resistencia, por lo que si un cátodo y un ánodo están conectados con dos cables, uno con resistencia muy alta y el otro con resistencia muy baja, la mayoría de los electrones fluirán a través del cable de baja resistencia y casi ninguno fluye a través del material de alta resistencia.
La edad media
Interruptores y Transistores
Los interruptores / flip-flops son como sus interruptores de luz regulares, un interruptor se puede colocar entre dos pedazos de cable para cortar y / o restaurar el flujo de electricidad. Los transistores funcionan exactamente igual que un interruptor de luz, excepto que en lugar de conectar y desconectar físicamente los cables, un transistor conecta / desconecta el flujo de electricidad al alterar su resistencia dependiendo de si hay electricidad en el nodo base y, como ya habrás adivinado / sé, los transistores están hechos de semiconductores porque podemos alterar los semiconductores para convertirlos en una resistencia o un conductor para conectar o desconectar las corrientes eléctricas.
Un tipo común de transistor, el Transistor de unión bipolar NPN (BJT), tiene tres nodos: "base", "colector" y "emisor". En un NPN BJT, la electricidad puede fluir desde el nodo "emisor" al nodo "colector" solo cuando el nodo "base" está cargado. Cuando el nodo base no está cargado, prácticamente ningún electrón puede fluir a través y cuando el nodo base está cargado, los electrones pueden fluir entre el emisor y el colector.
El comportamiento de un transistor.
(Le sugiero que lea esto antes de continuar, ya que puede explicar mejor que yo con gráficos interactivos)
Digamos que tenemos un transistor conectado a una fuente eléctrica en su base y colector, y luego conectamos un cable de salida cerca de su colector (vea la Figura 3 en http://www.spsu.edu/cs/faculty/bbrown/web_lectures / transistores / ).
Cuando aplicamos electricidad a la base ni al colector, entonces no puede fluir electricidad ya que no hay electricidad de la que hablar:
B C | E O
0 0 | 0 0
Cuando aplicamos electricidad al colector pero no a la base, la electricidad no puede fluir al emisor ya que la base se convierte en un material de alta resistencia, por lo que la electricidad se escapa al cable de salida:
B C | E O
0 1 | 0 1
Cuando aplicamos electricidad a la base pero no al colector, tampoco puede fluir electricidad ya que no hay diferencia de carga entre el colector y el emisor:
B C | E O
1 0 | 0 0
Cuando aplicamos electricidad tanto a la base como al colector, obtenemos electricidad que fluye a través del transistor, pero dado que el transistor ahora tiene una resistencia menor que el cable de Salida, casi no fluye electricidad a través del cable de Salida:
B C | E O
1 1 | 1 O
Puertas lógicas
Cuando conectamos el emisor de un transistor (E1) al colector de otro transistor (C2) y luego conectamos una salida cerca de la base del primer transistor (O) (ver Figura 4 en http://www.spsu.edu / cs / faculty / bbrown / web_lectures / transistors / ), entonces sucede algo interesante. Digamos también que siempre aplicamos electricidad al colector del primer transistor (C1) y, por lo tanto, solo jugamos con los nodos base de los 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
Resumamos la tabla para que solo veamos B1, B2 y O:
B1 B2 | O
---------+-----
0 0 | 1
0 1 | 1
1 0 | 1
1 1 | 0
He aquí , si estás familiarizado con la lógica booleana y / o las puertas lógicas, debes notar que esta es precisamente la puerta NAND. Y si está familiarizado con la lógica booleana y / o las puertas lógicas, también puede saber que una NAND (así como una NOR) está funcionalmente completa , es decir, usando solo NAND, puede construir todas las otras puertas lógicas y el resto de la verdad mesas. En otras palabras, puede diseñar un chip de computadora completo utilizando puertas NAND solo.
De hecho, la mayoría de las CPU están (¿o solía estarlo?) Diseñadas usando NAND solo porque es más barato de fabricar que usando una combinación de NAND, NOR, AND, OR, etc.
Derivando los otros operadores booleanos de NAND
No describiría cómo hacer que todos los operadores booleanos, solo la puerta NOT y AND, puedan encontrar el resto en otro lugar.
Dado un operador NAND, entonces podemos construir una puerta NOT:
Given one input B
O = NAND(B, B)
Output O
Dado un operador NAND y NOT, entonces podemos construir una puerta AND:
Given two inputs B1, B2
C = NAND(B1, B2)
O = NOT(C) // or NAND(C,C)
Output O
Podemos construir otras puertas lógicas de manera similar. Como la compuerta NAND está funcionalmente completa , también es posible construir compuertas lógicas con más de 2 entradas y más de 1 salida, no voy a discutir cómo construir tales compuertas lógicas aquí.
Era de la Ilustración
Construyendo una máquina de Turing a partir de puertas booleanas
Una CPU es solo una versión más complicada de una máquina de Turing. Los registros de la CPU son el estado interno de la máquina de Turing, y la RAM es una cinta de la máquina de Turing.
Una máquina de Turing (CPU) puede hacer tres cosas:
- lea un 0 o 1 de la cinta (lea una celda de memoria de la RAM)
- cambiar su estado interno (cambiar sus registros)
- moverse hacia la izquierda o hacia la derecha (leer múltiples posiciones desde la RAM)
- escriba un 0 o 1 en la cinta (escriba en una celda de memoria en la RAM)
Para nuestro propósito, estamos construyendo la máquina Turing de 2 estados y 3 símbolos de Wolfram usando lógica combinatoria (las CPU modernas usarían microcódigo, pero son más complejas de lo necesario para nuestro propósito).
La tabla de estado de la máquina de Turing de Wolfram (2,3) es la siguiente:
A B
0 P1,R,B P2,L,A
1 P2,L,A P2,R,B
2 P1,L,A P0,R,A
Queremos volver a codificar la tabla de estado anterior como una tabla de verdad:
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
Realmente no voy a construir una puerta lógica de este tipo (no estoy seguro de cómo dibujarla en SE y probablemente será bastante grande), pero como sabemos que la puerta NAND está funcionalmente completa , entonces tenemos una manera para encontrar una serie de puertas NAND que implementarán esta tabla de verdad.
Una propiedad importante de Turing Machine es que es posible emular una computadora de programa almacenado usando una máquina de Turing que solo tiene una tabla de estados fijos. Por lo tanto, cualquier Máquina Universal de Turing puede leer su programa desde la Cinta (RAM) en lugar de tener que tener sus instrucciones codificadas en la tabla de estado interno. En otras palabras, nuestra máquina de Turing (2,3) puede leer sus instrucciones de los pines I1, I2 (como software) en lugar de estar codificados en la implementación de la puerta lógica (como hardware).
Microcódigos
Debido a la creciente complejidad de las CPU modernas, se vuelve prohibitivamente difícil usar solo la lógica combinatoria para diseñar una CPU completa. La CPU moderna generalmente está diseñada como un intérprete de instrucciones de microcódigos; Un microcódigo es un pequeño programa integrado en la CPU que utiliza la CPU para interpretar el código de máquina real. Este intérprete de microcódigo en sí está diseñado generalmente mediante lógica combinatoria.
Registro, caché y RAM
Hemos olvidado algo arriba. ¿Cómo recordamos algo? ¿Cómo implementamos la cinta y la RAM? La respuesta está en un componente electrónico llamado condensador. Un condensador es como una batería recargable, si se carga un condensador retendrá electrones adicionales y también puede devolver electrones a los circuitos.
Para escribir en un condensador, llenamos el condensador con electrones (escriba 1) o drenamos todos los electrones en el condensador hasta que esté vacío (escriba 0). Para leer el valor de un condensador, tratamos de descargarlo. Si, cuando intentamos descargar, no fluye electricidad, entonces el capacitor está vacío (leer 0), pero si detectamos electricidad, entonces el capacitor debe cargarse (leer 1). Puede notar que leer un condensador agota su almacén de electrones, las RAM modernas tienen los circuitos para recargar periódicamente el condensador para que puedan retener su memoria mientras haya electricidad.
Hay múltiples tipos de condensadores usados en una CPU, los registros de la CPU y los cachés de CPU de nivel superior se hacen usando "condensadores" de muy alta velocidad que en realidad están construidos a partir de transistores (por lo tanto, casi no hay "retraso" para leer / escribir desde ellos), estos se llaman RAM estática (SRAM); mientras que la memoria RAM principal se hace con una potencia más baja, pero con condensadores más lentos y mucho más baratos, estos se llaman RAM dinámica (DRAM).
Reloj
Un componente muy importante de una CPU es el reloj. Un reloj es un componente que "marca" regularmente para sincronizar el procesamiento. Un reloj típicamente contiene un cuarzo u otros materiales con un período de oscilación conocido y relativamente constante, y la circuitería del reloj mantiene y mide esta oscilación para mantener su sentido del tiempo.
Las operaciones de la CPU se realizan entre tics de reloj y las lecturas / escrituras se realizan en los ticks para garantizar que todos los componentes se muevan sincrónicamente y no se pisoteen entre sí mientras están en estados intermedios. En nuestra (2,3) Máquina de Turing, entre los tics del reloj, la electricidad pasa a través de las puertas lógicas para calcular la salida de la entrada (I1, I2, R (t)); y en el tictac del reloj, la grabadora de cinta escribirá O1, O2 en la cinta, el motor se moverá según el valor de M y el registro interno se escribirá a partir del valor de R (t + 1), luego el lector de cinta leerá la cinta actual y pondrá la carga en I1, I2 y el registro interno se volverá a leer en R (t).
Hablando con periféricos
Observe cómo la (2,3) máquina de Turing interactúa con su motor. Esa es una vista muy simplificada de cómo una CPU puede interactuar con un hardware arbitrario. El hardware arbitrario puede escuchar o escribir en un cable específico para entradas / salidas. En el caso de la máquina de Turing (2,3), su interfaz con el motor es solo un cable que le indica al motor que gire en sentido horario o antihorario.
Lo que no se dice en esta máquina es que el motor tenía que tener otro "reloj" que funcionara en sincronía con el "reloj" interno de la máquina para saber cuándo comenzar y dejar de funcionar, por lo que este es un ejemplo de transmisión de datos sincrónica . La otra alternativa comúnmente utilizada, la transmisión asincrónica, utiliza otro cable, llamado línea de interrupción, para comunicar puntos de sincronización entre la CPU y el dispositivo asincrónico.
Era digital
Código de máquina y ensamblaje
El lenguaje ensamblador es un mnemónico legible por humanos para los códigos de máquina. En el caso más simple, hay un mapeo uno a uno entre el ensamblaje y el código de la máquina; aunque en los lenguajes de ensamblaje modernos, algunas instrucciones pueden correlacionarse con múltiples códigos de operación.
Lenguaje de programación
Todos estamos familiarizados con esto, ¿no?
Uf, finalmente terminado, escribí todo esto en solo 4 horas, así que estoy seguro de que hay un error en alguna parte (principalmente soy un programador, no un ingeniero eléctrico ni un físico, por lo que podría haber varias cosas que están completamente mal). Por favor, si encuentra un error, no dude en dar un @ grito o arreglarlo usted mismo si tiene el representante o crear una respuesta complementaria.