-
Notifications
You must be signed in to change notification settings - Fork 203
Capítulo 30: Hacia el microprocesador y más allá

Ejemplos de este capítulo en github
Uno de los aspectos que más me apasionan de las FPGAs es la posibilidad de crear tu propio microprocesador y hacerlo funcionar en la FPGA. En este último capítulo diseñaremos un microprocesador extremadamente simple: Microbio. Sólo tiene 4 instrucciones y apenas nos permite hacer nada, sin embargo, es un punto de partida para poder ampliarlo con nuevas instrucciones y empezar a adentrarse en este apasionante mundo. ¿Te animas a hacer tu propio microprocesador?
Microbio es un procesador "hola mundo". Es extremadamente simple, pero es perfecto para comprender su funcionamiento: leer instruciones de la memoria principal y ejecutarlas
En realidad, Microbio es un microcontrolador: es un microprocesador que incluye la memoria y dos periféricos simples: un puerto de 4 bits para mostrar información por los leds y un temporizador de 100ms
- Memoria ROM de 64 bytes (6 bits para las direcciones)
- Instrucciones de 8 bits
- 4 instrucciones: HALT, LEDS, WAIT y JP
- No puede realizar cálculos: no tiene unidad aritmético lógica
- No tiene registros de propósito general para almacenar información o hacer operaciones
- Funcuencia de funcionamiento: Reloj de 12MHz
- Tiene 2 periféricos:
- Puerto de salida de 4 bits: conectado a los leds
- Temporizador de 100ms
- Indicador de programa terminado: El led verde se activa cuando se ejecuta la instrucción HALT que detiene el microprocesador
Microbio se comunica con el exterior mediante los siguientes pines:

- clk: Entrada de reloj. Se conecta el reloj de 12 MHz de la FPGA
- rstn: Entrada de reset. Está conectada a la señal DTR para poder hacer reset desde el PC. Al hacer un reset, microbio empieza a ejecutar el programa que tiene almacenado a partir de la dirección de memoria 0
- stop: Señal de salida, conectada al led verde de la placa Icestick. Se pone a 1 cuando Microbio ha ejecutado la instrucción HALT y el programa ha terminado
- leds: Puerto de salida de 4 pines. Está conectado a los 4 leds rojos de la icestick
Microbio puede ejecutar las 4 instrucciones siguientes:
| Instrucción | Operando | Descripción |
|---|---|---|
| HALT | Detener la ejecución. Se activa la señal stop que se muestra por el led verde | |
| LEDS | val | Escribir el dato val en el puerto de salida de 4 bits, para visualizarlo en los leds |
| WAIT | Realizar una pausa de 100ms | |
| JP | dir | Saltar a la dirección de memoria indicada por el operador dir |
Microbio dispone de una memoria ROM de 64 posiciones donde se almacena el programa a ejecutar. Cada instrucción tiene un ancho de 8 bits

Todas las instrucciones de microbio tienen el mismo formato, que se muestra a continuación:

Constan de dos campos:
- Código de operación (CO): Campo de 2 bits que indica el tipo de operación (HALT, LEDS, WAIT o JP)
- Campo de datos (DAT): Campo de 6 bits que contiene el dato necesario para las instrucciones LEDS y JP
La tabla con los códigos de operación es:
| Instrucción | Código de operación (binario) |
|---|---|
| WAIT | 00 |
| HALT | 01 |
| LEDS | 10 |
| JP | 11 |
Se muestran tres programas de ejemplo muy sencillo para probar el procesador microbio y aprender su programación: M0.asm, M1.asm y M2.asm
Las instructiones que entiendo microbio están en código máquina: son números almacenados en su memoria rom, que el procesador va leyendo secuencialmente y ejecutando. Podemos programar microbio directamente en código máquina, escribiendo los números hexadecimales de sus instrucciones en el fichero prog.list
Sin embargo, es mucho más sencillo escribir programas en el lenguaje ensamblador de Microbio y utilizar un programa ensamblador para traducirlos a código máquina. Este proceso se denomina ensamblado

El ensamblador de microbio se llama masm.py, y ha sido programado en python 3.5. Para ensamblar el programa M0.asm,por ejemplo, hay que ejecutar el siguiente comando:
$ python3 masm.py M0.asm
Assembler for the MICROBIO microprocessor
Released under the GPL license
File prog.list successfully generated
Esto genera el fichero prog.list con el código máquina, que será cargado en la memoria rom de microbio al realizar la síntesis / simulación
Si se ejecuta con la opción -verbose se obtiene más información:
$ python3 masm.py M0.asm -verbose
Assembler for the MICROBIO microprocessor
Released under the GPL license
File prog.list successfully generated
Symbol table:
Microbio assembly program:
[00] LEDS 0xF
[01] HALT
Machine code:
8F //-- [00] LEDS 0xF
40 //-- [01] HALT
Nos devuelve la tabla de símbolos (en este caso no hay porque no se han definido etiquetas), el programa en ensamblador, ya procesado y el programa generado en código máquina
Las fuentes del programa masm.py están disponibles en el repositorio de este capítulo, de forma que se pueda estudiar cómo funciona y sobre todo mejorarlo y ampliarlo. Por ejemplo, si se amplían las instrucciones de Microbio, será necesario que el ensamblador las soporte
TODO
0 You are leaving the privative sector (EN)
1 ¡Hola mundo! (EN) (RU)
2 De un bit a datos (EN)
3 Puerta NOT (EN)
4 Contador de 26 bits (EN)
5 Prescaler de N bits (EN)
6 Múltiples prescalers (EN)
7 Contador de 4 bits con prescaler (EN)
8 Registro de 4 bits (EN)
9 Inicializador (EN)
10 Registro de desplazamiento (EN)
11 Multiplexor de 2 a 1 (EN)
12 Multiplexor de M a 1 (EN)
13 Inicializando registros (EN)
14 Registro de N bits con reset síncrono
15 Divisor de frecuencias
16 Contador de segundos
17 Generando tonos audibles
18 Tocando notas
19 Secuenciando notas
20 Comunicaciones serie asíncronas
21 Baudios y transmisión
22 Reglas de diseño síncrono
23 Controladores y autómatas finitos
24 Unidad de transmisión serie asíncrona
25 Unidad de recepción serie asíncrona
26 Memoria ROM
27 Memoria ROM genérica
28 Memoria RAM
29 Puertas triestado
30 Hacia el microprocesador y más allá