-
Notifications
You must be signed in to change notification settings - Fork 1
5. Procesador Hormiga 2.1
Mario Esteban Fernandez edited this page Dec 14, 2021
·
1 revision
- procesador monociclo
- reloj de 10Hz, 12 MHz o paso a paso
- 15 Instrucciones de 8 bits: 4bit opcode 4bit args
- recibe 2 bits y lo pasa a 2 señales de PWM para controlar los servos
- funciona igual que el que vimos en clase: https://github.com/myTeachingURJC/Mecatronica/wiki/L8:-Control-digital-de-motores#generador-de-se%C3%B1ales-pwm
- recibe y manda datos por el puerto serie
- lo he usado para depurar, ver todos los registros del procesador
- recibe las entradas de los sensores y las sincroniza con el reloj antes de que pasen a los registros del procesador.
- importante para evitar glitches, más info:https://github.com/myTeachingURJC/Mecatronica/wiki/S5:-Sensores-binarios#etapa-3-sincronizaci%C3%B3n
-
256 bytes data
memoria de lectura y escritura guarda variables
-
256 bytes program
memoria de solo lectura guarda las instrucciones en codigo máquina
- 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
0 menor
1 menor igual
2 igual
3 mayor igual
4 mayor
- 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
- 8 entradas 1 bit
- se accede con la instruccion io 0
- 8 entradas 1 bit
- se accede con la instruccion io 1
- 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
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
- 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
- "#" 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
- 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.
- basada en https://github.com/myTeachingURJC/Mecatronica/wiki/S6:-Comunicaciones#componentes-virtuales-en-la-fpga
- se conecta con el procesador y puede mandar y recibir bits, que uso para encender leds virtuales.
- https://danparseg.github.io/github_pages_test/
- cargar el programa que queramos con icestudio
- arrancar el reloj con el pulsador 1: 3 toques para 12MHz