domingo, 3 de marzo de 2024

Estado del Proyecto

Un computador no es solo una CPU que pueda ejecutar instrucciones. Para ser una máquina útil, requiere de hardware y software con los que accionar con el mundo real.

J1s: la CPU

  wire [16:0] minus = {1'b1, ~st0} + st1 + 1;
  wire signedless = st0[15] ^ st1[15] ? st1[15] : minus[16];

  always @*
  begin
    // Compute the new value of st0
    casez ({pc[12], insn[15:8]})
      9'b1_???_?????: st0N = insn;                    // literal
      9'b0_1??_?????: st0N = { {(`WIDTH - 15){1'b0}}, insn[14:0] };    // literal
      9'b0_000_?????: st0N = st0;                     // jump
 

El módulo CPU (Verilog) está completo. Queda por mejorar el módulo UART, usado para comunicación serial y que oficia de consola/tty (falla en reconocer apropiadamente los caracteres de entrada, por su baja tasa de muestreo).

Como quedan bits sin usar en el juego de instrucciones, hay espacio para definir nuevas instrucciones de máquina que pueden ser utiles para reducir el tamaño final del código.

Otros módulos por implementar son I2C y SPI, de uso habitual para conectar sensores y actuadores con microcontroladores.

También hay que implementar la configuración dinámica de los pines (de Entrada a Salida y viceversa), un reloj por hardware (necesario para el timing en la interacción con sensores y actuadores), entre otros.

 

J1asm: El ensamblador

  30           ;-------------------------- Kernel ----------------------
  31           ;
  32           ;
  33 0000 8000     0                   ;   Marca el fin del stack de retorno.
  34 0001 6127     >r
  35 0002 4f64     call init
  36           
  37           try:
  38               ;   Ejecutamos la palabra REPL, que ejecuta el ciclo
  39               ;   de leer y evaluar una línea de programa.
  40               ;   Este ciclo es infinito, por lo que code_evaluate
  41               ;   no debiera retornar nunca, pero ...
  42 0003 8007     repl
  43 0004 44e3     call move_2_TIB
  44 0005 402e     call code_evaluate

 

El ensamblador (Python) está completo. Su único objetivo real es compilar el kernel de Forth, por lo que sus capacidades se limitan a lo estrictamente necesario.

Es un ensamblador de dos pasos que genera directamente la imagen a cargar en la RAM de la tarjeta FPGA. También genera información de ayuda a la emulación.

J1emu: El emulador

El emulador (Python) es una aplicación de línea de comando. Está completo;  funciona adecuadamente y sin él habría sido imposible depurar el kernel.

Pero hay una larga lista de deseos, el primero de los cuales es convertirlo en una aplicación ncurses, para ordenar mejor la información presentada y permitir la interrupción del código desde el teclado en cualquier momento.

Otra función útil es un "mapa de calor" de la ejecución, que permita identificar donde gasta su tiempo la CPU y saber así que se debe optimizar.

Forth: El kernel

 

El kernel de Forth (una mezcla de Assembler y Forth) está completo. Puede ejecutar cualquier código Forth válido. Si una palabra no existe, se puede crear dentro de la misma implementación.

Queda escribir los drivers para el hardware y las librerías para procesar los diversos sensores y actuadores a conectar.

Por ahora la tarea es reducir el tamaño del kernel a menos de 2K celdas, dejando así otros 2K libres.

¿Un compilador Forth?

Trabajando con microprocesadores, el espacio es un recurso escaso. Una manera de reducir aún más el código en aplicaciones reales es compilar Forth mas la aplicación en el PC, descartando todo el código sin uso.


No hay comentarios.:

Publicar un comentario