Procesador casero elaborado a partir de transistores. Asunto: Monté una computadora completamente con mis propias manos. Iniciar un proyecto en FPGA

Un ingeniero desconocido, Steve Chamberlin, decidió cambiar la opinión generalmente aceptada de que es imposible crear un procesador con sus propias manos. Más precisamente, el procesador de un PC suficientemente complejo que podría duplicar las funciones de los dispositivos informáticos de 8 bits que se generalizaron a principios de los años 80. Al principio fue un proyecto pequeño, que con el tiempo se convirtió en algo más grande. Ahora BMOW 1 es una PC completa basada en procesador casero, que ejecuta programas, tiene teclado, video VGA y sistema de audio. Entorno de software Para BMW 1-básico.

El procesador, creado por Steve Chamberlin, consta de docenas de chips lógicos simples, por lo que no todo en esta PC son cables y PCB. Sin embargo, todo esto se montó a mano, lo que le llevó a Steve varios años. Como se mencionó anteriormente, al principio solo quería crear un procesador que él mismo ensamblara, pero al final decidió crear una PC que funcionara y pudiera realizar ciertas tareas.

Steve se fijó varios objetivos y todos se lograron:

Crear un procesador desde elementos simples, se utilizaron chips de la serie 7400, sin componentes de las series 6502, Z-80, etc.;

Reducir la complejidad del hardware al mínimo;

La computadora tenía que ejecutar programas "reales", no ser puramente un "juguete";

El procesador debe convertirse en un elemento de un sistema de PC completo;

El sistema debe ser lo suficientemente rápido para iniciar y ejecutar programas de forma interactiva.

La idea en sí se le ocurrió a Steve en noviembre de 2007 y el ingeniero comenzó a implementarla en febrero de 2008. En abril de 2008, se lanzó por primera vez el sistema BMOW 1, lo que hizo increíblemente feliz a nuestro creador. Poco a poco se fueron añadiendo vídeo VGA, un sistema de audio, BASIC y un gestor de arranque, que permitía la interacción con una PC conectada. Después de un tiempo, BMOW 1 se volvió lo suficientemente sofisticado como para soportar programas complejos. El trabajo principal en la creación de BMOW 1 se completó en febrero de 2009, la PC está finalizada hasta ahora.

Aquí hay algunos detalles sobre la configuración del dispositivo:

La frecuencia actual del procesador es de unos 2 MHz. El procesador se puede "overclockear" a 3 MHz (teóricamente, aún no probado);

512 KB de RAM, 512 KB de ROM;

Consumo de energía 10 Watt, 2A a 5V;

La imagen de “salida” tiene una resolución de 512*480, dos colores, o 128*240 - 256 colores;

Audio: generador de sonido de tres canales;

Teclado normal con conector PS\2;

Pantalla adicional para salida de texto, 24*2 caracteres;

1250 conductores de alambre, es decir. alrededor de 2500 conexiones;

Otros detalles - en

Un problema similar me ha interesado durante los últimos 3 años, pero no abandoné la idea original de construir sobre transistores, y ahora puedo contarles mis pensamientos y mostrarles los desarrollos actuales, y también, quiero preguntar su opinión sobre lo que, en su opinión, un transistor _serie_ decorativo debería ser una computadora. Pero hay que tener en cuenta inmediatamente que todavía quedan un par de años de trabajo por delante :-)

La pregunta principal es ¿por qué se necesita todo esto si hay FPGA y todo tipo de Raspberry Pis?

La respuesta es simple:
1) Estoy interesado en hacer esto en tiempo libre Y
2) Una computadora decorativa (la decoración es una cuestión de actitud hacia la computadora, no de su apariencia): es como mascotas decorativas: un pug no le arrancará la pierna a un ladrón y un gato persa no derrotará a una rata del metro en una pelea. . Pero es interesante jugar con ellos y mostrárselos a los invitados, incluso si en el campo de la informática, la seguridad y la caza son muy inferiores a sus homólogos de "combate".

Sustitución de problemas y arquitectura.

¿Cuáles serán nuestros requisitos para una computadora decorativa?

¿Pero es posible arreglárselas con sólo 4 transistores? Hice una lluvia de ideas y se me ocurrió esto:

Horario de apertura:


Está disponible un circuito para simulación en LTspice IV.

El principio de funcionamiento es el siguiente: porque el orden de los términos no importa, simplemente los mezclamos de forma analógica y, al seleccionar con precisión el voltaje umbral del inversor dual, obtenemos inmediatamente la transferencia. Luego, restando la transferencia en el transistor Q3 de la suma analógica, obtenemos la suma. Por supuesto, todo esto requiere una selección precisa de los niveles de activación y una simulación teniendo en cuenta la temperatura. Diodos Schottky: para evitar que los transistores entren en una saturación profunda, lo que reduce drásticamente la velocidad de funcionamiento.

El uso de transistores de efecto de campo es posible y proporciona una mejor estabilidad de la temperatura, siempre que tengan un umbral de tensión suficientemente bajo.

registro de turno- la parte más importante de esta computadora de transistores. La implementación clásica en flip-flops D síncronos requiere una cantidad monstruosa de transistores por bit.

Logré encajar 2 transistores por bit, con las siguientes características:
1) Los registros se basan en condensadores y, si no se "mueven", con el tiempo los datos se perderán. Nariz Transistor de efecto de campo El tiempo de almacenamiento es bastante largo.
2) Transferencia de datos a la siguiente etapa - transistores bipolares. La mitad del tiempo funciona al revés, modo no estándar- el voltaje de ruptura es mucho menor (pero deberían mantenerse 3,3 V) y la ganancia es mucho menor que la conexión directa (pero espero que sea suficiente).
3) Cada etapa posterior invierte la señal, esto no es un problema cuando solo es necesario acceso secuencial(por ejemplo en el caso de registros de procesador). Si necesita una salida paralela no invertida, deberá agregar 8 inversores (es decir, un registro de desplazamiento de 16 bits requerirá 40 transistores, no 32).
4) Sigue existiendo un problema con la saturación del transistor bipolar.

Cronograma:

Con estas implementaciones compactas circuitos digitales- Creo que será muy posible mantenerse dentro de los 1.000 transistores.
Eso es todo por ahora. Tengo una enorme cantidad de trabajo por delante.

Y ahora, algunas preguntas para los lectores: ¿Qué opciones le parecen aceptables?

Desde que tengo uso de razón, siempre he soñado con fabricar un procesador. Finalmente ayer lo logré. Dios sabe qué: 8 bits, RISC, actual frecuencia de operación- 4 kHz, pero funciona. Hasta ahora en el programa para modelar circuitos lógicos, pero todos sabemos: "¡hoy - en el modelo, mañana - en la práctica!"

Debajo del corte hay varias animaciones, una breve introducción a lógica binaria para los más pequeños, una breve historia sobre los chips lógicos del procesador principal y, de hecho, el circuito.

Lógica binaria

El sistema numérico binario (para aquellos que no lo saben) es un sistema numérico en el que no hay dígitos mayores que uno. Esta definición confunde a muchos hasta que recuerdan que en sistema decimal No hay números mayores que nueve en número.

El sistema binario se utiliza en las computadoras porque los números que contiene son fáciles de codificar con voltaje: si hay voltaje, significa uno; sin voltaje significa cero. Además, "cero" y "uno" pueden entenderse fácilmente como "falso" y "verdadero". Además, La mayoría de dispositivos que funcionan en sistema binario notación, generalmente se refiere a los números como un conjunto de “verdades” y “falsedades”, es decir, opera con números como valores lógicos. Para los más pequeños y los que no lo saben, les contaré y mostraré cómo funcionan los elementos más simples de la lógica binaria.

elemento tampón

Imagina que estás sentado en tu habitación y tu amigo está en la cocina. Le gritas: “Amigo, dime, ¿está encendida la luz del pasillo?” El amigo responde: “¡Sí, está ardiendo!” o "No, no está encendido". Tu amigo es un amortiguador entre la fuente de señal (la bombilla del pasillo) y el receptor (tú). Además, su amigo no es un búfer cualquiera, sino un búfer administrado. Sería un amortiguador ordinario si gritara constantemente: "La bombilla está encendida" o "La bombilla no está encendida".

Elemento “No” - NO


Ahora imagina que tu amigo es un bromista que siempre dice mentiras. Y si la luz del pasillo está encendida, entonces te dirá: "No, el pasillo está muy, muy oscuro", y si no está encendida, entonces "Sí, la luz del pasillo está encendida". Si realmente tienes un amigo así, entonces él es la encarnación del elemento "No".

Elemento “O” - O


Desafortunadamente, una bombilla y un amigo no son suficientes para explicar la esencia del elemento "O". Necesitas dos bombillas. Entonces, en el pasillo tienes dos bombillas: una lámpara de pie, por ejemplo, y una lámpara de araña. Gritas: “Amigo, dime, ¿hay al menos una bombilla encendida en el pasillo?”, y tu amigo responde “Sí” o “No”. Evidentemente, para responder “No” hay que apagar todas las luces.

Elemento “Y” - Y


El mismo apartamento, tú, un amigo en la cocina, una lámpara de pie y una lámpara de araña en el pasillo. A su pregunta "¿Están encendidas ambas luces en el pasillo?" obtienes una respuesta “Sí” o “No”. Felicitaciones, tu amigo es ahora el elemento "yo".

Exclusivo O Elemento - XOR


Repitamos nuevamente el experimento para el elemento “O”, pero reformulemos nuestra pregunta a un amigo: “Amigo, dime, ¿hay solo una bombilla en el pasillo?” amigo honesto Responderá “Sí” a esta pregunta sólo si realmente hay una sola bombilla encendida en el pasillo.

sumadores

Sumador de cuartos


El elemento "O exclusivo" se llama cuarto sumador. ¿Por qué? Vamos a resolverlo.
Creemos una tabla de suma para dos números en el sistema numérico binario:
0+0= 0
0+1= 1
1+0= 1
1+1= 10

Ahora escribamos la tabla de verdad del elemento "O exclusivo". Para hacer esto, denotamos la bombilla encendida como 1, la bombilla apagada como 0 y las respuestas del amigo “Sí”/“No” como 1 y 0, respectivamente.
0 XOR 0 = 0
0 XO 1 = 1
1XO 0 = 1
1XO 1 = 0

Muy parecido, ¿no? La tabla de suma y la tabla de verdad de “O Exclusivo” coinciden completamente, salvo en un solo caso. Y este caso se llama "desbordamiento".

Medio sumador

Cuando ocurre un desbordamiento, el resultado de la suma ya no se coloca en la misma cantidad de dígitos en los que se colocaron los términos. Los términos son dos números de un solo dígito (una cifra significativa, ¿entiendes?), y la suma ya es un número de dos dígitos (dos personajes importantes). Ya no es posible transmitir dos números con una bombilla (“encendido”/“apagado”). Necesitas dos bombillas. Lo necesitamos, ¡lo haremos!

Además de XOR, necesitamos un elemento AND para el sumador.
0 XOR 0 = 0 0 Y 0 = 0
0 XOR 1 = 1 0 Y 1 = 0
1 XOR 0 = 1 1 Y 0 = 0
1 XOR 1 = 0 1 Y 1 = 1

¡Tadam!
0+0= 00
0+1= 01
1+0= 01
1+1= 10

Nuestro medio sumador wunderwaffle funciona. Se puede considerar el más simple. procesador especializado, que suma dos números. Un medio sumador se llama medio sumador porque no puede tener en cuenta el arrastre (el resultado de otro sumador), es decir, es imposible sumar tres inequívocos numeros binarios. En este sentido, es imposible crear un medio sumador de varios bits a partir de varios medios sumadores de un solo bit.

No entraré en detalles sobre cómo funcionan los sumadores completos y de varios bits, sólo espero que entiendas la idea básica.

Elementos más complejos

multiplexor


Sugiero usar tu imaginación nuevamente. Entonces imagina esto. Vives en una casa privada de un apartamento, cerca de la puerta de esta casa está tu Buzón. Mientras caminas, te das cuenta de que hay un cartero extraño parado cerca de este mismo buzón. Y esto es lo que hace: saca un montón de cartas de su bolso, lee el número del buzón y, dependiendo del número del buzón, tira en él una u otra carta. El cartero trabaja como multiplexor. Determina de cierta manera (el número en el sobre) qué señal (carta) enviar a lo largo de la línea de señal (buzón).

Los multiplexores suelen consistir únicamente en combinaciones de elementos "Y", "O" y "No". Un multiplexor de un solo bit tiene una entrada llamada "selección de dirección", dos entradas con nombre común“señal de entrada” y una de salida, que se denomina “señal de salida”.

Cuando se aplica 0 a la "selección de dirección", la "señal de salida" se vuelve la misma que la primera "señal de entrada". En consecuencia, cuando se aplica un 1 a la "selección", la "señal de salida" se vuelve igual a la segunda "señal de entrada".

Demultiplexor


Pero esto funciona exactamente al revés. Para “seleccionar dirección” damos la dirección, para “entrada de datos” damos los datos, en la salida con el número “dirección” tenemos los datos de la entrada.

Encimera


Para entender cómo funciona el medidor, nuevamente necesitarás a tu amigo. Llámalo desde la cocina (espero que no se haya aburrido mucho allí y, lo más importante, que no se haya comido toda tu comida) y pídele que haga esto: déjale recordar el número 0. Cada vez que lo toques. , debe sumar uno al número que recuerda, decir el resultado y recordarlo. Cuando el resultado sea (digamos) 3, deberá gritar "¡Abracadabra!" y responder la próxima vez que toque que ahora recuerda el número 0. ¿Un poco difícil? Ver:

Tocas a un amigo. El amigo dice "Uno".
Tocas a un amigo. El amigo dice "Dos".
Tocas a un amigo. El amigo dice "Tres". Un amigo grita " ¡Habrahabr!" ¡Ataque crítico! Está temporalmente paralizado y no puede moverse.
Tocas a un amigo. El amigo dice "cero".

Bueno, y así sucesivamente. Muy sencillo, ¿verdad?
Por supuesto, te diste cuenta de que tu amigo ahora es un contador. Tocar a un amigo puede considerarse una "señal de sincronización" o, en pocas palabras, una señal para seguir contando. El grito de “Abracadabra” indica que el valor almacenado en el contador es el máximo, y que la siguiente señal de reloj pondrá el contador a cero. Hay dos diferencias entre el contador binario y tu amigo. Primero: un contador binario real produce un valor almacenado en binario. Segundo: siempre hace sólo lo que usted le dice que haga y nunca se rebaja a hacer bromas estúpidas que podrían alterar el funcionamiento de todo el sistema del procesador.

Memoria

Desencadenar


Sigamos burlándonos de tu desafortunado (quizás incluso imaginario) amigo. Que recuerde ahora el número cero. Cuando toques su mano izquierda, debe recordar el número cero, y cuando toques su mano derecha, debe recordar el número uno. Cuando se le preguntó "¿Qué número recuerdas?" un amigo siempre debe responder con el número que recuerda: cero o uno.
La celda de memoria más simple es un flip-flop RS (“disparador” significa “interruptor”). Un flip-flop RS puede almacenar un bit de datos (“cero”/“uno”) y tiene dos entradas. La entrada Establecer (al igual que la mano izquierda de tu amigo) escribe "uno" en el disparador, y la entrada Restablecer (respectivamente, la mano derecha) escribe "cero".

Registro


El registro es un poco más complicado. Tu amigo se convierte en un registro cuando le pides que recuerde algo y luego dices: "Oye, ¿recuérdame lo que te dije que recordaras?" y tu amigo responde correctamente.

Normalmente, un registro puede almacenar poco más de un bit. Tiene necesariamente una entrada de datos, una salida de datos y una entrada de habilitación de escritura. Desde la salida de datos se puede leer en cualquier momento lo que está escrito en este registro. Puede proporcionar la entrada de datos que desea escribir en este registro. Puedes enviar datos hasta que te aburras. De todos modos, no se escribirá nada en el registro hasta que se aplique uno a la entrada de permiso de escritura, es decir, uno "lógico".

registro de turno


¿Alguna vez has hecho cola? Probablemente lo eran. Entonces puedes imaginar lo que es tener datos en un registro de desplazamiento. La gente viene y se para al final de la fila. La primera persona de la fila entra a la oficina del pez gordo. El que estaba segundo en la fila pasa a ser primero, y el que estaba tercero pasa a ser segundo, y así sucesivamente. Una cola es un registro de turnos tan complicado del que los "datos" (bueno, es decir, las personas) pueden huir por negocios, habiendo advertido previamente a los vecinos en la cola. Por supuesto, en un registro de desplazamiento real, los “datos” no pueden escapar de la cola.

Entonces, un registro de desplazamiento tiene una entrada de datos (a través de la cual los datos ingresan a la "cola") y una salida de datos (desde la cual se puede leer el primer registro de la "cola"). El registro de desplazamiento también tiene una entrada de "registro de desplazamiento". Tan pronto como llega uno "lógico" a esta entrada, toda la cola se desplaza.

Hay una diferencia importante entre una cola y un registro de turnos. Si el registro de desplazamiento está diseñado para cuatro entradas (por ejemplo, cuatro bytes), entonces la primera entrada en la cola llegará a la salida del registro solo después de cuatro señales a la entrada del "registro de desplazamiento".

RAM

Si se combinan muchos, muchos flip-flops en registros, y muchos, muchos registros se combinan en un microcircuito, se obtiene un microcircuito. memoria de acceso aleatorio. Un chip de memoria generalmente tiene una entrada de dirección, una entrada de datos bidireccional (es decir, esta entrada se puede escribir y leer) y una entrada de habilitación de escritura. Proporcionamos algún número a la entrada de dirección, y este número seleccionará una celda de memoria específica. Después de esto, en la entrada/salida de datos podemos leer lo que está escrito en esta misma celda.
Ahora aplicaremos simultáneamente a la entrada/salida de datos lo que queremos escribir en esta celda, y a la entrada de permiso de escritura, una “lógica”. El resultado es un poco predecible, ¿no?

UPC

BitBitJump

Los procesadores a veces se dividen en CISC (aquellos que pueden ejecutar muchos comandos diferentes) y RISC (aquellos que pueden ejecutar pocos comandos, pero los ejecutan bien). Una buena tarde pensé: sería genial si pudiera hacer procesador completo, que puede ejecutar solo un comando. Pronto aprendí que existe toda una clase de procesadores de una sola instrucción: OISC, la mayoría de las veces usan Subleq (resta, y si es menor o igual a cero, entonces vamos) o Subeq (resta, y si es igual a cero, entonces ir) instrucción. Estudiando varias opciones Procesadores OISC, encontré en Internet el sitio web de Oleg Mazonka, quien desarrolló el lenguaje de comando único más simple, BitBitJump. El único comando en este lenguaje se llama BitBitJump (copia un bit y ve a la dirección). Este lenguaje ciertamente esotérico es Turing completo, es decir, en él se puede implementar cualquier algoritmo informático.

Descripción detallada BitBitJump y el ensamblador para este lenguaje se pueden encontrar en el sitio web del desarrollador. Para describir el algoritmo de funcionamiento del procesador, basta con saber lo siguiente:

1. Cuando se enciende el procesador, se escribe 0 en los registros de la PC, A y B
2. Leer la celda de memoria con la dirección de la PC y guardar lo que leemos en el registro A.
3. Aumentar la PC
4. Leer la celda de memoria con la dirección de la PC y guardar lo que leemos en el registro B.
5. Aumentar la PC
6. Escribimos el contenido del bit con dirección A en la celda con la dirección escrita en el registro B.
7. Leer la celda de memoria con la dirección de la PC y guardar lo que leemos en el registro B.
8. Escriba el contenido del registro B en el registro de la PC.
9. Pasemos al punto 2 de nuestro plan.
10. ¡¡¡BENEFICIO!!!

Desafortunadamente, el algoritmo es infinito y, por lo tanto, no se lograrán GANANCIAS.

En realidad, el esquema

El plan se construyó de forma espontánea, por lo que el miedo, el horror y el caos gobiernan el gallinero. Sin embargo, funciona y funciona bien. Para encender el procesador, necesita:

1. Ingrese el programa a la RAM.
2. Presione el interruptor
3. Coloque el contador en la posición 4 (esto se puede hacer en hardware, pero el circuito sería aún más engorroso)
4. Habilite el generador de reloj

Como puede ver, se utilizan un registro, un registro de desplazamiento, un chip RAM, dos contadores binarios, un demultiplexor (representado por comparadores), dos multiplexores y algo de lógica pura.

Un ingeniero desconocido, Steve Chamberlin, decidió cambiar la opinión generalmente aceptada de que es imposible crear un procesador con sus propias manos. Más precisamente, el procesador de un PC suficientemente complejo que podría duplicar las funciones de los dispositivos informáticos de 8 bits que se generalizaron a principios de los años 80. Al principio fue un proyecto pequeño, que con el tiempo se convirtió en algo más grande. Ahora BMOW 1 es una PC completa basada en un procesador casero que ejecuta programas, tiene teclado, video VGA y un sistema de audio. El entorno de software para BMOW 1 es Básico.

El procesador, creado por Steve Chamberlin, consta de docenas de chips lógicos simples, por lo que no todo en esta PC son cables y PCB. Sin embargo, todo esto se montó a mano, lo que le llevó a Steve varios años. Como se mencionó anteriormente, al principio solo quería crear un procesador que él mismo ensamblara, pero al final decidió crear una PC que funcionara y pudiera realizar ciertas tareas.

Steve se fijó varios objetivos y todos se lograron:

Crear un procesador a partir de elementos simples, se utilizaron chips de la serie 7400, sin componentes de la serie 6502, Z-80, etc.;

Reducir la complejidad del hardware al mínimo;

La computadora tenía que ejecutar programas "reales", no ser puramente un "juguete";

El procesador debe convertirse en un elemento de un sistema de PC completo;

El sistema debe ser lo suficientemente rápido para iniciar y ejecutar programas de forma interactiva.

La idea en sí se le ocurrió a Steve en noviembre de 2007 y el ingeniero comenzó a implementarla en febrero de 2008. En abril de 2008, se lanzó por primera vez el sistema BMOW 1, lo que hizo increíblemente feliz a nuestro creador. Poco a poco se fueron añadiendo vídeo VGA, un sistema de audio, BASIC y un gestor de arranque, que permitía la interacción con una PC conectada. Después de un tiempo, BMOW 1 se volvió lo suficientemente sofisticado como para soportar programas complejos. El trabajo principal en la creación de BMOW 1 se completó en febrero de 2009, la PC está finalizada hasta ahora.

Aquí hay algunos detalles sobre la configuración del dispositivo:

La frecuencia actual del procesador es de unos 2 MHz. El procesador se puede "overclockear" a 3 MHz (teóricamente, aún no probado);

512 KB de RAM, 512 KB de ROM;

Consumo de energía 10 Watt, 2A a 5V;

La imagen de “salida” tiene una resolución de 512*480, dos colores, o 128*240 - 256 colores;

Audio: generador de sonido de tres canales;

Teclado normal con conector PS\2;

Pantalla adicional para salida de texto, 24*2 caracteres;

1250 conductores de alambre, es decir. alrededor de 2500 conexiones;

Otros detalles - en

  • Microprocesador de bricolaje. Parte 4.3. ¿Cómo depurar un microcontrolador integrado en una FPGA?
  • Microprocesador de bricolaje. Parte 5.1. Sobre el inicio del proyecto del microcontrolador FPGA
  • Microprocesador de bricolaje. Parte 5.2. Sobre el inicio del proyecto del microcontrolador FPGA
  • Microprocesador de bricolaje. Parte 5.3. Sobre el inicio del proyecto del microcontrolador FPGA
  • Microprocesador de bricolaje. Parte 5.4. Sobre el inicio del proyecto del microcontrolador FPGA
  • Iniciar un proyecto en FPGA

    Al igual que en el proyecto anterior, implementaremos el proyecto en el lenguaje AlteraHDL (AHDL). Este lenguaje está bastante extendido y descrito. También es mucho más accesible para principiantes que otros lenguajes VHDL. Las versiones del software para estudiantes también son más accesibles.

    El proyecto se completará en la forma archivos de texto. Esto le permitirá utilizar la ejecución paramétrica de descripciones, lo que permitirá utilizar los archivos en otros proyectos. En el paquete de software MaxPlus, Altera proporciona una biblioteca de megafunciones parametrizables que le permiten integrar fácilmente contadores, decodificadores, etc. en un proyecto. En los archivos de ayuda del software se proporciona una descripción de estas megafunciones.

    Entonces, diseñemos:

    Construyendo un núcleo de microprocesador

    El núcleo del microprocesador estará formado por los siguientes nodos:

    1. batería con una capacidad de 1 bit;
    2. La región DS constará de regiones de entrada y salida y parte de un bloque de memoria síncrona ubicada en el chip;
    3. el área de salida será el bus de salida y los datos de salida se escribirán en parte del bloque de memoria síncrona ubicado en el chip;
    4. Usaremos la estructura más rápida para recuperar datos de la memoria, es decir, muestreo sincrónico con una canalización de comandos.

    Con base en la tarea y las simplificaciones realizadas en el microprocesador, obtenemos la arquitectura que se muestra en la Fig. 2.

    El microprocesador consta de un conjunto de los siguientes bloques:

    • ALU, que contiene una unidad de control para desarrollar acciones de control en todos los bloques de microprocesador - ALU;
    • contador de direcciones de memoria del programa - PS_CNT;
    • bloque de memoria del programa - PS;
    • bloque de memoria de datos - DS.

    Las entradas del microprocesador serán alimentadas con la señal de frecuencia de reloj CLK, la señal de permiso de operación y señal del sistema RESET, igual que para todos los demás bloques del sistema (no se muestra en la figura).

    Las entradas del microprocesador serán señales del bus de datos de entrada.

    Las salidas del microprocesador serán señales del bus de datos de salida y una señal de habilitación de escritura.

    Cuando se carga el microcircuito o cuando el sistema se inicializa mediante una señal RESET, el contador de comandos se pone en el estado 0, después de lo cual cuenta las direcciones de memoria del programa. Las direcciones se envían a la entrada del bloque PS. Los datos almacenados en la memoria del programa se seleccionan según la dirección recibida. Luego, los datos de la salida PS se envían como un código de dirección a la memoria de datos de doble puerto para que los datos de la memoria se puedan cargar en la batería. Para compensar el retraso que tiene la memoria síncrona al leer, los datos de la salida PS se envían a un bloque de registros de retraso de dos etapas. La ALU descifra los códigos de instrucción del microprocesador. La ALU incluye una batería de disparo, en la que se ejecutan todos los comandos del microprocesador. Los datos a la entrada del acumulador del microprocesador al leer la memoria provienen de la salida de una memoria de doble puerto o de la entrada X de acuerdo con la dirección del bus de direcciones de datos al leer dispositivos externos microprocesador. Los datos de las salidas de la batería se escriben solo en la memoria de doble puerto o simultáneamente en la memoria de doble puerto y en dispositivos externos.

    El modelo de microprocesador descrito en este artículo es un dispositivo completamente funcional. Si lo desea, este proyecto se puede modificar fácilmente para uso práctico teniendo en cuenta todas las solicitudes de los usuarios. La metodología de desarrollo nos permite estimar la complejidad y determinar el recurso necesario para implementar un microcontrolador en una FPGA.

    Convención de nomenclatura de señales (convención de nomenclatura de circuitos)

    Para lograr uniformidad, asumiremos que el estado activo de las señales será igual a 1. Si el estado activo de la señal será igual a 0, entonces se agregará la letra "al nombre de la señal al final". norte».

    En los archivos de descripción utilizamos los siguientes nombres de señales:

    lk- frecuencia, frecuencia de reloj;

    reiniciar- señal de reinicio del sistema;

    _ena- señal de habilitación de grabación, en la mayoría de los casos su duración será igual a la duración del 1er período de reloj;

    _nodo- el nombre de la señal se refiere al nodo del circuito interno.

    Archivo de proyecto superior que describe el microprocesador.

    El archivo de proyecto superior one_bit_cpu.tdf es el propio microprocesador. La función de biblioteca lpm_rom se usa para describir la memoria de comandos y el archivo step1.mif se usa para inicializarla. La función de biblioteca lpm_ram_dp se usa para describir la memoria de datos de doble puerto y la función de biblioteca lpm_counter se usa para describir el contador de direcciones. Se implementan dos etapas de retraso en los registros stage_a y stage_b.

    A diferencia de la ALU descrita en el artículo anterior, este microprocesador no tiene interrupciones, por lo que aquí la ALU es un simple decodificador 4 en 16. Los bits correspondientes al COP se suministran a la entrada del decodificador. La ALU genera señales de control para todo en el este proyecto y cambia los datos a la entrada de la batería del microprocesador. La batería está hecha con un gatillo (acc).

    Dado que el archivo que describe este microprocesador es bastante simple y contiene comentarios, no hay descripciones adicionales no se muestra aquí.

    Ejemplo de microprocesador de bits

    Por ejemplo, imaginemos que tenemos un objeto de control que consta de 16 variables de entrada X0...X15.

    Imaginemos algunos programa de control para 4 variables de salida: Z0, Z1, Z2 y Z3. Describa cada una de estas variables. función lógica, compuesta en promedio, por ejemplo, por 5 miembros.

    Imaginemos que las variables de entrada están ubicadas en direcciones secuenciales, comenzando desde 0. Es decir, la variable X0 está ubicada en el campo de memoria en la dirección 0, la variable X1 está en la dirección 1, y así sucesivamente. Imaginemos que las salidas se pueden leer desde la dirección 800 y las variables de salida se pueden leer a partir de la dirección C00. Ahora reescribiremos los datos recibidos en los comandos de la máquina y crearemos un archivo de programa que será ejecutado por el microprocesador.

    Para describir la memoria de comandos utilizamos función de biblioteca lpm_rom, y para inicializarlo utilizamos el archivo step1.mif. Además según lo recibido códigos de máquina Creemos un archivo de inicialización de la memoria del programa: un archivo ".mif". El archivo paso 1 contendrá códigos de instrucción del microprocesador y el comando para ir al comienzo del programa se emitirá después de todos los comandos de cálculo.

    En este programa, después del comando SKIP, se llenan 4 celdas de memoria más con códigos de comando NOP. Esto se hace para mostrar cómo se ejecuta la instrucción de salto SKIP en un microprocesador con una canalización de instrucciones. En la siguiente sección se proporcionará una descripción detallada del trabajo con este programa.

    Creemos otro archivo de inicialización de memoria del programa del microprocesador, el archivo step2.mif, que también contendrá códigos de comando del microprocesador, pero el comando para ir al comienzo del programa se emitirá 2 ciclos de reloj antes que el último comando de cálculo. Basado de este archivo Se mostrarán las secuencias de ejecución de los comandos de transición, que figuran en la sección "Tiempo de ejecución de comandos y canalización de comandos" (ver "Kit" No. 7 "2003).

    Crear carpeta de trabajo, por ejemplo My_cpu, escriba el archivo en esta carpeta y luego compílelo para asegurarse de que no haya errores. Seleccionaremos la serie ACEX como DISPOSITIVO para el proyecto y configuraremos el modo AUTO para seleccionar un microcircuito. Compilemos el proyecto.

    ¿Qué obtuvimos?

    Según los resultados de la compilación del proyecto a partir del archivo de informe, obtenemos el siguiente resultado:

    Para implementar el proyecto, solo se necesitaron 64 celdas lógicas y 2 bloques. memoria interna.

    Las simulaciones del funcionamiento del microprocesador se muestran en la Fig. 3–5.

    Los diagramas muestran las entradas:

    • restablecer - restablecer;
    • señal de permiso de trabajo - ena;
    • frecuencia de reloj - clk;
    • entrada de datos de bits - xx.

    Los diagramas muestran las salidas:

    • salida de datos de bits - y;
    • señal de permiso de grabación de datos de salida - wr;
    • bus de direcciones de datos de entrada y salida - addr.
    • la dirección recibida en la entrada del bloque de memoria de comando es lpm_rom;
    • datos que llegan a la entrada del bloque de memoria de datos - lpm_ram_dp;
    • la dirección recibida en la entrada del bloque de memoria de datos es lpm_ram_dp;
    • dos señales correspondientes a etapa_a, etapa_b;
    • la señal en la salida de la batería es según.

    La frecuencia de reloj suministrada a la entrada de reloj del microprocesador tiene una duración de pulso de 30 ns y cada flanco positivo de la frecuencia de reloj está numerado. La descripción completa de la operación se basará en el flanco del reloj correspondiente. Llamaremos a los frentes así: frente1, frente2, etc.

    Modo de inicio de cálculo

    Después de que se elimina la señal de "Restablecer", el contador de direcciones de comando está en el estado 0000 y los registros de la canalización de comandos se restablecen a cero. Cuando edge1 está activo, el estado de reinicio ya se ha borrado y el primer comando se carga en la canalización de comandos. Dado que esta instrucción aparecerá solo en el borde 2 en la salida de la canalización de instrucciones, la ALU ejecuta los dos primeros ciclos de reloj como instrucciones NOP. Y solo hacia el borde 3 los datos de la tubería se procesarán en la ALU como primer comando de cálculo. Luego, para cada flanco de la frecuencia del reloj, se emitirá el siguiente comando desde la canalización de comandos, que se ejecutará en el mismo ciclo de reloj. A continuación, los lectores pueden considerar de forma independiente todas las acciones que ocurren al verificar el funcionamiento del microprocesador con otros comandos del archivo paso 1.

    Ejecución de una instrucción de salto a la dirección inicial, ejecutada sin tener en cuenta el retraso introducido por el canal de comandos

    Después de calcular todos los valores de las variables de salida, se emitió un comando para ir a la dirección 0000. Considere la ejecución de esta operación por parte del microprocesador, realizada de acuerdo con el archivo paso1. El resultado de la simulación se muestra en la Fig. 4. En el diagrama anterior, el cursor vertical azul está instalado en el lugar donde la entrada de la memoria de comando recibe la dirección de comando 1E, donde se encuentra el código de comando de salto. Este borde del reloj está numerado como borde1 en este diagrama. A continuación, este código ingresa a la canalización de comandos, a lo largo de la cual "viaja" hasta el frente del reloj3. Al mismo tiempo, el contador del programa continúa incrementándose y los datos ubicados en las direcciones 1F, 20 se recuperan de la memoria de comandos. Sólo después de completar dos ciclos de reloj adicionales se produce la transición al comienzo del programa. Este modo de funcionamiento es típico de todos los microprocesadores que tienen una canalización de comandos. Normalmente, el dispositivo de control bloquea la ALU mientras la tubería se recarga con nuevos datos. eso es para este ejemplo estas serían las medidas 1, 2.

    Ejecución de un comando de salto a la dirección de inicio, teniendo en cuenta el retraso introducido por la canalización de comandos

    Para probar el microprocesador en modo operativo, teniendo en cuenta el retraso introducido por la canalización de comandos, crearemos un archivo de inicialización de memoria del programa del microprocesador step2.mif. Compilemos el proyecto con este archivo de inicialización de memoria.

    Consideremos la ejecución por parte del microprocesador de la operación de traslado a la dirección 0000, realizada de acuerdo con el archivo paso2. El resultado de la simulación, un diagrama de tiempo del funcionamiento del microprocesador con el archivo de comando paso 2, se muestra en la Fig. 5. En el diagrama anterior, el cursor vertical azul está instalado, como en el caso anterior, en el lugar donde la entrada de la memoria de comandos recibe la dirección del comando 1E, donde se encuentra el código. último comando archivo paso 2. Este borde del reloj está numerado como borde1 en este diagrama. Dado que el comando para ir a la dirección inicial se emitió en la dirección 1C, en el instante de tiempo determinado por edge1, este comando logró atravesar toda la tubería e ingresar a la ALU. El dispositivo de control genera una señal de reinicio síncrona para el contador de programa. A continuación, los comandos escritos allí antes de la transición se extraen de la canalización y se ejecutan. Y la entrada del transportador recibe comandos leídos en la nueva dirección. Por lo tanto, no hay dos ciclos de reloj adicionales al pasar al comienzo del programa.

    Entonces, podemos concluir que para calcular los valores de 4 variables de salida a partir de 16 variables de entrada para el ejemplo anterior, recibimos 31 instrucciones de máquina. Esto significa que en 31 ciclos se calcularán los valores de todos los parámetros de salida. Cuando utilice la serie de chips Apex o Acex cuando frecuencia de reloj A 33 MHz, el ciclo de cálculo completo del ejemplo anterior tardará 0,93 microsegundos. En chips de la serie Cyclon o Stratix a una frecuencia de reloj de 300 MHz, obtendremos el resultado en tan solo 102 nanosegundos. Si consideramos que al mismo tiempo un microprocesador tipo AVR con una frecuencia de reloj de 8 MHz tendrá tiempo para ejecutar aproximadamente 8 comandos, las ventajas se vuelven obvias.

    Otro ejemplo de programación de procesador de bits.

    El procesador descrito, a pesar de su aparente "pequeño tamaño", es capaz de realizar amplio círculo Tareas que surgen al gestionar objetos. La primera de estas tareas es un contador. Pongamos un ejemplo de implementación de un contador de software de 2 bits para señales que llegan a través del bus X desde una de las entradas. Para evitar que la señal cambie durante un ciclo de cálculos, escribiremos el valor de la señal de entrada en la celda Y() y luego usaremos este valor para los cálculos. Dado que la señal puede cambiar arbitrariamente, determinaremos mediante programación el flanco positivo de la señal por el cual contaremos. Los siguientes son los cálculos necesarios para completar el cálculo.

    Y(0) = X(0); - aquí fijamos el valor de entrada para el ciclo de cálculo actual.

    Y(1) = Y(0) Y (NO Y(4)); - selector frontal.

    Y(2) = (Y(0) E Y(1)) XOR Y(2); - dígito menos significativo del contador.

    El dígito alto del contador debe cambiarse siempre que el dígito bajo se haya movido al estado 1, entonces obtenemos: Y(3) = (Y(2) AND Y(1) AND Y(0)) XOR Y(3) ;

    Y(4) = Y(0); - aquí el valor Y(0) es fijo y se retrasa mientras se procesa el borde.

    Creemos un archivo de programa de procesamiento step3.mif, que difiere de archivos anteriores con los siguientes códigos de comando:

    Y(803), Y(802) - dígitos del contador, X(0) - evento de entrada que queremos contar. si en señal de entrada puede haber vibración, luego seleccionamos una variable interna Y(800) para fijar el pulso entrante, Y(804) para fijar el pulso retrasado y otra variable Y(801) para resaltar el frente del pulso. En el proyecto de prueba, estas salidas corresponderán a las siguientes salidas: Y(800) ->y0, Y(801) ->y1, Y(802) ->y2, Y(803) ->y3, Y(804) ->y4.

    Realicemos un proyecto de prueba utilizando BPr. Conectaremos cuatro disparadores al bus de salida para que sea más fácil observar el comportamiento de las señales en los diagramas de simulación.

    Simulemos un ejemplo de prueba. El resultado de la simulación se muestra en la Fig. 6.

    Como se puede ver en el diagrama anterior, el microprocesador cuenta los pulsos que llegan a la entrada X, y las salidas y2 e y3 representan valor de salida encimera. Por supuesto, procesar un contador de varios bits requiere una cantidad adecuada de instrucciones. Pero como estamos tratando con FPGA, en el caso de que sea necesario realizar cálculos gran cantidad variables, puede ingresar una serie de contadores en los periféricos para un microprocesador determinado. Las celdas con flip-flops de conteo se pueden proyectar en un campo de memoria de un microprocesador y realizar el conteo cuando se accede a la celda.

    Otra tarea muy común en la gestión objetos discretos- máquina estática. Programar una máquina estática es similar a programar un contador.

    Características comparativas

    A modo de comparación, podemos decir que los microprocesadores conocidos, como el MCS51, ejecutan una instrucción en 12 ciclos de reloj, y sus versiones más "avanzadas" en 4 ciclos de reloj, y sólo el último Cygnal en 1 ciclo de reloj. Los microprocesadores fabricados según la estructura PIC16X ejecutan un comando en 2 ciclos de reloj. La tabla muestra características comparativas microprocesadores integrados. Comparando los recursos ocupados en el cristal, podemos concluir que el uso de un procesador de bits integrado está justificado, ya que con un recurso ocupado muy pequeño permite implementar dispositivos de procesamiento de datos de bits de bastante alta velocidad.

    Mesa. Comparación de características de microcontroladores integrados.

    Notas:

    1. http://www.alatek.com/pages/products/ip_industrial.asp.

    2. http://www.altera.com/products/ip/processors/m-cas-8051-micro.html.

    3. ttp://www.altera.com/products/ip/processors/m-cas-pic165x.html.

    Algunas palabras sobre programas de depuración en microprocesadores integrados

    En el caso de que el desarrollador utilice microprocesadores "externos" a la FPGA para la depuración, normalmente se suministran herramientas de depuración para dichos microprocesadores. EN los últimos microprocesadores parte del emulador en circuito está integrado en el chip y la depuración se lleva a cabo conectando una herramienta de depuración externa. Normalmente, la interfaz JTAG se utiliza para fines de depuración de programas. Al implementar un microprocesador integrado en un sistema en chip, también puede utilizar un emulador en circuito describiéndolo como un archivo de diseño y conectándolo al microprocesador. Sin embargo, también son posibles otras técnicas para depurar programas en FPGA, analizadas anteriormente. Permítanme repetir los puntos principales. de este párrafo, ya que la depuración del proyecto de microprocesador desarrollado y los programas en los que opera es la parte del trabajo que requiere más mano de obra, y los recursos del cristal usado no siempre permiten realizar la depuración de una sola manera.

    En primer lugar, los chips FPGA utilizados son reprogramables, es decir, si se detecta un error, siempre es posible corregir este error sin tener que volver a trabajar todo el dispositivo, y en el caso de los FPGA fabricados con tecnología SRAM, la reprogramación se reduce a simplemente reemplazar el archivo de inicialización. Este reemplazo de archivos también se puede realizar en modo remoto cuando el producto está en el sitio.

    En segundo lugar, al depurar un programa en microprocesadores integrados, existen muchas capacidades de hardware adicionales con las que se puede lograr un resultado positivo rápidamente.

    Dado que todo el proyecto de un microprocesador "casero" está abierto para nosotros y conocemos su estructura, podemos facilitar la depuración de programas con la ayuda de recursos de hardware adicionales, ya que durante el proceso de depuración podemos utilizar FPGA con gran cantidad células de las necesarias para el funcionamiento del proyecto. Esto le permitirá asignar recursos de depuración. Dichos recursos incluyen:

    1. campos de memoria adicionales para llamar programas de prueba y monitorización;
    2. probar entradas y salidas para el microprocesador, lo que le permite leer estados de señal y establecer influencias;
    3. Se pueden utilizar campos de memoria adicionales para incluir analizadores lógicos integrados en el sistema, tanto los incluidos en el kit de herramientas como los "caseros" desarrollados por el usuario, lo cual es muy una herramienta poderosa depuración (ver, por ejemplo);
    4. contadores adicionales, activadores de prueba, etc.

    Además, a los microprocesadores incorporados se puede "conectar" un bloque que realiza las funciones de un emulador en circuito. Con su ayuda, los registros internos del procesador quedan disponibles para el usuario, deteniéndose en la dirección, modo paso a paso, etc.

    Todas estas características le permiten depurar con éxito un programa no sólo en un simulador de software, sino también en "hardware en vivo".

    Conclusión

    En general, el uso de un microprocesador de control en una FPGA permite aumentar la integración del dispositivo y pasar de un "sistema en una placa" a un "sistema en un chip".

    Obtuvimos un microprocesador RISC basado en bits que funciona a una frecuencia de 30 a 300 MHz y ejecuta todas las instrucciones en un ciclo de reloj. Y por tanto, el microprocesador diseñado tiene un rendimiento de 30 a 300 MIPS. El proyecto requiere sólo 64 celdas lógicas y 2 bloques de memoria interna. Al comparar los recursos de chip necesarios para un microprocesador de este tipo, se puede decir que no representan más de una décima parte de los recursos centrales de un microprocesador de 8 bits.

    Este proyecto puede servir como base para el desarrollo de un microprocesador con los recursos informáticos necesarios. Basado en dicho microprocesador, se puede desarrollar un microcontrolador de control agregando bloques al proyecto. dispositivos periféricos a partir de megafunciones de bibliotecas existentes, agregando temporizadores, contadores y otros nodos necesarios para el usuario. El proyecto tiene todo el potencial para convertirse fácilmente en un diseño real.

    Por supuesto, cuando aumento significante La cantidad de entradas y salidas aumenta el archivo de comandos necesarios para procesar datos y, por lo tanto, aumenta el tiempo de procesamiento. Pero en cualquier caso, este tiempo será menor que el de un microprocesador estándar.

    Próximo artículo en este ciclo Habrá un artículo sobre procesadores de pila, sobre microprocesadores Forth y Java.

    Literatura

    1. Karshenboim I. Microprocesador de bricolaje // Componentes y tecnologías. 2002. Núms. 6–7.
    2. Karshenboim I. Microprocesador para aplicaciones integradas Nios. Sistema de mando y comandos definidos por el usuario // Componentes y Tecnologías. 2002. Núms. 8–9.
    3. Karshenboim I. Microprocesador para aplicaciones integradas Nios. Configuración de bus y periféricos // Componentes y Tecnologías. 2002. Núms. 2–5.
    4. I. Karshenboim, N. Semenov. Máquinas microprogramadas basadas en circuitos integrados especializados // Chip News. 2000. N° 7.
    5. I. Karshenboim, K. Palenov. Analizador lógico “integrado”: ​​una herramienta para el desarrollador de sistemas “integrados” // Circuitos. 2001. N° 12.


    
    Arriba