Introducción
Vamos a empezar esta serie con una descripción del CPU 6502, estudiando para qué sirve cada patita de este chip (que básicamente es el pin out) y cómo funciona su arquitectura interna. Vamos a estudiar que registros tiene y para qué sirven. Luego vamos a seguir contando cómo recrear esta placa PCB desde cero y terminaremos con un experimento que nos permitirá ver nuestra primera instrucción del 6502 ejecutándose.
Descripción general del CPU 6502
Un CPU es la unidad central de procesamiento donde se ordena lo que sucede dentro de una computadora y se realizan típicamente los cálculos matemáticos y el manejo del direccionamiento de la computadora.
El CPU 6502 fue creado por Chuck Peddle y Bill Mensh de MOS Technologies y fue muy utilizado en el final de los años 70 y principios de los 80. Esta familia de CPUs se utilizó en la Apple 1, la Apple 2 como 6502, en la Commodore 64 en su variante 6510 y en el Atari VCS en su variante 6507.
El 6502 todavía sigue siendo muy utilizado teniendo versiones actuales de los fabricantes USM y WDC siendo la versión actual la 65C02 la cuál agrega algunas instrucciones extras de assembler y baja mucho el consumo eléctrico.
Pinout CPU 6502
Este chip posee un formato DIP 40 (dual in-line package) con las siguientes funciones en sus pines o patitas.
VPB (OUTPUT) La B significa Bar o Barra para que este pin se active el voltaje tiene que ser Low o 0v. Este pin sirve para indicar que se está accediendo a una dirección a través de un vector durante una interrupción. Solo está en la versión de WDC del chip 6502 en los otros fabricantes es sólo un GROUND adicional. Con la marca WDC se puede dejar desconectado con las demás marcas se debe conectar a ground.
RDY (INPUT) El pin ready se utiliza para decirle al microprocesador que tiene que frenar y mantener al mismo en el estado actual, congelado, refrescando todos los registros y sin perder ningún dato. Para activarlo y que frene el pin espera un estado low o 0 Volts. Por ejemplo al recibir un estado Low (0 volts) en el pin todas las líneas de output van a mantener los valores de corriente que tenían mostrando qué dirección estaban buscando. Es ideal para hacer un estudio de instrucción por instrucción del chip.
PHI1 o ɸ1 (OUTPUT) Pin de Salida de Reloj, el mismo es una salida de reloj para conectar a otros dispositivos. El PHI1 es típicamente la señal del PHI2 pero invertida.
IRQB (INPUT) Pin de interrupción. Al conectar este pin a 0V, si las interrupciones están habilitadas, el procesador guardará el contenido de los registros actuales y buscará en las posiciones de memoria de vector FFFE y FFFF donde está otra posición de memoria que contiene la primera instrucción a ejecutar para atender a esta interrupción.
MLB (OUTPUT) El pin de Memory lock se usa para mantener la integridad de las instrucciones Read-Modify-Write en un sistema multiprocesador. Cuando presenta un valor Low o 0 volts indica que algún otro circuito debe arbitrar el ciclo del bus. Es un pin de Output
NMIB (INPUT) Pin de interrupción no enmascarable. Al conectar este pin a 0V el procesador guardará el contenido de los registros actuales y buscará en las posiciones de memoria de vector FFFA y FFFB donde está otra posición de memoria que contiene la primera instrucción a ejecutar para atender a esta interrupción. Este tipo de interrupción es incondicional y siempre será honrada.
SYNC (OUTPUT) Pin de sincronía El ciclo del procesador donde trae el código de operación (OpCode) se indican con el pin SYNC en high. Cuando el procesador busca un código de operación el pin queda en high y queda high por todo el resto del ciclo. Vamos a estudiarlo al diseñar un programa que interprete cuando en el bus de datos se representa una instrucción.
VDD o VCC (INPUT) Pin de Energia. El procesador típicamente trabaja con +5v.
AB0 a AB15 (OUTPUT) Pines del Bus de Direccionamiento. Son pines unidireccionales en los cuáles el procesador va a escribir las direcciones de los dispositivos a los cuales comunicarse (memorias, otros chip en la placa, registros de I/O, etc). Al ser un bus de 16 bits direcciona hasta 65536 bytes o desde $0000 hasta $FFFF.
VSS (INPUT) Pin de Ground, este pin se conecta al common ground del diseño.
DB0 a DB7 (INPUT/OUTPUT) Pines del Bus de datos, Este es un bus bidireccional que permite recibir y escribir datos junto con el bit de R/W a memorias y registros de I/O.
R/W (OUTPUT) Pin de Lectura/Escritura. Este pin indica si el procesador está realizando una lectura o una escritura. Cuando se encuentra en 1 o en estado High el procesador está realizando una lectura cuando está en 0 o estado Low una escritura.
NC No Connect, este es un pin que no se debe conectar ya que no está conectado a nada dentro del procesador. No se utiliza
BE (INPUT) Pin de Bus Enable, cuando este pin esta High o +5v los pines de address, data y RW están activos, cuando está low o 0v quedan con impedancia alta sacando al procesador del bus.
PHI2 (INPUT) Pin de entrada de Reloj, Este pin permite conectar un reloj externo al procesador para sincronizarse con otros dispositivos. Es el pin que vamos a utilizar en nuestros desarrollos para conectar un reloj externo.
SOB (INPUT) Pin de Set Overflow. Este pin cuando recibe un cambio de high a low prende el bit de Overflow en el Status Register del procesador (bit 6). No se usó mucho en el pasado y no se recomienda su uso.
PHI2O (OUTPUT) Pin de Salida de Reloj, el mismos es una salida de reloj para conectar a otros dispositivos con la misma onda que el reloj que recibe en PHI2.
RESB (INPUT) Pin de reset, este pin sirve para realizar un reset del procesador cuando se conecte a 0v. El reset tomará 7 ciclos de reloj y buscará en las posiciones de memoria FFFC y FFFD donde está el vector (otra posición de memoria) que posee la primera instrucción a ejecutar. El reset debe ser mantenido en 0v por lo menos durante dos ciclos de reloj para que sea reconocido.
Recomendaciones Generales de conexión
Se recomienda que los pines RDY IRQ NMI SOB BE estén conectados a +5v a través de una resistencia de 1K.
El pin VP deberá estar conectado a 0v a través de una resistencia de 1K, en modelos no Western Design Center este pin es sólo un GROUND.
Descripción de Funcionamiento del CPU 6502
Arquitectura
Es un procesador de 8 bits ya que todas sus instrucciones en código máquina pueden referenciarse utilizando 8 bits. La arquitectura interna está dividida en dos partes una sección con los registros y otra con las operaciones de control, las señales que provocan transferencias de datos están en la sección de control.
En el diagrama podemos ver que la señal de reset RESB entra a la caja de Interrupt Logic y de Instruction Decode esto es así por qué un reset no es más que una instrucción BRK (código binario 0000 0000) o $00 cargado desde el hardware.
Set de instrucciones
El código máquina del 6502 posee instrucciones que pueden operar sin argumentos, con un sólo argumento explícito y con dos argumentos.
Agrego algunas instrucciones extras del modelo 65C02 (las marcadas con punto en la siguiente tabla) que NO recomiendo usar para poder mantener compatibilidad con toda la familia del 650X como ser el 6510 y el 6507, ahorran algunos pasos al no tener, por ejemplo, que pasar por el acumulador para guardar el registro X en el stack con la instrucción PHX.
El 65C02 es una versión más moderna del MOS 6502 siendo una ventaja el ser fully static por lo que se puede parar el clock y los registros no pierden sus valores.
Velocidad de Reloj
El procesador 6502 original soporta una velocidad de reloj de hasta 1Mhz, con versiones modernas soportando mayores velocidades.
Registros
La cantidad de registros y la forma de accederlos se mantienen para toda la familia, estos son los familiares A, X e Y, el Status Register y el Stack Pointer los 5 de 8 bits y el Program Counter de 16 bits donde tendremos las direcciones de memoria de la siguiente instrucción en nuestro programa.
Modos de direccionamiento
El 6502 posee diferentes modos de direccionamiento pudiendo cargar datos directamente a memoria, o un número literal al acumulador, o en forma indexada datos y hasta aplicar funciones que trabajan con el acumulador sin tocar memoria.
Bus de Direccionamiento y Bus de Datos
El procesador posee 16 líneas de direccionamiento (pines A0 a A15) pudiendo manejar entre memoria y registros de I/O hasta 64Kb (2ˆ16 = 65536 bytes) y 8 líneas de datos (pines D0 a D7) para poder mover información de hasta 1 byte por vez.
Circuito de la Placa CPU 6502 de la 20c
El siguiente gráfico muestra el circuito que explica el funcionamiento de la placa CPU 6502.
El circuito posee los siguientes elementos:
SOCKET CPU 6502
El cual está representado físicamente como un socket DIP-40 de 40 pines, a cada uno de estos pines se le conectó un Netlist representando cada una de las funciones de estos pines por ejemplo el netlist A0 representa el pin A0 que estará conectado a todos los elementos que tenga que estar conectados con la línea o trace del address 0.
Tiene conectado los netlists de A0 a A15, D0 a D7 y todos los netlist de EXPANSION BUS
HEADER ADDRESS
Este es un header hembra de 16 pines el cuál se usa para conectar el address bus, el mismo tiene conectados 16 netlist (o conexiones entre varios pines que tienen la misma información). Estos netlist corresponden a los pines A0 hasta A15.
Tenemos dos de estos conectores para poder tener la información en la parte superior e inferior de la placa y realizar interconexiones con otras placas.
HEADER DATA
Este es un header hembra de 8 pines el cuál se usa para conectar el data bus, el mismo tiene conectados 8 netlist (o conexiones entre varios pines que tienen la misma información). Estos netlist corresponden a los pines D0 hasta D7.
Tenemos dos de estos conectores para poder tener la información en la parte superior e inferior de la placa y realizar interconexiones con otras placas.
HEADER EXPANSION
Este es un header hembra de 16 pines el cuál se usa para conectar el address bus, el mismo tiene conectados 16 netlist (o conexiones entre varios pines que tienen la misma información). Estos netlist corresponden a algunos netlist conectados directamente a pines del CPU 6502 como ser:
RST, CLOCK, RW, PHI2_OUT, RDY, IRQ, NMI, PHI1_OUT, ML, SYNC, SO, BE, VP
Y otros que nos permiten pasar información de otras placas si quisiéramos usando los mismos de expansión con otras señales a elección:
E13, E14 y E15
Tenemos dos de estos conectores para poder tener la información en la parte superior e inferior de la placa y realizar interconexiones con otras placas.
HEADER POWER y GROUND
Este header posee dos pines y están conectados a las capas de 5V y de GROUND respectivamente. Tenemos cuatro de estos conectores, uno en cada esquina de la placa.
También tenemos headers de 5V y de GROUND por 8 pines cada uno para poder conectar distintos pines del 6502 que necesitan estar en valores digitales de 0 o 1 y no pueden estar flotando. Están conectados a las capas de 5V y de GROUND respectivamente. Tenemos dos de estos conectores de 5v y dos de GROUND dándonos un total de 16 pines para cada valor. Siempre se recomienda conectarlo a los pines correspondientes del CPU con resistencias de al menos 1K ohm,
CIRCUITO RESET
El mismo consiste en una resistencia conectada a +5v y al botón reset que mantiene el mismo en el valor digital 1. Cuando se pulsa el botón de reset el mismo al estar conectado al pin de reset del 6502 y a GROUND 0v pasa el valor digital 0 al cpu y este comienza el ciclo de reset.
CAPACITOR
Tenemos un capacitor de 0.1 microFaradios para que cuando el CPU arranca pueda disponer del pico extra de energía que necesita
AGUJEROS para TORNILLOS
Para poder fijar nuestra placa a distintos lugares la misma cuenta con 6 agujeros para tornillos de 3mm o M3.
NETLIST
Los componentes están conectados entre sí a través de un objeto llamado netlist el cual nos permite tener diagramas más limpios.
Este funciona de forma tal que todo lo que tenga el mismo nombre pertenece al mismo netlist y deberá estar conectado junto cuando hagamos el PCB (con traces). Así por ejemplo en el diagrama podemos observar el pin 33 del socket del CPU con un netlist llamado D0 deberá estar conectado al pin 1 del header data que también está conectado al netlist D0.
PCB de la Placa CPU 6502 de la 20c
El siguiente PCB explica cómo se ubican los elementos y traces para conectar nuestro circuito. El PCB es de 4 capas teniendo en la capa llamada TOP todas las conexiones de nuestros netlist a través de traces, los cuáles son finas capas de cobre que conectan los mismos como si fueran cables.
Tenemos dos capas especiales llamadas 5v y GROUND donde conectaremos las conexiones de power y ground o masa. Al usar estas conexiones en capas separadas nos ahorramos muchos centímetros de traces que deberían conectarse a pines con los voltajes de 5V y GROUND y podemos conectar directamente estos pines a la capa correspondiente.
Otra ventaja de tener una capa entera para GROUND es poder aislar el ruido eléctrico de las conexiones entre componente.
Por último tenemos la capa de BOTTOM donde se sueldan nuestros componentes y tenemos conexiones adicionales.
Modelado 3D
Cuando terminamos de realizar nuestra Placa debemos proceder al modelado 3D de la misma para observar cómo queda y si nos gusta el lugar donde pusimos cada componente.
Generación de archivos fuente
Para poder mandar a fabricar nuestro PCB deberemos contar con al menos 3 archivos:
- Archivo .gerber donde le indicamos al fabricante como armar nuestra placa
- Archivo BOM o Bill of materials donde se encuentran todos los componentes que forman nuestra placa con el código de producto del fabricante.
- Archivo Pick and Place donde le indicamos al fabricante cómo ubicar los componentes en nuestra placa PCB.
Estos archivos los van a encontrar previamente generados en el github de Osolabs. También incluimos archivos para poder editar el circuito con el software EasyEDA o Altium Designer.
Gerber_v03_CPU6502_4Plane.zip
Este archivo contiene todos los planos para poder generar nuestra placa PCB.
BOM_v03_CPU6502_4Plane.xlsx
Contiene todos los componentes de nuestra placa y el código del fabricante que identifica a ese componente.
PickAndPlace_v03_CPU6502_4Plane.xlsx
Indica en qué parte del PCB va cada componente y en qué capa debe ubicarse.
ProDoc_v03_CPU6502_4Plane.epro
Archivo para EasyEDAPro con el circuito y el PCB el cual puede editarse.
Altium_Circuit_v03_CPU6502_4Plane.schdoc
Contiene el diseño del circuito editable con el programa Altium Designer.
Altium_PCB_v03_CPU6502_4Plane.pcbdoc
Contiene el diseño del PCB editable con el programa Altium Designer.
cpu6502_3dModel.png
Es una imagen del modelo del PCB en 3 dimensiones
cpu6502_Circuit.png
Es una imagen del circuito de la placa CPU 6502
PCB_v03_CPU6502_4Plane_2024-06-29.pdf
Es un PDF con un dibujo de cada capa del PCB
Preparación de las Placa CPU
Al recibir nuestra placa de la fábrica y antes de comenzar a utilizar la misma y al momento que la sacamos de la caja, hay algunas tareas que deberemos hacer para poder hacer uso al máximo de la misma:
- Remover los bordes de manipulación de la placa
- Limpiar placa con alcohol isopropílico
- OPCIONAL – Poner un zócalo ZIF de 40 pines en el socket presente en la placa
- Poner el cpu 6502 en el socket
- Ajustar a mano las patas del chip para que calcen el socket
- Alinear pin 1 con el pin 1 en el socket
- Primero insertar un lado del chip, poniendo el mismo en diagonal y luego el otro lado
- Verificar que ninguna patita quedó doblada
- Hacer presión y ver que todas están bien ajustadas en el socket
- Poner Tornillos de soporte de la placa para que esté levantada por encima de la superficie.
Guía de Conexión de la placa CPU 6502 de la 20c
Vamos a explicar como conectar los distintos componentes de la placa para dejar esta lista para funcionar en una maqueta. Esta es una configuración con todas las placas que vamos a utilizar aunque todavía no las hayamos vistos. Puedes tener esta sección como referencia para cuando ensambles toda la 20c.
CPU 6502
Para configurar la placa de CPU 6502 vamos a realizar las siguientes conexiones.
- Conectamos todos los pines del ADDRESS BUS del A0 al A15 hacia la placa externa a la cual llevamos la señal. Puede ser directamente a la placa ROM o RAM, una placa BUS ADDRESS DATA EXPANSION o cualquier otra a la que llevemos esa señal desde el procesador. Recordemos que las direcciones del address bus se generan en el procesador.
- Conectamos todos los pines del DATA BUS del D0 al D15 hacia la placa externa a la cual llevamos la señal. Puede ser directamente a la placa ROM o RAM, una placa BUS ADDRESS DATA EXPANSION o cualquier otra a la que llevemos esa señal desde el procesador.
- Conectar al pin de CLOCK del EXPANSION BUS un cable desde la placa de CLOCK header CLOCK 555 OUT pin CLK.
- Conectar al pin de CLOCK de otro EXPANSION BUS un cable desde la placa de CPU hacia la placa a la que le querramos dar señal de reloj.
- Conectar el pin RDY del EXPANSION BUS a 5v con una resistencia de 1k ohm.
- Conectar el pin IRQ del EXPANSION BUS a 5v con una resistencia de 1k ohm.
- Conectar el pin NMI del EXPANSION BUS a 5v con una resistencia de 1k ohm.
- Conectar el pin SO del EXPANSION BUS a 5v con una resistencia de 1k ohm.
- Conectar el pin BE del EXPANSION BUS a 5v con una resistencia de 1k ohm.
- Conectar el pin VP del EXPANSION BUS a 0v con una resistencia de 1k ohm.
- Conectar los pines 5v y GROUND a una fuente de 5V y 0v, respectivamente.
Sugiero la siguiente guía de colores si vamos a utilizar cables con terminales macho/macho tipo dupont:
Experimento 1 – Viendo el proceso de Reset y la instrucción NOP
Veamos cómo funciona el RESET de nuestro CPU y la operación NOP. Para esto nos vamos a valer de un CLOCK externo que estudiaremos en detalle en el el Episodio 2 y de una conexión a un Arduino Mega a través del conector de Arduino el cuál desarrollaremos en el Episodio 3.
Le vamos a indicar a Mano a nuestro CPU 6502 que ejecute la instrucción de no operación NOP, la misma está codificada como EA en las instrucciones del lenguaje máquina del 6502.
EA se traduce en binario cómo 1110 1010 y esto es lo que va a esperar nuestro procesador en sus pines de data para poder leer esa instrucción. Para poder hacerlo vamos a conectar 8 resistencias a nuestros pines de datos de la siguiente forma:
Si corremos una secuencia de reset tocando el botón de RESET del la placa CPU 6502 y observamos el resultado, veremos cómo ejecuta el reset en 7 ciclos de reloj y buscará en las posiciones de memoria FFFC y FFFD donde está el vector (otra posición de memoria) que posee la primera instrucción a ejecutar. Tarda 7 ciclos ya que en RESET no es ni más ni menos que una instrucción BRK o BREAK cargada por hardware a través del pin de RESET.
El reset debe ser mantenido en 0v por lo menos durante dos ciclos de reloj para que sea reconocido.
Podemos observar que luego de la ejecución va a leer como primera instrucción EA o la instrucción NOP de no operación y continuará así ejecutando ya que la misma está harcodeada con las resistencias. El Program Counter se incrementa en 1 luego de la ejecución de cada instrucción por eso vemos que pasa de EAEA a EAEB, luego EAEC, etc. Siempre obteniendo como código de la próxima instrucción EA.
Se repite dos veces por que cada instrucción EA toma dos ciclos de reloj en ejecutarse.
Así concluye nuestro primer experimento donde vimos como el CPU 6502 realiza la secuencia de RESET y lee una primera instrucción.
Conclusiones
La Placa CPU 6502 nos va a dejar conectar un CPU 6502 para realizar experimentos con mucha rapidez ya que fácilmente abre los pines del CPU en ADDRESS, DATA y EXPANSION bus y nos da un botón de reset preinstalado.
El CPU 6502 en funcionamiento
Para ver visualmente cómo conectar un CPU 6502 a la 20c les dejo como siempre un video en detalle de la serie. En este vamos a ver cómo se conectan los pines, y nuestro experimento en forma visual indicando. Buscar el video del Episodio 1
https://www.osolabs.tech/the20c
Referencias
A continuación les dejo algunos links donde profundizar el tema:
WEBSITE
Aquí está el sitio de OsoLabs con todos los videos y artículos.
VIDEOS
Aquí el video correspondiente a este capítulo y la lista de todos los videos de esta serie.
https://www.osolabs.tech/the20c
ARTICULOS
Aqui podrán encontrar todos los artículos sobre la 20c:
https://www.osolabs.tech/the20c
CÓDIGO y DISEÑO DE PLACAS PCB
Todos los ejemplos de código de este artículo los pueden encontrar en:
https://github.com/osolabstech/The20c
OTROS RECURSOS
Y como siempre la serie de Ben Eater del 6502 que es excelente
Build a 6502 computer | Ben Eater
Y la serie de mi creación comparando el 6502 vs 6510 tanto en video como en artículos
https://www.osolabs.tech/6502vs6510
6502 vs 6510 estudio detallado y comparación – YouTube