Skip to content

5. Procesador Hormiga 2.1

Mario Esteban Fernandez edited this page Dec 14, 2021 · 1 revision

Características generales:

  • procesador monociclo
  • reloj de 10Hz, 12 MHz o paso a paso
  • 15 Instrucciones de 8 bits: 4bit opcode 4bit args

Modulo de PWM:

Puerto Serie:

  • recibe y manda datos por el puerto serie
  • lo he usado para depurar, ver todos los registros del procesador

Modulo de sincronización:

RAM:

  • 256 bytes data

    memoria de lectura y escritura guarda variables

  • 256 bytes program

    memoria de solo lectura guarda las instrucciones en codigo máquina

Registros

  • 4 registros de proposito general (r0, r1, r2, r3)
  • 4 registros especiales (flags, pc, RPin, WPin)
  • r1, r2 suelen ser argumentos de las instrucciones
  • r1 puede ser un puntero a memoria en load, store, jump
  • r0 suele ser el resultado de la instruccion

flags:

0 menor
1 menor igual
2 igual
3 mayor igual
4 mayor

pc: contador de programa

  • al arrancar empieza en 0
  • suma 1 cada vez que termina un ciclo de reloj (flanco de bajada!)
  • si se ejecuta un jump, se puede cambiar su valor

RPin

  • 8 entradas 1 bit
  • se accede con la instruccion io 0

WPin

  • 8 entradas 1 bit
  • se accede con la instruccion io 1

ALU y control:

  • lee todos los registros, la instruccion actual y la memoria de datos
  • produce 3 bytes de salida (out, control, addr)
  • out es el resultado de la instruccion, por ejemplo, en la suma 1+2 será 3.
  • control son 4 parejas de bits que indican en que registro se va a escribir y controlan la memoria ram
  • addr es la direccion de memoria de la memoria de datos, para las instrucciones de ld y st

Instrucciones:

0  add    args:           reads: r1,r2     writes: r0
    r0=r1+r2 suma
1  sub    args:           reads: r1,r2     writes: r0
    r0=r1-r2 resta
2  addi   args: lit       reads: r0        writes: r0
    r0=r0+lit (4 bits) suma de un literal de 4 bits
3  zero   args: rn        reads:           writes: rn
    rn=0 reset de un registro direccionable rn
4  and    args:           reads: r1,r2     writes: r0
    r0=r1&r2 bitwise and
5  nand   args:           reads: r1,r2     writes: r0
    r0=!(r1&r2) bitwise nand (tambien sirve para hacer not)
6  left   args:           reads: r0        writes: r0
    r0<<1 logical shift left
7  right  args:           reads: r0        writes: r0
    r0>>1 logical shift right
8  copy   args: rn,rm     reads: rn        writes: rm
    rm=rn copia el valor de rn en rm
9  io     args: TODO:args reads: r0        writes: r0
    accede a los registros no direccionables de lectura y escritura
    si el arg es 0, copia RPin a R0
    si el arg es 1, copia r0 a WPin 
10 cmp    args:           reads: r1,r2     writes: flags
    flags=result guarda el resultado de una comparacion en el registro de flags
11 jump   args: flag_sel  reads: r1        writes: pc
    escribe r1 en el pc si la flag seleccionada es 1.
    para hacer salto incondicional flag_sel=8
12 ld     args:           reads: r1,data   writes: r0
    r0=data (en &r1) carga el valor de la posicion r1 de la memoria de datos en r0
13 st     args:           reads: r1,r2     writes: r0,data
    data=r2 (en &r1) guarda el valor de r2 en la posicion r1 de la memoria de datos
14 frst   args:           reads:           writes: flags
    flags=0 resetea el registro de flags
15 not used

ensamblador externo:

  • genera codigo maquina en hexadecimal para pegarlo directamente en las memorias de datos y programa

Por ejemplo:

#7+2
zero r0
addi 7
copy r0r1 
zero r0
addi 2
copy r0r2
add

da como salida:
text: 30 27 81 30 22 82 00

Sintaxis especial

  • "#" al principio de una línea es un comentario
  • "define :nombre valor" para definir una constante

los nombres de constantes deben empezar por ":"

  • "data arg0 arg1 arg2..." para escribir en la memoria de datos
  • ":tag" para definir una etiqueta

el postprocesador sustituirá todas las etiquetas por el numero de instrucción siguiente (en hexadecimal)

  • ignora líneas vacías, espacios y tabuladores al principio y final de cada linea

Posibles mejoras:

  • mejorar el set de instrucciones:

poner argumentos a add para que pueda sumar 2 datos de cualquier registro, en vez de solo r1+r2

también podría mejorar el addi para que me deje sumar literales de 1 byte...

  • cargar datos en memoria desde puerto serie:

para cambiar el programa dinámicamente en vez de recompilar todo el procesador cada vez

  • añadir una memoria de stack para poder hacer subrutinas y recursión.

Pagina web con LEDs virtuales

Instrucciones para arrancar el procesador:

  • cargar el programa que queramos con icestudio
  • arrancar el reloj con el pulsador 1: 3 toques para 12MHz