Rastrear, caminar, correr: CPU inicial

La última vez hablé sobre comenzar un diseño de CPU mirando proyectos más antiguos antes de probar una arquitectura más moderna. Recomendé especialmente Caxton Foster's Blue, aunque (o tal vez porque) estaba en forma esquemática. Aunque los esquemas son fáciles de entender, Blue usa algunas compilaciones pasadas de moda y probablemente debería construir su idea de diseño con su elección de VHDL o Verilog.

En mi caso, mi elección fue Verilog. Puede encontrar mi implementación de Blue en Opencores.org. Hice algunos cambios en el diseño original de Foster. Por ejemplo, armado con memoria de semiconductores, logré obtener todas las instrucciones para operar en un ciclo principal (es decir, por supuesto, 8 ciclos pequeños). También modernicé la generación del reloj y agregué algunos recursos e instrucciones.

Instrucciones

Puede encontrar mi conjunto completo de instrucciones en el archivo azul (busque en el archivo blue-instructions.xls). La hoja de cálculo muestra los mnemónicos, el código de operación y qué operación tiene lugar en cada uno de los ocho subciclos. Aquí hay un ejemplo:

Hablando de mnemónicos, hay un ensamblador simple escrito en Perl (use el script de shell llamado asm para nombrarlo). Este sería un buen lugar para usar mi ensamblaje universal, pero aún no lo he escrito.

Ver mi versión de Blue es útil, no la sigas muy de cerca. Por un lado, usé Blue como un caso de prueba para las herramientas que usé, por lo que hay varios lugares donde hay código alternativo y lugares donde mapeé las puertas de Foster literalmente para ver cómo las herramientas lo manejaban en comparación con compilaciones más oblicuas. Además, tu objetivo real debería ser realizar tu propio proyecto basado en la arquitectura. Sin embargo, tener un ejemplo práctico para observar cuando te atascas no siempre es algo malo.

Generación de reloj

Top.v tiene el módulo azul (no es la mejor convención de nombres). El generador de reloj es parte de control.v y tiene este aspecto:

reg [7:0] onehot;
reg wclks;
assign cp[1]=onehot[0] && (xrun|xdep|xexam);
assign cp[2]=onehot[1];
assign cp[3]=onehot[2];
assign cp[4]=onehot[3];
assign cp[5]=onehot[4];
assign cp[6]=onehot[5];
assign cp[7]=onehot[6];
assign cp[8]=onehot[7] && cycle;
 
 
always @(posedge clk or posedge reset) begin
  if (reset) onehot<=8'b1;
  else begin
    if (start || exam || deposit || abortcycle) onehot<=8'b10000000;
	 else if (xrun||xexam || xdep) onehot<={onehot[6:0], onehot[7]};
  end
 end

Las señales cp son los ciclos de reloj más pequeños. La matriz de una sola tabla es un registro de cambios simple que rastrea el estado. Las otras piezas como inicio, examen y depósito son parte de un panel frontal personalizado que creé (vea el video a continuación). Eso no es parte del diseño original de Foster, pero es un gran uso de la placa Digilent Spartan 3 que aloja la CPU. Desafortunadamente, ese tablero está retirado (otra razón para no copiar el proyecto directamente).

Si no quieres hacer un panel frontal, mi versión de Blue también tiene un puerto serial, y escribí un cargador simple para leer en una pantalla más poderosa (mira el video de la última entrega). De hecho, el panel frontal es incluso más interesante que la CPU en cierto modo.

La placa de demostración tiene cuatro pantallas de 7 segmentos, algunos LED, algunos botones y ocho interruptores. Eso no es suficiente para manejar un procesador de 16 bits. Utilizo un botón para cambiar el significado de la pantalla, y los LED discretos te recuerdan en qué modo se encuentra la pantalla. Al insertar un byte en los interruptores, se cambia el byte anterior hacia arriba para que pueda insertar 16 bits antes de presionar el botón Enter. Si comete un error, simplemente puede ingresar bytes sin presionar adentro. Puedes ver la operación en el video a continuación.

Otras CPU

Hay otras CPU pequeñas, algunas más modernas que Blue y muchas con más funciones. Sin embargo, uno de los problemas que veo es que algunas CPU muy pequeñas no son lo suficientemente completas para ser prácticas o son difíciles de entender. El J1, por ejemplo, está a solo unas 200 líneas de Verilog. Pero es una arquitectura inusual que puede no ser el mejor lugar para comenzar. MCPU es otro procesador muy pequeño que incluso puede coincidir con CPLD.

Independientemente del camino que tome, creo que lo mejor que puede hacer es recordar el título: gatear, caminar, correr. Vacía los cimientos y luego avanza hacia proyectos cada vez más complejos.

  • Escéptico dice:

    ¡Estas publicaciones son geniales! Conseguí el libro Foster y también estoy empezando NAND To Tetris. ¡Cosas fascinantes!

    • iluminado dice:

      NAND To Tetris fue divertido, pero no pasé de la etapa de ASM antes de comenzar un curso de Ruby. Aprender un idioma superficial parecía un poco inútil. Cuando vuelva a los FPGA, podría implementar el libro en mi Nexys, luego lo completaría con un sistema operativo simple y hardware de optimización.

  • ROBÓ dice:

    ¿Existe la posibilidad de que pueda usar el convertidor Verilog a VHDL y publicar ambos formatos? Estoy seguro de que aquí los lectores * útiles * señalarán algunos errores del convertidor.

    Realmente me gustaría leer artículos sobre CPLD / FPGA y HDL, pero Verilog no significa nada para mí.

Óscar Soto
Óscar Soto

Deja una respuesta

Tu dirección de correo electrónico no será publicada.