Written by Jesus

Basado en la practica de PicoCtrl del Prof. Yair Linn.
  1. OBJETIVOS
     
    • Aprender como funciona y como programar el microcontrolador PicoCtrl, adquiriendo conocimiento de como funciona un microcontrolador.

  2. INTRODUCCION

    Un microcontrolador es un circuito integrado de alta escala de integración que incorpora la mayor parte de los elementos que configuran un controlador. Un microcontrolador dispone normalmente de los siguientes componentes:
    1. Procesador o UCP (Unidad Central de Proceso).
    2. Memoria RAM para Contener los datos.
    3. Memoria para el programa tipo ROM/PROM/EPROM.
    4. Líneas de E/S para comunicarse con el exterior.
    5. Diversos módulos para el control de periféricos (temporizadores, Puertas Serie y Paralelo, CAD: Conversores Analógico/Digital, CDA: Conversores Digital/Analógico, etc.).
    6. Generador de impulsos de reloj que sincronizan el funcionamiento de todo el sistema.

  3. HISTORIA

    El primer microprocesador fue el Intel 4004 de 4 bits, lanzado en 1971, seguido por el Intel 8008 y otros más capaces. Sin embargo, ambos procesadores requieren circuitos adicionales para implementar un sistema de trabajo, elevando el costo del sistema total.El Instituto Smithsoniano dice que los ingenieros de Texas Instruments Gary Boone y Michael Cochran lograron crear el primer microcontrolador, TMS 1000, en 1971; fue comercializado en 1974. Combina memoria ROM, memoria RAM, microprocesador y reloj en un chip y estaba destinada a los sistemas embebidos.Debido en parte a la existencia del TMS 1000, Intel desarrolló un sistema de ordenador en un chip optimizado para aplicaciones de control, el Intel 8048, que comenzó a comercializarse en 1977. Combina memoria RAM y ROM en el mismo chip y puede encontrarse en más de mil millones de teclados de compatible IBM PC, y otras numerosas aplicaciones. El en ese momento presidente de Intel, Luke J. Valenter, declaró que el microcontrolador es uno de los productos más exitosos en la historia.

     
    1. EL microcontrolador tendrá 6 señales de condición de entrada que controlan la ejecución de microinstrucción, las señales son asíncronas y estarán sincronizados dentro del controlador
    2. El microcontrolador tendrá 32 instrucciones que se pueden ejecutar, si el microprograma se pasa de los 32 este se pondrá en 0
    3. El microcontrolador tendrá 4 puertos de salida de 8 bits controlados por la instrucción de escritura. Cada uno de los puertos tiene su propio registro de salida ( es decir, el valor de salida es estable hasta que se cambie por microprograma ejecutado)
    4. Cada instrucción se ejecuta en dos ciclos de reloj - el primer ciclo es una zona de alcance de un ( FETCH fase) , la segunda ejecución de un ( fase de ejecución)
    5. El microcontrolador ejecutará instrucción de salto ( salto a la dirección almacenada en la instrucción )
      Instrucion NOP ( operación ignorado )
    6. La instrucción WRITE ( escribir al puerto de salida ) .

  4. Procedimiento

    Para empezar vaya a la ubicación donde tenga la carpeta SystemBuilder, esto con el fin de crear un Proyecto a través de dicha aplicación. 


    Al ejecutarlo  se obtiene la interfaz (figura) que genera el proyecto, debe tener en cuenta las partes de la DE0-Nano-SoC que utilizara ya que debe seleccionarlas para que  aparezcan en dicho proyecto, en este caso puede seleccionar todas, no importa, lo importante es no dejar por fuera las que  se necesitan. En Project Name ponemos el nombre de nuestro proyecto, a este proyecto se le llamo DE0_Nano_SoC_picoCtrl



    Luego, damos click en Generate, se nos despliega una ventana de (guardar como), elegimos el destino de nuestro proyecto, preferiblemente una carpeta donde se tengan todos los proyectos de clase.


    Nos dirigimos a la ubicación donde guardamos nuestro proyecto(en este caso, SystemBuilder tiene una carpeta donde guarda los proyectos por default, llamada CodeGenerated) si usted guardo su proyecto en otra ubicación no tiene problema alguno; siga a ejecutar el  archivo de tipo QPF llamado de la misma forma como llamo su proyecto.



    Ahora diríjase a su carpeta de GitHub\ece10243upb2016\Prof_Examples\3-1_PicoCtrl  donde encontrara los archivos de PicoCtrl_rom32_instructions,  picoctrl_Verilog,  opcodes, Pico, README, PicoCtrl-AnFPGAMicrocontrollerDesign (1).



    Si usted no tiene esto haga lo siguiente:
    1. Dirijace al siguiente link https://github.com/Adrizcorp/ece10243upb2016
    2. Abra la carpeta Prof_Examples
    3. Abra la carpeta 3-1_PIcoCtrl donde encontrara los archivos mencionados.

Copie cada uno de los archivos tipo “Archivo v” y péguelos en una nueva carpeta a la cual llamara “Modules” esto con el fin de llevar un orden. La carpeta será creada en la carpeta donde tenemos nuestro proyecto de PicoCtrl





Se preguntara por que el archivo “opcodes” no se encuentra en dicha carpeta, Estos se debe a que “opcodes” contiene una sintaxis que será leida por Quartus para que esto suceda sin generar error alguno, “opcodes” fue copiado en la carpeta principal



También necesitamos los archivos de syncro.v y div_freq.v Estos archivos son de proyectos pasados, en caso tal de no tenerlos diríjase al siguiente link y descárguelos

Divisor de frecuencia (div_freq.v)

Sincronizador (syncro.v)

Estos archivos también deben ir en la carpeta de “modules”


Diríjase a QUARTUS donde tiene abierto su proyecto DE0_Nano_SoC_picoCtrl

En la parte izquierda encontrara “Files” selecciones, aparecerán los “Files” que tenemos, lo que tenemos que hacer es agregar nuevos “Files”, se acuerdan los .que agregamos a la carpeta de Modules? Cada uno de ellos los agregaremos de la siguiente forma.

click derecho en “Files” en al parte superior izquierda y le daremos add/remove files in project

Se desplegara la siguiente ventana



En los tres puntos de la imagen dele click y seleccione todos los  .v que están en la carpeta “modules” incluyendo los “opcodes” que copiamos en la carpeta principal, debe quedar algo asi




click en apply y luego en ok.

Ahora en general debe tener algo así.




Lo siguiente  es crear las instanciaciones de cada uno de los .v, solo es dar click derecho en el archivo y seleccionar “créate verilog Instantiation template files for current file




Así de la misma forma con cada uno de los punto .v

Las instanciaciones se guardaran en la carpeta del proyecto, en la principal  de esta forma.




Abra cada una de las instanciaciones y copie el código, por ejemplo, abriremos  syncro_inst 


Este es el código a copiar, copiara cada uno de los códigos de las instanciaciones en el modulo principal de su proyecto en QUARTUS




El código con instanciaciones debe verse asi





El siguiente paso es borrar cada una de las entradas o salidas por defautl que aparecen en el código de cada instanciación




Luego  identificar las entradas y las salidas,  hay que  saber que entra y que sale para poder hacer las respectivas conexiones.


se tiene una entrada de 5 bits y una salida de 16 bits en la instanciación del PicoCtrl_rom32_instructions por lo tanto para ello se cre buses de datos (wire’s) para conectar dichas entradas y salidas.

Los wire deben tener la misma cantidad de bits.



se pasa a ver la instanciación del Picoctrl ; tenemos una entrada de reloj el cual se utilizara la que nos proporciona la FPGA FPGA_CLK1_50 , tenemos una entrada  reset la cual se colocara en 1 lógico 1’b1 (encendido) , una entrada  cond_1  la cual será un reloj de 1hz tenemos una segunda condición  cond_2  *(~clk_1hz_sync), las condiciones del 3-6 no importa por lo tanto están en 1'b00 (apagadas) , se utilizara el registro 1, esa será nuestra salida a los led’s por ende seran conectados a los LED[7:0] quiere decir que utilizaremos los 8 leds que nos proporciona la FPGA.

Esta parte es importante, fíjese que a la salida de instruction_ROM_Addr se le asigna la entrada  addr (encerrada en rojo) y la entrada de instruction_ROM_data se le asigna la salida del data (encerrada en azul).

*la condición 2 es un reloj de 1hz pero tiene  el signo de negación (~) esto hace que pase ser de 1hz a 0,5 hz, es la forma de hacer un divisor de frecuencia. Ejemplo : si tiene un reloj de 50hz como el que da la FPGA, solo con anteponer (~)  se tendría uno de 25hz.



se pasa a la instanciación de div_freq

se tiene  una entrada de reloj a la cual conectamos FPGA_CLK1_50  que ya sabemos es el reloj de 50 hz que nos proporciona la FPGA, tenemos una entrada de 32 bits a la cual asignamos 32’b24999999 este numero es sacado de la formula y por ultimo tenemos una salida div que seria nuesto reloj de 1hz.




Por ultimo se pasa a la instanciación syncro donde tenemos una entrada async que será nuestro reloj de 1hz, una entrada clock que será nuestro reloj de 50hz y una salida sync que será nuestro otro reloj de 1hz.


Con esto se terminan cada una de las instanciaciones ahora dirígea dar click en  assembler Para iniciar la compilación del programa.



Luego de compilado nuestro proyecto nos dirigimos a programmer  esto desplegara la siguiente ventana




En add device seleccionaremos  Soc Serie V y SOCVHPS y dara click en OK



luego vamos a add files y selecciona el .sof  debe salir algo así




procedemos hacer click en el botón de START

observe  lo que hacen los LEDs, Deben hacer el siguiente recorrido con 0.5 segundos entre cada posición:

0111_0001
1011_0010
1101_0100
1110_1000
1101_0100
1011_0010

Donde   "1" significa encendido y "0" significa apagado.

(ARCHIVO GIF)



Ahora bien, lo que hara será hacer la siguiente secuencia, donde ¨X¨ será encendido y ¨0¨ Apagado

0000 000X
0000 00X0
0000 0X00
0000 X000
000X 0000
00X0 0000
0X00 0000
X000 0000
0X00 0000
00X0 0000
000X 0000
0000 X000
0000 0X00
0000 00X0
0000 000X


Bueno, lo que se debe hacer es cambiar la configuracion de la ROM, abra el  .v de PicoCtrl_rom32_instructions  y cambie las condiciones del registro por la secuencia que se dio



Que es lo que quiere decir esto, se esta asignando ala room el data siguiente, si  c0 es igual a 0 escriba (write) en el regitro 1 8'b0000_0001, eso  en cada (write) de la misma forma, por ejemplo en la tercera  línea, si c0 es igual a 0 escriba en el registro 1 8'b0000_0010.


Ahora cada jump (salto), por ejemplo en la cuarta línea si c1 es igual a 0 haga un salto a 8´h3, pero dese cuenta que 8´h3 esta en la misma posición, así que se queda en el mismo lugar , así mismo cada jum.

Después de tener algo similar a la imagen, debemos compilar de nuevo nuestro programa, añadir de nuevo nuestro archivo .v y nuestro archivo .sof



Damos 
Start (archivo GIF)


 

Felicidades!, has usado picoctrl en la DE0-NANO-SOC