Procesador IC de lógica discreta

11 de octubre de 2020

Desde que era niño, siempre quise construir mi propia computadora. Al principio solo tenía ideas vagas de cómo se fabrican las computadoras, luego me compré un libro sobre cómo construir una computadora basada en 8080 y programarla, más tarde, por supuesto, tengo mucha experiencia con varias computadoras y microcontroladores, pero nunca he construido uno a partir de rasga. Ahora, cuando tengo 30 años, puedo decir que mi sueño de la infancia se ha hecho realidad.

La parte principal del proyecto es la CPU. Mi procesador tiene un ancho de bus de datos de 8 bits y un ancho de bus de direcciones de 16 bits. La CPU está conectada al módulo periférico que contiene la ROM del programa, la RAM, la pantalla y el teclado.

Conocimiento

Quería que el procesador fuera lo más simple posible, pero no demasiado limitado. Una CPU necesita hacer estas pocas cosas:

Leer y escribir memoria; Realizar aritmética; Tener saltos condicionales e incondicionales.

Para acceder a la memoria y realizar saltos, debe proporcionar direcciones de memoria de algún tipo. La mayoría de los procesadores modernos permiten al usuario codificar la dirección de memoria directa o indirecta directamente en la instrucción de carga/almacenamiento/salto. Hacer esto en lógica discreta sería demasiado complicado o requeriría un microcódigo. Por lo tanto, decidí tener solo acceso indirecto a la memoria y saltos usando un registro de puntero. Para cargar los registros en primer lugar, se necesita una instrucción de carga inmediata.

Estas cuatro clases de instrucciones (lectura/escritura de memoria, aritmética, saltos, carga inmediata) son las únicas instrucciones implementadas.

El procesador funciona con datos de 8 bits y puede direccionar hasta 65 536 bytes de memoria (dirección de 16 bits). Esto significa que el registro del puntero debe contener 16 bits. Desde el punto de vista del programador, el registro puntero P se divide en dos mitades: PL y PH. Estas mitades se pueden cargar por separado. Luego, todo el registro P se usa para acceder a la memoria. Los saltos se realizan intercambiando el registro P con el puntero de instrucción. Como efecto secundario, se pueden implementar llamadas a funciones: después del intercambio (y el salto), P debe contener la dirección de retorno.

Los otros dos registros se denominan A y B. La aritmética se realiza entre A y otro registro. Se implementan cuatro banderas:

Z - cero; C - llevar; S - signo; O - desbordamiento (para aritmética con signos).

Aquí describo los pasos seguidos para diseñar el hardware.

Pensé en la disposición general de los autobuses y los registros y dibujé diagramas de tiempo. Luego programé el modelo en Verilog, agregué bancos de pruebas y los ejecuté con Icarus Verilog. ¡Es hora de dibujar los diagramas esquemáticos! Abrí la lista de circuitos integrados de la serie 7400 y verifiqué cuáles de ellos se podían comprar en mi tienda local de repuestos electrónicos. En base a esto, seleccioné los números de pieza exactos para usar como registros y búferes en mi proyecto. Elegí la variante ACT (o AC cuando ACT no estaba disponible) por las mejores características eléctricas deseadas. Usando KiCad, comencé a dibujar diagramas esquemáticos. Al mismo tiempo, ajusté los modelos de Verilog para que coincidieran con los esquemas reales. De esta manera, estaba seguro de que el procesador funcionaría como deseaba cuando lo construí. Una vez que los esquemas estuvieron listos, dibujé los PCB en KiCad y ordené la producción a una empresa china. Al mismo tiempo, ordené la electrónica al minorista local. Cuando llegó todo, soldé las tablas. Disposición del módulo

modules

Dividí la computadora en cuatro módulos por dos razones. En primer lugar, la producción de PCB de hasta 100x100 mm es mucho más económica que si cualquier dimensión supera los 100 mm. En segundo lugar, tener módulos separados facilita la corrección de errores de hardware y deja margen para la mejora. Por ejemplo, el módulo ALU ahora se fabrica con dos chips ROM, lo que es una especie de "trampa" si desea llamar al procesador en función de una lógica discreta.

El diseño del módulo realmente me ayudó: tengo que rehacer el módulo de control. La primera versión se basó en ROM como ALU. Quería hacer posible reprogramar las señales de control y modificar el conjunto de instrucciones. Pero resultó que los chips ROM no se pueden usar como tablas de búsqueda asíncronas: durante la transición de dirección, el bus de datos pasa por cambios aleatorios. Esto es correcto para la ALU porque las entradas se cambian en el flanco ascendente del reloj y las salidas se utilizan en el flanco descendente.

Módulo de registros

Procesador IC de lógica discreta
11 de octubre de 2020

Desde que era niño, siempre quise construir mi propia computadora. Al principio solo tenía ideas vagas de cómo se fabrican las computadoras, luego me compré un libro sobre cómo construir una computadora basada en 8080 y programarla, más tarde, por supuesto, tengo mucha experiencia con varias computadoras y microcontroladores, pero nunca he construido uno a partir de rasga. Ahora, cuando tengo 30 años, puedo decir que mi sueño de la infancia se ha hecho realidad.

La parte principal del proyecto es la CPU. Mi procesador tiene un ancho de bus de datos de 8 bits y un ancho de bus de direcciones de 16 bits. La CPU está conectada al módulo periférico que contiene la ROM del programa, la RAM, la pantalla y el teclado.

Conocimiento

Quería que el procesador fuera lo más simple posible, pero no demasiado limitado. Una CPU necesita hacer estas pocas cosas:

Leer y escribir memoria; Realizar aritmética; Tener saltos condicionales e incondicionales.

Para acceder a la memoria y realizar saltos, debe proporcionar direcciones de memoria de algún tipo. La mayoría de los procesadores modernos permiten al usuario codificar la dirección de memoria directa o indirecta directamente en la instrucción de carga/almacenamiento/salto. Hacer esto en lógica discreta sería demasiado complicado o requeriría un microcódigo. Por lo tanto, decidí tener solo acceso indirecto a la memoria y saltos usando un registro de puntero. Para cargar los registros en primer lugar, se necesita una instrucción de carga inmediata.

Estas cuatro clases de instrucciones (lectura/escritura de memoria, aritmética, saltos, carga inmediata) son las únicas instrucciones implementadas.

El procesador funciona con datos de 8 bits y puede direccionar hasta 65 536 bytes de memoria (dirección de 16 bits). Esto significa que el registro del puntero debe contener 16 bits. Desde el punto de vista del programador, el registro puntero P se divide en dos mitades: PL y PH. Estas mitades se pueden cargar por separado. Luego, todo el registro P se usa para acceder a la memoria. Los saltos se realizan intercambiando el registro P con el puntero de instrucción. Como efecto secundario, se pueden implementar llamadas a funciones: después del intercambio (y el salto), P debe contener la dirección de retorno.

Los otros dos registros se denominan A y B. La aritmética se realiza entre A y otro registro. Se implementan cuatro banderas:

Z - cero; C - llevar; S - signo; O - desbordamiento (para aritmética con signos).

Aquí describo los pasos seguidos para diseñar el hardware.

Pensé en la disposición general de los autobuses y los registros y dibujé diagramas de tiempo. Luego programé el modelo en Verilog, agregué bancos de pruebas y los ejecuté con Icarus Verilog. ¡Es hora de dibujar los diagramas esquemáticos! Abrí la lista de circuitos integrados de la serie 7400 y verifiqué cuáles de ellos se podían comprar en mi tienda local de repuestos electrónicos. En base a esto, seleccioné los números de pieza exactos para usar como registros y búferes en mi proyecto. Elegí la variante ACT (o AC cuando ACT no estaba disponible) por las mejores características eléctricas deseadas. Usando KiCad, comencé a dibujar diagramas esquemáticos. Al mismo tiempo, ajusté los modelos de Verilog para que coincidieran con los esquemas reales. De esta manera, estaba seguro de que el procesador funcionaría como deseaba cuando lo construí. Una vez que los esquemas estuvieron listos, dibujé los PCB en KiCad y ordené la producción a una empresa china. Al mismo tiempo, ordené la electrónica al minorista local. Cuando llegó todo, soldé las tablas. Disposición del módulo

modules

Dividí la computadora en cuatro módulos por dos razones. En primer lugar, la producción de PCB de hasta 100x100 mm es mucho más económica que si cualquier dimensión supera los 100 mm. En segundo lugar, tener módulos separados facilita la corrección de errores de hardware y deja margen para la mejora. Por ejemplo, el módulo ALU ahora se fabrica con dos chips ROM, lo que es una especie de "trampa" si desea llamar al procesador en función de una lógica discreta.

El diseño del módulo realmente me ayudó: tengo que rehacer el módulo de control. La primera versión se basó en ROM como ALU. Quería hacer posible reprogramar las señales de control y modificar el conjunto de instrucciones. Pero resultó que los chips ROM no se pueden usar como tablas de búsqueda asíncronas: durante la transición de dirección, el bus de datos pasa por cambios aleatorios. Esto es correcto para la ALU porque las entradas se cambian en el flanco ascendente del reloj y las salidas se utilizan en el flanco descendente.

Módulo de registros

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow