core personalizado para manejo de servos
DESCRIPTION
En esta practica se guia a desarrollar un sistema embebido para el manejo de un servo motor (PWM) por medio de los pines de salida y entrada de la FPGA, y desde un core y un programa en C poder manejar las revoluciones.TRANSCRIPT
Juan Carlos Moctezuma Eugenio Ciencias Computacionales – INAOE
Design Labs based on:
Lab 6: Core personalizado para
manejo de servos (PWM)
Targeting: EDK-Microblaze 13.2 & Spartan-3A Board
Juan Carlos Moctezuma Eugenio
Lab 6: Core personalizado para Sistemas Empotrados en EDK 6-1 manejo de servos (PWM) IPN – 2012
Lab 6: Core personalizado para manejo de servo (PWM)
Introducción
Este laboratorio guia al asistente a través de las herramientas EDK, XPS y BSB para realizar un
sistema empotrado para FPGAs
Objetivos
Después de completer este laboratorio, el asistente sera capaz de:
• Realizar un diseño base con la herramienta BSB
• Configurar la parte hardware y software del sistema empotrado
• Agregar un nuevo core personalizado al sistema para generar una señal PWM
• Aprender a crear drivers para en la aplicación software
Descripción del diseño
Realizar un sistema base en BSB, después agregar un periférico personalizado que genera una señal
PWM parametrizable por el usuario, este módulo PWM será usado para el control de un servo-
motor. Por otro lado se creará una aplicación software en donde el usuario pueda manipular el ciclo
de trabajo de la señal PWM para hacer girar el servo; la señal PWM puede ser visualizada en un
osciloscopio. Los servos probados para este laboratorio son los Hi-Tec HS-311 y HS-422.
Figura A. Diagrama conceptual para el sistema base y modificaciones a realizar
BRAM
LMB
BRAM
Cnttlr
LMB
BRAM
Cnttlr
Microblaze
UART
GPIO Buttons
Stdin/Stdout
PWM Servo-motor
lab6code.c
manejo de
drivers
PWM
Juan Carlos Moctezuma Eugenio
Lab 6: Core personalizado para manejo de servos (PWM)
Procedimiento
En esta sección el alumno encontrará todos los pasos necesarios para realizar el laboratorio. El procedimiento
incluye los siguientes pasos principales
1. Crear un sistema base usando BSB
2. Agregar e importar un
3. Realizar la aplicación software
4. Implementar el sistema en una tarjeta FPGA
Cada paso principal del procedimiento es
instrucciones específicas para alcanzar el objetivo final
Cuando se pida alguna información al asistente o que re
ícono
Paso 1. Crear un diseño base usando BSB
Abrir la herramienta XPS (Xilinx Platform Studio) de EDK para realizar un sistema
base usando BSB.
� Abrir la herramienta XPS seleccionando
Suite 13.2 →→→→ EDK →→→→ Xilinx Platform Studio
� A continuación aparece una ventana indicando la forma de iniciar un nuevo proyecto. Seleccionar
Base System Builder wizard
���� New Project …
� En la siguiente ventana,
Lab6 y que se encuentre en el directorio de trabajo
La ruta seleccionada NO debe tener espacios. Activar la casilla
que se usará para estos laboratorios, Click <OK>
Figura 1-1. Crear un nuevo proyecto
?
Juan Carlos Moctezuma Eugenio
Sistemas Empotrados en EDK IPN – 2012
encontrará todos los pasos necesarios para realizar el laboratorio. El procedimiento
guientes pasos principales:
Crear un sistema base usando BSB
Agregar e importar un core personalizado
Realizar la aplicación software
Implementar el sistema en una tarjeta FPGA
Cada paso principal del procedimiento es indicado por el ícono . Cada paso a su vez tiene
instrucciones específicas para alcanzar el objetivo final.
Cuando se pida alguna información al asistente o que responda ciertas preguntas aparecerá el
Crear un diseño base usando BSB
Abrir la herramienta XPS (Xilinx Platform Studio) de EDK para realizar un sistema
Abrir la herramienta XPS seleccionando Menu Inicio →→→→ Programas →→→→ Xilinx ISE Design
Xilinx Platform Studio
A continuación aparece una ventana indicando la forma de iniciar un nuevo proyecto. Seleccionar
Base System Builder wizard. Click <OK>. En caso de que no aparezca esta ventana ir al menú
En la siguiente ventana, dar el nombre system.xmp al proyecto. Crear una nueva carpeta llamada
y que se encuentre en el directorio de trabajo Lab_user,tal y como se muestra en la
La ruta seleccionada NO debe tener espacios. Activar la casilla PLB System, el cual es el tipo de bus
que se usará para estos laboratorios, Click <OK>
Crear un nuevo proyecto
6-2
encontrará todos los pasos necesarios para realizar el laboratorio. El procedimiento
paso a su vez tiene
ciertas preguntas aparecerá el
Abrir la herramienta XPS (Xilinx Platform Studio) de EDK para realizar un sistema
Xilinx ISE Design
A continuación aparece una ventana indicando la forma de iniciar un nuevo proyecto. Seleccionar
. Click <OK>. En caso de que no aparezca esta ventana ir al menú File
al proyecto. Crear una nueva carpeta llamada
,tal y como se muestra en la figura 1-1.
el cual es el tipo de bus
Juan Carlos Moctezuma Eugenio
Lab 6: Core personalizado para Sistemas Empotrados en EDK 6-3 manejo de servos (PWM) IPN – 2012
� Posteriormente seleccionar I would create a new design, click <NEXT>. Después seleccionar la
tarjeta Spartan 3A Starter Kit como se muestra en la figura 1-2, click <NEXT>
Figura 1-2. Seleccionar el tipo de tarjeta FPGA que será usada
� En estos momentos comienza la configuración de la plataforma hardware del sistema. Seguir el
siguiente procedimiento:
• Seleccionar Single Processor System, click <NEXT>
• Reference clock frequency: 50 MHz
• Processor : Microblaze
• System clock frequency: 50 MHz
• Local Memory: 16 KB
• Debug Interface: On Chip HW Debug Module, click <NEXT>
El siguiente paso es seleccionar los components hardware del sistema (cores/periféricos), seleccionar
los periféricos de tal forma que en la columna Processor 1 (Microblaze) Peripherals queden
únicamente los siguientes elementos: (Apoyarse de los botones ADD y REMOVE)
• BTNs_4bit: Seleccionar (dejar valores por default)
• RS232_DCE: Seleccionar (dejar valores por default)
• dlmb_ctrl: Seleccionar (dejar valores por default)
• ilmb_ctrl: Seleccionar (dejar valores por default), click <NEXT>
� Finalmente se abre la ventana donde se configura la memoria cache. En este caso NO se utiliza
memoria cache, así que permanecen deseleccionadas las dos opciones. Click <NEXT>, click
<FINISH>
El sistema base ha sido construido usando el BSB, al final en el XPS se deberá visualizar un sistema
como el de la figura 1-3.
Figura 1-3. Sistema empotrado FPGA creado con BSB
Juan Carlos Moctezuma Eugenio
Lab 6: Core personalizado para Sistemas Empotrados en EDK 6-4 manejo de servos (PWM) IPN – 2012
Paso 2. Agregar e importar un core personalizado al sistema
El paso siguiente es crear e importar un core personalizado (hecho por el usuario) al
sistema. Xilinx ofrece herramientas software para que el usuario pueda crear sus
propios periféricos de una forma sencilla.
� El primer paso es la creación del nuevo periférico personalizado. Seleccionar Menú Hardware
���� Create Import Peripheral…, Con esta opción se abre el wizard para crear/importar un
periférico hecho por el usuario; al final se tiene un core “template” que el usuario podrá
modificar para que realice la tarea deseada.
Figura 2-1. Abrir el Wizard para Crear/Importar un periférico
� Seguir el siguiente procedimiento para el Wizard de Create/Import Peripheral…
• Click <NEXT> en la ventana de bienvenida
• Seleccionar Create Template for new peripheral, click <NEXT>
• Seleccionar To an XPS Project, click <NEXT>
• Name: my_pwm, Version: 1.00.a, click <NEXT>
• Bus Type: Processor Local Bus (PLB), click <NEXT>
• Seleccionar SOLAMENTE los servicios: User Logic Software Registers y Sofware Reset, los
demás servicios deben estar deseleccionados; click <NEXT>
• Ventana Slave Interface, click <NEXT>
• Number of software registers: 2 ; click <NEXT>
• Ventana IP Interconnect, click <NEXT>
• Ventana Peripheral Simulation Support, click <NEXT>
• Seleccionar únicamente Generate template driver files…, click <NEXT>
• Click <FINISH>
1. Notar el contenido de las carpetas pcores y drivers dentro del directorio del proyecto ¿Qué
información contienen estas dos carpetas?
2. ¿Cuáles son los archivos VHDL “templates” creados para el nuevo periférico?, ¿Cuáles son
los drivers o funciones software que manejan el nuevo periférico?
?
Juan Carlos Moctezuma Eugenio
Lab 6: Core personalizado para Sistemas Empotrados en EDK 6-5 manejo de servos (PWM) IPN – 2012
� Copiar el archivo IPNEDK/Codigos/Lab6/div_pwm.vhd a la carpeta
pcores\my_pwm_v1_00_a\hdl\vhdl.
� El siguiente paso es realizar las modificaciones al archivo user_logic.vhd y my_pwm.vhd, esto
con la finalidad de agregar las funcionalidades que requiere el core. Abrir el archivo user_logic.vhd
localizado en la carpeta pcores\my_pwm_v1_00_a\hdl\vhdl y realizar las siguientes modificaciones:
• Localizar la declaración de puertos genéricos (línea 90 aprox.) y declarar dos puertos genéricos
DIV_FREQ y STEP_PWM, estos pueros genéricos podrán modificarse desde el cuadro de
configuración del core my_pwm. Note que en el archivo VHDL se indica donde el usuario puede
añadir líneas de código (por ejemplo “USER ports added here”)
• Localizar la declaración de puertos (línea 105 aprox.) y declarar dos puertos, uno de entrada clk y
otro de salida clk_out. El puerto de entrada irá conectado al reloj de 50 MHz mientras que el
reloj de salida representa la señal PWM.
• Localizar el comienzo de la arquitectura (línea 138 aprox.) y declarar las señales internas
rst_aux1y cycle_aux, las cuales representan el reset del módulo PWM y el ciclo de trabajo,
ambos serán dados por el usuario a través de la aplicación software. Note que el ciclo de trabajo
es de 8 bits, por lo que solo podrá tomar valores entre [0 255]
• Ir al final de la arquitectura (línea 230 aprox.) y capturar el código VHDL que instancia el
archivo div_pwm.vhd. Note que el reset del módulo así como el ciclo de trabajo son mapeados
hacia registros a nivel software, en específico el reset es mapeado al registro slv_reg0 y el ciclo
de trabajo al slv_reg1.
Juan Carlos Moctezuma Eugenio
Lab 6: Core personalizado para Sistemas Empotrados en EDK 6-6 manejo de servos (PWM) IPN – 2012
• Abrir el archivo my_pwm.vhd . Localizar la parte de declaración de puertos genéricos (línea 143
aprox.) y declarar los puertos genéricos DIV_FREQ y STEP_PWM; de igual manera localizar
la parte de puertos E/S (línea 168 prox.) y declarar los puertos clk y clk_out, estos puertos serán
mapeados a la entidad user_logic.
• Localizar la parte donde se mapea el componente user_logic (línea 425 aprox.) y mapear tanto los
puertos genéricos como los puertos E/S hacia la instancia user_logic. GUARDAR los cambios
realizados. Con esto finaliza la modificación de los templates VHDL creados. Ahora el nuevo
core está personalizado por el usuario.
Juan Carlos Moctezuma Eugenio
Lab 6: Core personalizado para Sistemas Empotrados en EDK 6-7 manejo de servos (PWM) IPN – 2012
3. Realice un diagrama esquemático en donde se muestre la funcionalidad del nuevo periférico,
así como la interacción de los registros a nivel software
Figura 2-2. Diagrama esquemático para el core personalizado
� Una vez que las modificaciones a los archivos VHDL fueron realizadas, el siguiente paso es
importar el periférico. Seleccionar nuevamente la opción Menú Hardware ���� Create Import
Peripheral…
� Seguir el siguiente procedimiento para el Wizard de Create/Import Peripheral…
?
Juan Carlos Moctezuma Eugenio
Lab 6: Core personalizado para Sistemas Empotrados en EDK 6-8 manejo de servos (PWM) IPN – 2012
• Click <NEXT> en la ventana de bienvenida
• Seleccionar Import existing peripheral, click <NEXT>
• Seleccionar To an XPS Project, click <NEXT>
• Name: my_pwm, Seleccionar Use Version: 1.00.a, click <NEXT>. Indica que ya hay
un core con ese nombre y que si deseamos sobreescribirlo, click <YES>.
• Seleccionar SOLAMENTE: HDL Source files, click <NEXT>
• Seleccionar Use existing Peripheral Analysis Order (*.pao), click <BROWSE>; seleccionar el
archivo my_pwm_v1_00_a ���� data ���� my_pwm_v2_1_0.pao, click <OK>, click <NEXT>
• En la ventana de HDL Analysis Information; dar click <ADD FILES…> y seleccionar el
archivo pcore ���� my_pwm_v1_00_a ���� hdl ���� vhdl ���� div_pwm.vhd.
Mover el archivo div_pwm.vhd arriba del archivo user_logic.vhd para respetar el orden de
jerarquía para sintetizar de manera correcta el nuevo core (figura 2-3); click <NEXT>.
Si existe algún error de sintaxis en los archive VHDL muestra una ventana de error, de lo
contrario pasa a la siguiente ventana del wizard. Si existe algún error, corregirlo y volver a
importar el periférico.
Figura 2-3. Ordenar jerárquicamente los archivos VHDL a sintetizar.
• Seleccionar Select Bus Interfaces, seleccionar PLB Slave (SPLB); lick <NEXT>
• Ventana SPLB: port, click <NEXT>
• Ventana SPLB: parameter, Seleccionar C_BASEADDR y C_HIGHADDR respectivamente,,
click <NEXT>
• Deseleccionar Select and configure interrupts; click <NEXT>
• Ventana Parameter attributes, click <NEXT>
• Ventana Port attributes, click <NEXT>
• Click <FINISH>
4. Abrir el archivo my_pwm_v2_1_0.pao e indicar que representa este archivo
� Ir al Menú Project ���� Rescan user repositories. Ir a la pestaña IP Catalog, desglozar la
categoría USER y añadir el nuevo periférico dando doble click sobre el core my_pwm. Conectar el
core al bus PLB tal y como lo muestra la figura 2-4.
Posteriormente dar doble click sobre el core my_pwm_0 y configurar sus puertos genéricos. Con esta
configuración se tiene una frecuencia de salida de 400 Hz (2.5 ms de periodo) y el rango de operación
para el ciclo de trabajo será [0 20] (este resultado es la división de 125,000/6,250 ). Click <OK>.
DIV_FREQ = 125,000
STEP_PWM = 6,250
?
Juan Carlos Moctezuma Eugenio
Lab 6: Core personalizado para Sistemas Empotrados en EDK 6-9 manejo de servos (PWM) IPN – 2012
Asegurarse que el parámetro C_SPLB_CLK_PERIOD_PS = 20,000 ya que la frecuencia del sistema
es de 50 MHz.
Figura 2-4. Agregando el core hecho por el usuario.
� Cambiarse a la pestaña Ports, desglozar el core my_pwm_0 y seleccionar en el campo clk_out����
Make external. Además conectar el puerto clk ���� clk_50_0000MHz. Con estas modificaciones se
esta creando un puerto externo para tener como salida la señal PWM que irá a un servo-motor. Note
que en la opción External Ports se han agregado estos puertos externos (figura 2-5).
Figura 2-5. Agregando puertos externos para los nuevos cores
Ir a la pestaña Addresss y dar click en el botón Generate Addresses para generar
automáticamente el espacio de memoria para los nuevos periféricos. Por default asigna 64K a cada
periférico
El paso siguiente es realizar la asignación de pines a los nuevos periféricos en el archivo UCF. En
la pestaña Project dar doble click al archivo system.ucf. Capturar las restricciones para el nuevo core
(figura 2-6). Corroborar esta asignación de pines en el archivo IPNEDK/Datasheet/Spartan3A.pdf
Net my_pwm_0_clk_out_pin LOC=W17 | IOSTANDARD = LVCMOS33;
Figura 2-6. Asignación de pines para los nuevos cores
� Hasta este momento finaliza la configuración del hardware del sistema. El paso final es generar el
archivo bitstream. Seleccionar la opción Menú Hardware ���� Generate Bitstream (este proceso
tarda 15 min aproximadamente)
Juan Carlos Moctezuma Eugenio
Lab 6: Core personalizado para Sistemas Empotrados en EDK 6-10 manejo de servos (PWM) IPN – 2012
Paso 3. Realizar la aplicación software
El siguiente paso es desarrollar la parte software del sistema. En esta parte se utiliza
la herramienta SDK (Software Development Kit) y básicamente se realizan 3
proyectos: la plataforma de información hardware, el BSP (board support package) y
la aplicación de usuario.
� Exportar la información de la plataforma hardware hacia SDK. Click en el botón <EXPORT
HARDWARE DESIGN TO EDK>. Después se visualiza una ventana donde se selecciona “Export &
Launch SDK” (figura 3-1)
Figura 3-1. Exportar la información hardware hacia SDK.
� En el cuadro de diálogo que se muestra a continuación seleccionar la ruta Lab_user\Lab6\SDK
como el directorio workspace (figura 3-2), click <OK>
Figura 3-2. Seleccionar el directorio Workspace
� Una vez que el entorno SDK es abierto, se crea automáticamente un proyecto llamado
hw_platform_0 (parte izquierda en Project Explorer), este proyecto contiene la información hardware
necesaria y se conforma por 3 tipos de archivos: BMM, BIT y XML.
Opcionalmente este proyecto hardware puede ser creado de forma manual desde el menú File ���� New
���� Xilinx Hardware Platform Specification
� Antes de crear el Board Support Package, es necesario incorporar los drivers del core ALU al
proyecto. Ir a Menú Xilinx Tools ���� Repositories. En el campo “Local Repositories”, click <NEW>,
buscar el directorio del proyecto IPNEDK/Lab_user/Lab6, click <APPLY>, click <OK>.
� El siguiente paso es crear un proyecto para crear el BSP. Ir al menú File ���� New ���� Xilinx
Board Support Package, después aparece la ventana en donde se selecciona el tipo de BSP (o
Juan Carlos Moctezuma Eugenio
Lab 6: Core personalizado para Sistemas Empotrados en EDK 6-11 manejo de servos (PWM) IPN – 2012
sistema operativo) a usar, en este caso será un STANDALONE. Se dejan todas las opciones por
defecto y dar click <FINISH> (figura 3-3)
Después se abre la ventana de configuración del BSP en donde se pueden seleccionar algunas librerías
y drivers para cada uno de los periféricos en el sistema. Explorar los diferentes campos y dejar todas
las opciones por defecto, click <OK>. Nuevamente en el Project Explorer se puede visualizar el
nuevo proyecto realizado llamado standalone_bsp_0
Figura 3-3. Configuración del BSP.
� El siguiente paso consiste en crear un proyecto para la aplicación de usuario. Ir al Menú ���� New
���� Xilinx C Project, dar como nombre de proyecto TestApp1 y seleccionar como template Empty
Application. (figura 3-4). Click <NEXT>
En la siguiente ventana seleccionar Target an existing Board Support Package � standalone_bsp_0,
click <FINISH>. (figura 3-4)
Figura 3-4. Creando el proyecto para la aplicación de usuario en C.
En la ventana Project Explorer, Click DERECHO sobre la carpeta TestApp1 ���� src y seleccionar
Import…
Ir a General ���� File system, click <NEXT>
Click <BROWSE>, Seleccionar la carpeta IPNEDK/Codigos/Lab6, click <OK>
Juan Carlos Moctezuma Eugenio
Lab 6: Core personalizado para manejo de servos (PWM)
Seleccionar las casillas lab6
5. Definir qué es lo que realiza la función
6. ¿Que es lo que hace el siguiente código?, ¿Por
MY_PWM_mWriteReg(PWM_ADD,REG0,1);
MY_PWM_mWriteReg(PWM_ADD,REG0,0);
7. ¿Por qué el ciclo de trabajo de la aplicación software es solo de 0 a 20?, ¿Qué parámetros
definen este rango?
8. ¿Qué pasa si se da un número mayor al máximo permitido (20) en el ciclo de trabajo?
9. A continuación se muestra una figura que indica
para que el servo-
cuanto tiene que dar el usuario en el
0, 45, 90, -45 y -90
Utilice la fórmula T1 = STEP_PWM * cycle * 20 ns
?
Juan Carlos Moctezuma Eugenio
Sistemas Empotrados en EDK IPN – 2012
lab6code.c, click <FINISH>
es lo que realiza la función lee_num
¿Que es lo que hace el siguiente código?, ¿Por qué se escribe al registro 0?
MY_PWM_mWriteReg(PWM_ADD,REG0,1);
MY_PWM_mWriteReg(PWM_ADD,REG0,0);
¿Por qué el ciclo de trabajo de la aplicación software es solo de 0 a 20?, ¿Qué parámetros
definen este rango?
¿Qué pasa si se da un número mayor al máximo permitido (20) en el ciclo de trabajo?
A continuación se muestra una figura que indica el tiempo que debe durar en 1 la señal PWM
-motor gire a determinada posición. De acuerdo a esta información indique
cuanto tiene que dar el usuario en el ciclo de trabajo para que el motor este en las posiciones
90 grados. Recuerde que el rango del ciclo de trabajo es [0 20]
T1 = STEP_PWM * cycle * 20 ns
6-12
¿Por qué el ciclo de trabajo de la aplicación software es solo de 0 a 20?, ¿Qué parámetros
¿Qué pasa si se da un número mayor al máximo permitido (20) en el ciclo de trabajo?
el tiempo que debe durar en 1 la señal PWM
motor gire a determinada posición. De acuerdo a esta información indique
para que el motor este en las posiciones
[0 20]
Juan Carlos Moctezuma Eugenio
Lab 6: Core personalizado para Sistemas Empotrados en EDK 6-13 manejo de servos (PWM) IPN – 2012
Paso 4. Implementar el sistema en una tarjeta FPGA
El paso final consiste en juntar las partes hardware y software del sistema en un solo
archivo de configuración BIT para poder programar el FPGA. La herramienta que
logra realizar la fusión es llamada BitInit
� El primer paso es conectar y prender la tarjeta FPGA Spartan 3A para validar el sistema. Tener
conectado también un cable serial-USB a la computadora y al conector serial de la tarjeta FPGA.
Conectar el servo-motor HS422 al pin de la tarjeta FPGA que indica el archivo UCF. Tener cuidado
con la polarización del voltaje e identificar el pin de la señal PWM en el servo. Consultar el datasheet
del motor (IPNEDK/Datasheet/Motor_HS422.pdf) para verificar las condiciones de consumo de
corriente y alimentación de voltaje.
� En la pestaña Terminal 1, dar click en <SETTINGS> y configurar la terminal para que se
comporte como un puerto serial de 9600 Baud Rates, (figura 4-1). IMPORTANTE: Note que el
número de puerto debe coincidir con el puerto al que está conectado el convertidor USB-SERIAL.
Finalmente dar click en el botón <CONNECT>
Figura 4-1. Configurando el puerto serial que se comunica con la tarjeta FPGA
� En el siguiente paso se programa la tarjeta FPGA, click en el botón <PROGRAM FPGA>.
Juan Carlos Moctezuma Eugenio
Lab 6: Core personalizado para Sistemas Empotrados en EDK 6-14 manejo de servos (PWM) IPN – 2012
En la ventana que aparece a continuación se pude seleccionar con que aplicación inicial será
programado el FPGA, seleccionar TestApp1.elf (figura 4-3), click <PROGRAM>
Figura 4-3. Programar el FPGA con una aplicación inicial (bootloop o ELF)
� Después que el FPGA es programado el resultado de la aplicación se observa en la figura 4-4. El
servo-motor debe ir girando conforme a los valores del ciclo de trabajo.
Figura 4-4. Salida del Test en el Terminal