Capítulo 30 Hacia el microprocesador y más allá.pdf

Embed Size (px)

Citation preview

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    1/17

    Inicio (EN)

    Capítulos

    0 You are leaving the privativesector (EN)1 ¡Hola mundo! (EN)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 prescalers7 Contador de 4 bits con prescaler 8 Registro de 4 bits9 Inicializador 10 Registro de desplazamiento11 Multiplexor de 2 a 112 Multiplexor de M a 113 Inicializando registros14 Registro de N bits con resetsíncrono

    15 Divisor de frecuencias16 Contador de segundos17 Generando tonos audibles18 Tocando notas19 Secuenciando notas20 Comunicaciones serieasíncronas21 Baudios y transmisión22 Reglas de diseño síncrono23 Controladores y autómatasfinitos24 Unidad de transmisión serieasíncrona25 Unidad de recepción serie

    asíncrona26 Memoria ROM27 Memoria ROM genérica28 Memoria RAM29 Puertas triestado30 Hacia el microprocesador y másallá

    Clone this wiki locally

    Capítulo 30: Hacia el microproce sa dor y más alláTestato edited this page Feb 22, 2016 · 46 revisions

    Ejemplo s de est e capítulo e n gith ub

    In tro duc ció nUno de los aspectos que más me apasionan de las FPGAs es la posibilidad de crear tu propiomicroprocesador y hacerlo funcionar en la FPGA . En este último capítulo diseñaremos unmicroprocesador extremadamente simple: Microbio . Sólo tiene 4 instrucciones y apenas nospermite hacer nada, sin embargo, es un punto de partida para poder ampliarlo con nuevasinstrucciones y empezar a adentrarse en este apasionante mundo. ¿Te animas a hacer tu propiomicroprocesador?

    Microprocesador MicrobioMicrobio es un procesador "hola mundo" . Es extremadamente simple, pero es perfecto paracomprender su funcionamiento: leer instruciones de la memoria principal y ejecutarlas

    En realidad, Microbio es un microcontrolador : es un microprocesador que incluye la memoria ydos periféricos simples: un puerto de 4 bits para mostrar información por los leds y untemporizador de 200ms

    Características

    Memoria ROM de 64 bytes (6 bits para las direcciones)

    Instrucciones de 8 bits4 instrucciones: HALT, LEDS, WAIT y JPNo puede realizar cálculos: no tiene unidad aritmético lógicaNo tiene registros de propósito general para almacenar información o hacer operacionesFuncuencia de funcionamiento: Reloj de 12MHz

    13 31 15Watch Star ForkObijuan / open-fpga-verilog-tutorial

    Code Issues 0 Pull requests 0 Wiki Pulse Graphs

    Pages 40

    https://github.com/Obiju

    Personal Open source Business Explore Pricing Blog Support This repository Search Sign upSign in

    http://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-28%3A-Memoria-RAMhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorialhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/issueshttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/pullshttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wikihttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/pulsehttps://github.com/http://localhost/var/www/apps/conversion/tmp/scratch_4/personalhttp://localhost/var/www/apps/conversion/tmp/scratch_4/open-sourcehttp://localhost/var/www/apps/conversion/tmp/scratch_4/businesshttp://localhost/var/www/apps/conversion/tmp/scratch_4/explorehttps://github.com/Obijuan/open-fpga-verilog-tutorial/tree/master/tutorial/ICESTICK/T30-microbiohttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-29%3A-Puertas-triestadohttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-28%3A-Memoria-RAMhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-27%3A-Memoria-ROM-gen%C3%A9ricahttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-26%3A-Memoria-ROMhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-25%3A-Unidad-de-recepci%C3%B3n-serie-as%C3%ADncronahttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-24%3A-Unidad-de-transmisi%C3%B3n-serie-as%C3%ADncronahttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-23%3A-Controladores-y-aut%C3%B3matas-finitoshttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-22%3A-Reglas-de-dise%C3%B1o-s%C3%ADncronohttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-21%3A-Baudios-y-transmisi%C3%B3nhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-20%3A-Comunicaciones-serie-as%C3%ADncronashttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-19%3A-Secuenciando-notashttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-18%3A-Tocando-notashttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-17%3A-Generando-tonos-audibleshttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-16%3A-Contador-de-segundoshttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-15%3A-Divisor-de-frecuenciashttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-14%3A-Registro-de-N-bits-con-reset-s%C3%ADncronohttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-13%3A-Inicializando-registroshttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-12%3A-Multiplexor-de-M-a-1http://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-11%3A-Multiplexor-de-2-a-1http://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-10%3A-Registro-de-desplazamientohttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-9%3A-Inicializadorhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-8%3A-registro-de-4-bitshttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-7%3A-Contador-de-4-bits-con-prescalerhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-6%3A-Multiples-prescalershttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-5%3A-N-bit-prescalerhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-5%3A-Prescaler-de-N-bitshttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-4%3A-26-bit-counterhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-4%3A-Contador-de-26-bitshttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-3%3A-NOT-Gate.-Invhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-3%3A-Puerta-NOT.-Invhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-2%3A-From-bit-to-data.-Fporthttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-2%3A-De-un-bit-a-datos.-Fporthttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-1%3A-%C2%A1Hello-world%21-Setbithttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-1%3A-%C2%A1Hola-mundo%21-Setbithttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-0%3A-you-are-leaving-the-privative-sectorhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-0%3A-you-are-leaving-the-privative-sectorhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Home_ENhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Homehttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-30:-Hacia-el-microprocesador-y-m%C3%A1s-all%C3%A1/_historyhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/graphshttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/pulsehttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/wikihttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/pullshttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/issueshttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorialhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorialhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuanhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/networkhttp://localhost/var/www/apps/conversion/tmp/scratch_4/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorialhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/stargazershttp://localhost/var/www/apps/conversion/tmp/scratch_4/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorialhttp://localhost/var/www/apps/conversion/tmp/scratch_4/Obijuan/open-fpga-verilog-tutorial/watchershttp://localhost/var/www/apps/conversion/tmp/scratch_4/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorialhttps://help.github.com/http://localhost/var/www/apps/conversion/tmp/scratch_4/bloghttp://localhost/var/www/apps/conversion/tmp/scratch_4/pricinghttp://localhost/var/www/apps/conversion/tmp/scratch_4/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorial%2Fwiki%2FCap%25C3%25ADtulo-30%3A-Hacia-el-microprocesador-y-m%25C3%25A1s-all%25C3%25A1http://localhost/var/www/apps/conversion/tmp/scratch_4/join?source=header-repohttp://localhost/var/www/apps/conversion/tmp/scratch_4/explorehttp://localhost/var/www/apps/conversion/tmp/scratch_4/businesshttp://localhost/var/www/apps/conversion/tmp/scratch_4/open-sourcehttp://localhost/var/www/apps/conversion/tmp/scratch_4/personalhttps://github.com/

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    2/17

    Tiene 2 periféricos :Puerto de salida de 4 bits: conectado a los ledsTemporizador de 200ms

    Indicador de programa terminado: El led verde se activa cuando se ejecuta la instrucciónHALT que detiene el microprocesador

    Interfaz con el exterior

    Microbio se comunica con el exterior mediante los siguientes pines:

    clk : Entrada de reloj. Se conecta el reloj de 12 MHz de la FPGArstn : Entrada de reset. Está conectada a la señal DTR para poder hacer reset desde el PC. Alhacer un reset, microbio empieza a ejecutar el programa que tiene almacenado a partir de ladirección de memoria 0

    stop : Señal de salida, conectada al led verde de la placa Icestick. Se pone a 1 cuandoMicrobio ha ejecutado la instrucción HALT y el programa ha terminadoleds : Puerto de salida de 4 pines. Está conectado a los 4 leds rojos de la icestick

    Instrucciones

    Microbio puede ejecutar las 4 instrucciones siguientes:

    Instrucción Operando Descripción

    HALTDetener la ejecución. Se activa la señal stop que se muestrapor el led verde

    LEDS val Escribir el dato val en el puerto de salida de 4 bits, paravisualizarlo en los leds

    WAIT Realizar una pausa de 200ms

    JP dir Saltar a la dirección de memoria indicada por el operador dir

    Memoria

    Microbio dispone de una memoria ROM de 64 posiciones donde se almacena el programa aejecutar. Cada instrucción tiene un ancho de 8 bits

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    3/17

    Formato de instrucciones

    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 lasinstrucciones LEDS y JP

    La tabla con los códigos de operación es:

    InstrucciónCódigo de operación

    (binario)

    WAIT 00

    HALT 01

    LEDS 10

    JP 11

    Programas de ejemploSe muestran tres programas de ejemplo muy sencillo para probar el procesador microbio yaprender su programación: M0.asm , M1.asm y M2.asm

    Ensamblador de MicrobioLas instructiones que entiendo microbio están en código máquina : son números almacenados ensu memoria rom, que el procesador va leyendo secuencialmente y ejecutando. Podemosprogramar microbio directamente en código máquina, escribiendo los números hexadecimalesde sus instrucciones en el fichero prog.list

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    4/17

    Sin embargo, es mucho más sencillo escribir programas en el lenguaje ensamblador deMicrobio y utilizar un programa ensamblador para traducirlos a código máquina . Este procesose denomina ensamblado

    El ensamblador de microbio se llama masm.py , y ha sido programado en python 3.5 (Aunquefunciona igual en 2.7.9) . Para ensamblar el programa M0.asm ,por ejemplo, hay que ejecutar elsiguiente comando:

    $ python3 masm.py M0.asmAssembler for the MICROBIO microprocessorReleased 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 demicrobio 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 -verboseAssembler for the MICROBIO microprocessorReleased under the GPL license

    File prog.list successfully generated

    Symbol table:

    Microbio assembly program:

    [00] LEDS 0xF[01] HALT

    Machine code:

    8F //-- [00] LEDS 0xF40 //-- [01] HALT

    Nos devuelve la tabla de símbolos (en este caso no hay porque no se han definido etiquetas), elprograma 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 , deforma que se pueda estudiar cómo funciona y sobre todo mejorarlo y ampliarlo. Por ejemplo, si seamplían las instrucciones de Microbio, será necesario que el ensamblador las soporte

    M0.asm: Hola mundo

    El primer programa que haremos en Microbio es el M0.asm : Enciende los 4 leds rojos con lainstrucción LEDS y se para:

    //-- M0.asm: Ejemplo hola mundo para el procesador MICROBIO//-- Encender todos los leds y terminar

    LEDS 0xF //-- Encender todos los ledsHALT //-- Terminar

    https://github.com/Obijuan/open-fpga-verilog-tutorial/tree/master/tutorial/ICESTICK/T30-microbio

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    5/17

    El fichero prog.list , con el código máquina esamblado a través de masm.py es:

    8F //-- [00] LEDS 0xF40 //-- [01] HALT

    Sólo ocupa 2 bytes, uno por cada instrucción

    En el apartado de simulación y pruebas se muestran más detalles, pero para hacer una primeraprueba en la placa icestick, el proceso a seguier es:

    Ensamblar el programa****

    $ python3 masm.py M0.asm

    Sintetizar :

    $ make sint

    Cargar microbio con su programa en la FPGA :

    $ sudo iceprog microbio.bin

    Desactivar el DTR para hacer RESET : Ejecutar el programa gtkterm y pulsar la tecla F7 paradesactivar el DTR y que se haga un reset del micro. El programa comenzará a ejecutarse

    El resultado de la ejecución será que se encienden tanto los 4 leds rojos como el led verde(por ejecutarse la instrucción HALT)

    M1.asm: Secuencia en los leds

    Este ejemplo hace una secuencia de 4 valores en los leds y termina. En la secuencia seenciende un único led cada vez, que rota en sentido horario. Al llegar la posición inicial se termina

    Se utiliza la instrucción WAIT que genera un retraso de 200ms

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    6/17

    //-- M1.asm: Ejemplo de una secuencia simple, sin repeticion

    LEDS 0x1 //-- Encender primer ledWAIT //-- EsperarLEDS 0x2 //-- Segundo ledWAITLEDS 0x4 //-- Tercer ledWAITLEDS 0x8 //-- Cuarto ledWAIT

    LEDS 0x1 //-- Primer ledHALT //-- Terminar

    El fichero prog.list , con el código máquina esamblado a través de masm.py es:

    81 //-- [00] LEDS 0x100 //-- [01] WAIT82 //-- [02] LEDS 0x200 //-- [03] WAIT84 //-- [04] LEDS 0x400 //-- [05] WAIT88 //-- [06] LEDS 0x800 //-- [07] WAIT

    81 //-- [08] LEDS 0x140 //-- [09] HALT

    Para probarlo hay que seguir los mismos pasos que para el programa M0.asm

    M2.asm: Secuencia con repetición infinita

    Como tercer ejemplo, se ejecuta una secuencia en los leds infinita . Tiene dos partes: la primeraes una rotación en sentido horario, similar a la del ejemplo anterior (M1.asm). Cuando termina seinicia otra, que tarda el doble de tiempo . Para ello se ejecutan seguidas dos instruccionesWAIT , lográndose una pausa de 400ms

    Al llegar al final, se comienza desde el principio mediante la instrucción JP (jump).

    Se utilizan etiquetas para facilitar la escritura del programa en ensamblador, pero se podríadirectamente usar la instrucción JP 0 que salta a la dirección 0, en vez de JP ini

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    7/17

    //-- M2.asm: Ejemplo de una secuencia infinita

    ini: LEDS 0x01 WAIT LEDS 0x2 WAIT LEDS 0x4 WAIT LEDS 0x8

    WAIT LEDS 0x1 WAIT WAIT LEDS 0x3 WAIT WAIT LEDS 0x6 WAIT WAIT LEDS 0xC WAIT WAIT LEDS 0x9

    WAIT WAIT

    JP ini //-- Saltar al comienzo

    El código máquina generado por el masm.py es:

    81 //-- [00] LEDS 0x100 //-- [01] WAIT82 //-- [02] LEDS 0x200 //-- [03] WAIT84 //-- [04] LEDS 0x400 //-- [05] WAIT

    88 //-- [06] LEDS 0x800 //-- [07] WAIT81 //-- [08] LEDS 0x100 //-- [09] WAIT00 //-- [0A] WAIT83 //-- [0B] LEDS 0x300 //-- [0C] WAIT00 //-- [0D] WAIT86 //-- [0E] LEDS 0x600 //-- [0F] WAIT00 //-- [10] WAIT8C //-- [11] LEDS 0xC00 //-- [12] WAIT00 //-- [13] WAIT

    89 //-- [14] LEDS 0x900 //-- [15] WAIT00 //-- [16] WAITC0 //-- [17] JP 0x0

    Al ensamblar en el modo "verbose", podemos ver cómo la tabla de símbolos contiene la etiquetaINI, asignada a la dirección 0:

    Symbol table:

    INI = 0x00

    Implementación de MicrobioEl procesador está formado por su ruta de datos y su unidad de control que genera lasmicroórdenes de gobierno de la ruta de datos

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    8/17

    Diagrama de bloques

    El diagrama de bloques se muestra en la siguiente figura:

    Las señales en rojo son las microórdenes, generadas por la unidad de control.

    Ruta de datos

    La ruta de datos incluye los siguientes elementos:

    Memoria ROM : Memoria de anchura 8 bits y 64 posiciones (Bus de direcciones de 6 bits). Almacena el programa en código máquina que MICROBIO debe ejecutar. Se lee desde elfichero prog.list

    Contador de programa (CP) : Registro de 6 bits que almacena la dirección de la siguienteinstrucción a ejecutar. Cuando está activada la microórden cp_inc , se incrementa en unaunidad. Si está activada cp_load se carga con un valor nuevo procedente del campo DAT dela instrucción almacenada en el registro de instrucción

    Registro de instrucción (RI) : Registro de 8 bits que almacena la instrucción leída dememoria . Cuando está activada la microórden ri_load se carga con el dato proveniente de lamemoria

    Registro LEDS : Registro de 4 bits , cuya salida está conectada a los 4 leds rojos de laicestick. Se carga el valor proveniente del campo de datos DAT cuando se activa lamicroórden leds_load

    Divisor de 200ms : Registro que hace de divisor de reloj para generar a su salida una señalque emite un pulso cada 200ms. Este pulso es leído por la unidad de control para generar unretardo de 200ms cuando se está ejecutando la instrucción WAIT

    Unidad de control : Máquina de estados que genera las microórdenes

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    9/17

    Registro de halt : Registro de 1 bit para encender el led verde al ejecutarse la instrucciónHALT.

    Registro de reset : Registro de 1 bit para sincronizar la señal de reset (y hacerla síncrona)

    Controlador

    Las microórdenes generadas son por la unidad de control son:

    cp_inc : Incrementar contador de programacp_load : Cargar contador de programari_load : Cargar registro de instrucciónleds_load : Cargar registro de ledshalt : Instrucción halt ejecutada

    El autómata tiene 3 estados, mostrados en el siguiente diagrama:

    Los estados son:

    INIT: Estado de reposo. Todas las señales están a 0FETCH : Ciclo de carga de la instrucción. Pasa de la memoria rom al registro de instrucción RIEXEC : Ciclo de ejecución. Se ejecuta la instrucción correspondiente. Dependiendo de lainstrucción que sea, se activan unas microordenes u otras. En el caso de la instrucción JP, sepasa al estado de INIT antes de volver a cargar la siguiente instrucción

    Todos los estados duran 1 ciclo , salvo el de exec al ejecutar la instrucción WAIT (que dura200ms) Al ejecutar la instrucción HALT se activa la microorden halt a 1 y se permanece en elmismo estado hasta que se haga un reset

    Microbio.v: Descripción en verilogEsta es la descripción completa del microprocesador en verilog:

    //-- Fichero microbio.v`default_nettype none`include "divider.vh"

    //-- Procesador microbiomodule microbio ( input wire clk, //-- Reloj del sistema input wire rstn_ini, //-- Reset output wire [ 3: 0] leds, //-- leds output wire stop); //-- Indicador de stop

    //-- Parametro: Tiempo de espera para la instruccion WAITparameter WAIT_DELAY = ̀ T_200ms;

    //-- Parametro: fichero con el programa a cargar en la romparameter ROMFILE = "prog.list" ;

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    10/17

    --localparam AW = 6; //-- Anchura del bus de direccioneslocalparam DW = 8; //-- Anchura del bus de datos

    //-- Codigo de operacion de las instruccioneslocalparam WAIT = 2'b00 ;localparam HALT = 2'b01 ;localparam LEDS = 2'b10 ;localparam JP = 2'b11 ;

    //-- Instanciar la memoria ROMwire [DW - 1: 0] data;wire [AW - 1: 0] addr;genrom #( .ROMFILE(ROMFILE), .AW(AW), .DW(DW)) ROM ( .clk(clk), .addr(addr), .data(data) );

    //-- Registrar la señal de resetreg rstn = 0;

    always @( posedge clk) rstn

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    11/17

    if ( ! rstn)

    leds_r

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    12/17

    halt = 1; //-- Activar microorden de halt next_state = EXEC; //-- Permanecer en este estado indefinidamente end

    //-- Instruccion WAIT WAIT: begin //-- Mientras no se active clk_tic, se sigue en el mismo //-- estado de ejecucion if (clk_tic) next_state = FETCH; else next_state = EXEC; end

    //-- Instruccion LEDs LEDS: leds_load = 1; //-- Microorden de carga en el registro de leds

    //-- Instruccion de Salto JP: begin cp_load = 1; //-- Microorden de carga del CP next_state = INIT; //-- Realizar un ciclo de reposo para //-- que se cargue CP antes del estado FETCH end

    endcase

    end endcase

    end

    //-- Divisor para marcar la duracion de cada estado del automatadividerp1 #(WAIT_DELAY) TIMER0 ( .clk(clk), .clk_out(clk_tic) );

    endmodule

    SimulaciónEl banco de pruebas de microbio simplemente activa la señal de reset y genera la señal de reloj.El fichero verilog es el siguiente:

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    13/17

    module microbio_tb ();

    //-- Para la simulacion se usa un WAIT_DELAY de 3 ciclos de relojparameter WAIT_DELAY = 3;parameter ROMFILE = "prog.list" ;

    //-- Registro para generar la señal de relojreg clk = 0;

    //-- Datos de salida del componente

    wire [ 3: 0] leds;wire stop;reg rstn = 0;

    //-- Instanciar el componentemicrobio #(.WAIT_DELAY(WAIT_DELAY), .ROMFILE(ROMFILE)) dut ( .clk(clk), .rstn_ini(rstn), .leds(leds), .stop(stop) );

    //-- Generador de reloj. Periodo 2 unidades

    always #1 clk = ~clk;

    //-- Proceso al inicioinitial begin

    //-- Fichero donde almacenar los resultados $dumpfile ( "microbio_tb.vcd" ); $dumpvars ( 0 , microbio_tb);

    #2 rstn

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    14/17

    Para entender la ejecución del programa (que sólo tiene 2 instrucciones: (8F, 40)) nos fijamos enla señal state , que nos indica el estado de la unidad de control . Sus valores en el tiempo secorresponden con 0, 1, 2, 1, 2 que se corresponden con los estados INIT, FETCH, EXEC, FETCHy EXEC. Es decir, que efectivamente se ejecutan 2 instrucciones (hay dos ciclos de captura y dosciclos de ejecución)

    En la parte inferior observamos las microórdenes . Vemos que en la última ejecución se haactivado halt a 1 y a partir de ahí la actividad del micro ha cesado

    El contador de programa , CP, toma los valores 0, 1 y 2, para acceder a esas direcciones (A la 2no accede, pero apunta a ella porque contiene la dirección de la siguiente instrucción a ejecutar,que estaría en esa dirección)

    El registro de instrucción inicialmente está a 0 y luego toma los valores 8F y 40, que secorresponden con las instrucciones del programa

    Haciendo el seguimiento de todas las señales, concluimos que el micro ha ejecutadocorrectamente el programa M0.asm

    Simulación de M1.asm

    De igual manera simulamos el programa M1.asm. Primero lo ensamblamos:

    $ python3 masm.py M1.asm

    y lanzamos la simulación:

    $ make sim

    Ahora el resultado de la simulación es el siguiente:

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    15/17

    En el registro de instrucciones vemos que se cargan TODAS las instrucciones del programa:81, 00, 82, 00, 84, 00, 88, 00, 81, 40. El contador de programa llega hasta la dirección 0xA, y seactiva la señal de halt

    Simulación de M2.asmPrimero lo ensamblamos:

    $ python3 masm.py M2.asm

    y lanzamos la simulación:

    $ make sim

    El resultado de la simulación es el siguiente:

    Se puede ver la ejecución de las primeras 13 instrucciones. En este otro pantallazo se puede ver la parte final:

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    16/17

    El ejecutarse la instrucción JP 0 (0xC0) el contador de programa pasa a valer 0 de nuevo por loque se vuelven a ejecutar las instrucciones del principio

    Síntesis y pruebasUna vez ensamblado cualquiera de los programas de prueba: M0.asm, M1.asm ó M2.asm, lasintesis se realiza con el comando:

    $ make sint

    Los recursos empleados son:

    Recurso ocupación

    PIOs 9 / 96

    PLBs 23 / 160

    BRAMs 1 / 16

    y se carga en la FPGA con el comando:

    $ sudo iceprog microbio.bin

    Al ejecutar el programa M1.asm, el resultado es que el led da una vuelta en sentido horario y seenciende el led verde. Se puede ver en este vídeo de youtube:

    La secuencia generada en el programa M2.asm es la mostrada en este vídeo:

    https://www.youtube.com/watch?v=JT47CFtsEjU

  • 8/17/2019 Capítulo 30 Hacia el microprocesador y más allá.pdf

    17/17

    Ejercicios propuestosTODO

    DocumentaciónOtros microprocesadores para seguir aprendiendo:

    Microprocesador Simplez en Verilog . Implementación en Verilog del micro Simplez, creadopor el Profesor Gregorio Fernández. ETSI Telecomunicaciones. UPMProyecto navre . Un micro AVR en verilogMicro J1a CPU mínima de 16 bits. Implementada en Verilog

    ConclusionesTODO

    DESPEDIDAEste es el último capítulo del tutorial . Ahora que tenemos herramientas libres para crear hardware ya no hay límite. Entre todos podemos mejorar y ampliar el patrimonio tecnológico dela humanidad con nuestras aportaciones hardware. Ahora tenemos la libertad para poderlo

    hacer. ¡Hagámoslo!

    Que el hardware libre os acompañe

    Saludos, OBIJUAN

    FPGA Libres: [ Wiki] [Repo ]

    Status API Training Shop Blog About© 2016 GitHub,Inc. Terms Privacy Security Contact Help

    https://help.github.com/https://github.com/contacthttps://github.com/securityhttps://github.com/site/privacyhttps://github.com/site/termshttps://github.com/abouthttps://github.com/bloghttps://shop.github.com/https://training.github.com/https://developer.github.com/https://status.github.com/https://github.com/Obijuan/open-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wikihttp://www.excamera.com/sphinx/article-j1a-swapforth.htmlhttp://opencores.org/project,navrehttps://github.com/Obijuan/simplez-fpgahttps://www.youtube.com/watch?v=pTI-yHEmjac