Entorno de desarrollo Xfuzzy 3

Herramienta de generación de código VHDL - Xfvhdl

La herramienta xfvhdl utiliza el lenguaje de descripción de hardware de alto nivel VHDL para facilitar la implementación hardware, mediante FPGAs o ASICs, de los sistemas de inferencia descritos en el entorno Xfuzzy. Una característica importante de esta herramienta es que permite la síntesis directa de sistemas difusos complejos, formados por la combinación de distintos módulos de inferencia y bloques crisp. Sin embargo, no todas las especificaciones XFL3 son susceptibles de ser implementadas en hardware mediante xfvhdl. En concreto, los sistemas difusos que pueden ser implementados por esta herramienta deben usar funciones de pertenencia con grado de solapamiento máximo 2 y emplear métodos de defuzzificación simplificados.

La interfaz gráfica de xfvhdl puede ser ejecutada desde la ventana principal del entorno, utilizando la opción "To VHDL" del menú Synthesis, o desde la línea de comandos, mediante la expresión "xfvhdl -g file.xfl [file.xml]".

La ventana principal de xfvhdl está dividida en cuatro partes. La zona superior recoge información sobre los ficheros y directorios involucrados en el diseño. El campo Input XFL file contiene la ruta absoluta del fichero de especificación XFL3 de entrada seleccionado al lanzar la herramienta. Este campo es sólo informativo, es decir, no es modificable por el usuario. El campo Name for output files permite configurar el prefijo de los ficheros de salida de xfvhdl. Por defecto aparece el nombre del sistema difuso de entrada, aunque puede ser modificado por el usuario. Finalmente, el campo Output directory indica la ruta absoluta del directorio donde se ubicarán los ficheros de salida que genera la herramienta. Su valor por defecto es el directorio que contiene la especificación del sistema.

La zona inferior de la ventana contiene tres secciones que permiten definir diferentes opciones de síntesis e implementación. En la sección Global Options el usuario puede indicar que se generen ficheros complementarios marcando la opción Generate Complementary Files. También puede indicar que se usen componentes simplificados a través de la opción Use Simplified Components. En el caso de que se elija esta opción, en la descripción VHDL se incluirá la versión simplificada (sin bloque de división) para los defuzzificadores Fuzzy Mean y Takagi-Sugeno, siempre que la especificación del sistema lo permita (sistemas con funciones de pertenencia normalizadas que empleen el operador producto como conectivo de antecedentes; la herramienta obviará el uso de componentes simplificados en los casos en que no se verifiquen estas condiciones aunque la opción aparezca seleccionada). Por último, cuando se marca la opción Files for Hardware Cosimulation, la herramienta genera descripciones VHDL de salida adaptadas para ser incorporadas en modelos Simulink mediante el empleo de "Black Boxes". La sección FPGA Implementation recoge información relativa a opciones de implementación para FPGAs. Entre ellas se encuentra el tipo de memoria RAM y ROM a usar (inicialmente aparece la opción Automatic en ambas, aunque en un menú desplegable también se pueden seleccionar las opciones None, Block o Distributed), así como la familia de FPGAs y el dispositivo sobre el que se quiere implementar el sistema de inferencia (por defecto aparece Zynq xc7z020-clg484-1). Finalmente, la sección CAD Tool Options hace referencia a una serie de opciones relacionadas con las herramientas de CAD. Entre ellas se encuentran: la herramienta de síntesis a utilizar (la opción por defecto es Xilinx Vivado, aunque también se puede seleccionar Xilinx XST); el tipo de optimización (la opción preseleccionada es Without optimization, pero en el menú se pueden marcar las opciones Area optimization, Speed optimization y Area and Speed optimizations); y el esfuerzo con el que se lleva a cabo la síntesis (a priori está seleccionada la opción Low, aunque también puede marcarse la opción High en el menú desplegable).

La zona central de la ventana está a su vez dividida en dos partes. Inicialmente, en la derecha aparece la representación gráfica de la especificación XFL3, mientras que en la izquierda se muestran los distintos componentes de la base de conocimiento estructurados en forma de árbol y agrupados bajo las categorías RuleBases y CrispBlocks. Cuando se selecciona una base de reglas concreta, el contenido de la zona central derecha es sustituido por una nueva interfaz que permite al usuario definir los parámetros relacionados con la dimensión del sistema. Concretamente se puede introducir el número de bits con el que se codifican las entradas, la salida, los grados de pertenencia de los antecedentes, las pendientes de las funciones de pertenencia y el parámetro de peso del método de defuzzificación (en los casos en que este exista). También en esta zona el usuario puede seleccionar la estrategia de implementación de los antecedentes (en memoria o mediante cálculo aritmético) y el tipo de memoria utilizada (ROM, RAM o bloque lógico). La herramienta permite la generación de funciones de pertenencia normalizadas de tipo triangular, sh_triangular, y trapezoid mediante técnicas aritméticas. En el caso de que las funciones de pertenencia de las entradas no estén normalizadas, se inhabilita la opción de cálculo aritmético en los antecedentes. Para la memoria de reglas también puede elegirse si se quiere implementar con memoria ROM, RAM o mediante un bloque lógico. En la parte inferior de esta zona se muestra información extraída de la especificación XFL3 relativa a las funciones de pertenencia y las bases de reglas. Concretamente esta zona incluye los valores del número de funciones de pertenencia, puntos de corte y pendientes por cada entrada, así como la representación matricial de la base de reglas correspondiente. Los valores mostrados sólo tienen carácter informativo, por lo que no pueden ser modificados.

Al seleccionar un bloque crisp dentro de la estructura de árbol, en la zona central derecha aparece un solo campo relativo al número de bits con el que se codifica la salida del bloque.

Cuando todas las opciones arquitecturales y los parámetros relacionados con el tamaño de los buses correspondientes a una base de reglas han sido definidos, debe asignarse esta configuración mediante el botón Apply (localizado en la parte inferior de la ventana). Tras ello, el icono rojo que aparecía junto a la base de conocimiento en la primera figura se sustituye por el icono verde que se observa en la segunda. Una vez que la información correspondiente a todas las bases de reglas y bloques crisp del sistema ha sido definida, el componente asociado al sistema difuso también es identificado con una marca verde y se activan los botones Save Configuration, Generate VHDL code y Generate and Implement.

El botón Save Configuration permite guardar la configuración del sistema mediante un fichero XML que almacena información relativa a las opciones de implementación de los distintos componentes (ver sección Fichero de configuración). Las configuraciones guardadas mediante esta opción pueden ser cargadas posteriormente utilizando el botón Load Configuration o utilizadas para ejecutar la herramienta en modo no interactivo (ver sección Ejecución en modo de comando).

Ficheros de salida

El botón Generate VHDL code genera la descripción VHDL del sistema difuso junto con un fichero de testbench, descrito también en VHDL, que permite verificar su funcionalidad. La descripción VHDL del sistema se genera en un único fichero compuesto por la interconexión de bloques de la librería de celdas XfuzzyLib. La cabecera de este fichero incluye también un paquete de constantes calculadas de forma automática a partir de la información extraída de la base de conocimiento del sistema de inferencia y de los parámetros y opciones de diseño introducidos por el diseñador. Si el sistema es jerárquico se genera una descripción VHDL por cada base de reglas, así como un testbench que permite obtener la superficie de control correspondiente a cada una de ellas. En este caso se generan también el fichero VHDL correspondiente al nivel superior de la jerarquía (top-level), que describe la interconexión de las distintas bases de reglas y bloques crisps que forman el sistema, y un testbench que permite simular el sistema completo.

Además de los ficheros anteriores, si la herramienta de síntesis seleccionada es Xilinx Vivado, se generan dos ficheros de comandos con extensión ".tcl". El fichero "<spec>.tcl" facilita la creación de un proyecto Vivado para llevar a cabo las tareas de verificación e implementación del sistema. "<spec>Script.tcl" permite automatizar los procesos de síntesis e implementación del sistema difuso utilizando las herramientas de Xilinx en modo no-proyecto.

Cuando la herramienta seleccionada es Xilinx XST, se generan dos ficheros adicionales con extensiones ".prj" y ".xst". El fichero "<spec>.prj" contiene la relación de los módulos del sistema. "<spec>Script.xst" contiene comandos que dirigen el proceso de síntesis con la herramienta XST. Algunos de estos comandos son independientes de las opciones elegidas, mientras que otros dependen de las mismas (concretamente, los comandos rom_extract y ram_extract dependen de las opciones elegidas en el tipo de ROM y RAM a usar en el campo FPGA implementation).

Finalmente, si se ha seleccionado la opción de generar ficheros complementarios, se obtiene una serie de ficheros con extensiones ".dat", ".dat.bin" y ".plt". Estos ficheros contienen información relacionada con el contenido de las memorias de antecedentes y las bases de reglas del sistema para su posterior estudio. Se generan un fichero ".dat" y otro ".dat.bin" por cada variable de entrada, que contienen los datos de las memorias de antecedentes (combinaciones de valores de etiqueta-grado-grado) en decimal y en binario, respectivamente. El fichero ".plt" es un fichero de comandos de Gnuplot que permite representar gráficamente las funciones de pertenencia. Por último, se obtiene un fichero con extensión ".dat" que incluye el contenido de la memoria de reglas.

Durante la creación de los ficheros se puede producir algún error o warning que se comunicará al usuario en el área de mensajes de Xfuzzy. El listado de los errores, junto a la descripción de las causas que los motivan, se ilustra en la sección mensajes de error.

El botón Generate and Implement genera los mismos ficheros que el botón Generate VHDL code, pero además sintetiza el código VHDL y lo implementa sobre la FPGA de Xilinx especificada en FPGA implementation, con las opciones de implementación especificadas en Cad Tools Options, haciendo uso de las herramientas de síntesis e implementación de Xilinx. En esta fase puede aparecer el mensaje "There are errors, so can´t execute any synthesis tool" o "There are errors, so can´t execute any implementation tool" si se ha producido previamente algún error en la etapa de creación de ficheros.

Ejecución en modo de comando

La herramienta xfvhdl también se puede ejecutar desde un terminal utilizando los siguientes comandos:

  • xfvhdl –g <XFL3> [<XML>]: Permite abrir la interfaz gráfica de xfvhdl cargando la especificación XFL3 de un sistema difuso. En caso de que se especifique un archivo de configuración XML también se carga el fichero de configuración indicado.

  • xfvdl <XFL3> [<XML>] [options]: Genera el código VHDL para la especificación XFL3 con el fichero de configuración XML. El campo [options] admite los siguientes modificadores:

  • -S: (genera código VHDL y sintetiza)
    -I: (genera código VHDL, sintetiza e implementa)
    -L <library>: (usa la librería VHDL indicada, en lugar de usar la definida por defecto)

Fichero de configuración

La configuración del proceso de síntesis con xfvhdl puede guardadase en un fichero XML. La raíz del fichero de configuración es la etiqueta denominada system, que tiene tres atributos: name, rulebases y crisps. El primero indica el nombre del sistema, mientras que los otros dos indican, respectivamente, el número de bases de reglas y de bloques crisp.

<?xml version="1.0" encoding="UTF-8" ?> 
<system name="Backward" rulebases="2" crisps="1">
  <rulebases>
    <rulebase name="interpolacion" inputs="2" outputs="1">
      <bits_input>8</bits_input> 
      <bits_output>8</bits_output> 
      <bits_membership_degree>8</bits_membership_degree> 
      <bits_MF_slopes>8</bits_MF_slopes> 
      <bits_def_weight>8</bits_def_weight> 
      <MFC_arithmetic>true</MFC_arithmetic> 
      <MFC_memory>ROM</MFC_memory> 
      <RB_memory>ROM</RB_memory> 
    </rulebase>
    <rulebase name="suavizado" inputs="1" outputs="1">
      <bits_input>9</bits_input> 
      <bits_output>9</bits_output> 
      <bits_membership_degree>9</bits_membership_degree> 
      <bits_MF_slopes>2</bits_MF_slopes> 
      <bits_def_weight>9</bits_def_weight> 
      <MFC_arithmetic>true</MFC_arithmetic> 
      <MFC_memory>ROM</MFC_memory> 
      <RB_memory>ROM</RB_memory> 
    </rulebase>
  </rulebases>
  <crisps>
    <crisp name="Resta" inputs="2" outputs="1">
    <bitsize_output>9</bitsize_output> 
      </crisp>
  </crisps>
  <options>
    <complementary_files>false</complementary_files> 
    <use_simp_components>true</use_simp_components>
    <hardware_cosimulation>false</hardware_cosimulation> 
    <FPGA_RAM>0</FPGA_RAM> 
    <FPGA_ROM>0</FPGA_ROM> 
    <FPGA_family>Spartan3</FPGA_family> 
    <FPGA_device>xc3s1000-ft256-4</FPGA_device> 
    <CAD_tool>0</CAD_tool> 
    <CAD_optimization>0</CAD_optimization> 
    <CAD_effort>0</CAD_effort> 
    <outputFile>Backward</outputFile> 
    <outputDirectory>C:\Xfuzzy\Ejemplo\OUT</outputDirectory> 
  </options>
</system>    
 

El fichero incluye tres elementos principales: rulebases, crisps y options. La etiqueta rulebases contiene información sobre las bases de reglas, cada una de ellas identificada con la etiqueta rulebase. Este elemento tiene como atributos: name, que indica el nombre de la base de reglas; inputs, que indica el número de entradas; y outputs, que indica el número de salidas. Los elementos hijos de esta etiqueta definen cada uno de los parámetros de la base de reglas: bits_input (número de bits para las entradas), bits_output (número de bits para las salidas), bits_membership_degree (número de bits para el grado de pertenencia), bits_MF_slopes (número de bits para las pendientes), bits_def_weight (número de bits para el peso de los defuzzificadores que utilizan este parámetro), MFC_arithmetic (booleano que indica si se ha escogido implementar los MFCs mediante circuitos aritméticos (true) o mediante una memoria (false)), MFC_memory (indica el tipo de memoria escogida para la memoria de antecedentes) y RB_memory (indica el tipo de memoria escogida para la memoria de reglas).

El elemento crisps aparece vacío cuando el sistema no incluye ningún bloque de este tipo. En caso contrario, cada bloque es definido mediante una etiqueta crisp que incluye los atributos: name, que indica el nombre del bloque; inputs, que indica el número de entradas; y outputs, que indica el número de salidas. El único parámetro que puede definirse para este tipo de elementos es el número de bits con el que se codifica la salida (bitsize_output).

Por último, la etiqueta options se utiliza para identificar las distintas opciones que aparecen en la parte inferior de la interfaz gráfica de xfvhdl. Los elementos hijos de dicha etiqueta son: complementary_files (booleano que indica si el usuario selecciona la opción de generación de ficheros complementarios), use_simp_components (booleano que muestra si el usuario selecciona la opción de usar métodos de defuzzificación simplificados, FPGA_RAM (número del 0 al 3 que indica el tipo de memoria RAM utilizada; 0=Automatic, 1=None, 2=Block, 3=distributed), FPGA_ROM (número del 0 al 3 que indica la opción elegida para la memoria ROM utilizada; 0=Automatic, 1=None, 2=Block, 3=distributed), FPGA_family (texto que indica la familia de FPGAs escogida por el usuario), CAD_tool (número 0 o 1 que indica la herramienta de síntesis escogida; 0=Xilinx Vivado, 1=Xilinx XST), CAD_optimization (número del 0 al 3 que indica la optimización que se quiere usar; 0=Without optimization, 1=Area optimization, 2=Speed optimization, 3=Area and Speed optimization), y CAD_effort (número 0 o 1 que indica el esfuerzo que se quiere usar; 0=Low, 1=High).

Mensajes de error

Error
Descripción

Can´t create output directory

Aparece cuando hay un fallo al crear alguno de los ficheros de salida

The maximum overlapping degree must be two in variable <i>

Se produce cuando en cierta variable hay un solapamiento distinto de 2 que no está permitido en la arquitectura en la que se basa la herramienta

There isn´t any membership function in variable <i>

Indica que no se han definido funciones de pertenencia para la variable <i>

It is not allowed rulebases with more tan two inputs and Takagi-Sugeno as defuzzification method: <rulebase-name>

Aparece cuando se ha utilizado un sistema con más de dos entradas y Takagi-Sugeno como defuzzificador

Error in rule: <FLC-name>

Se produce cuando hay un fallo en una regla de un módulo de inferencia

It is not allowed rulebases with more tan one output: <rulebase-name>

Se produce cuando la base de reglas tiene más de una salida

No prefix file valid. By default <OUTPUT_FILE_DEFAULT>

Indica que se utiliza el prefijo por defecto en la generación de los ficheros de salida debido a que el introducido no es válido

AND operation not valid. Will be used Minimum by default

Indica que va a ser utilizado el conectivo Mínimo porque el operador AND que se ha utilizado no está soportado

Families of Membership Functions not allowed

Se produce cuando se usan funciones de pertenencia o familias de funciones de pertenencia que no están soportadas

The xml file is not correctly defined

Aparece cuando se utiliza un archivo XML erróneo

Exception in defuzzification method: <FLC-name>

Aparece cuando se produce alguna incompatibilidad entre la herramienta y el defuzzificador usado en el módulo de inferencia

The bitsize for membership function slope is too short, you must resize it or choose memory for the MFCs in <FLC-name>

Se produce cuando no se han asignado suficientes bits para codificar las pendientes de las funciones de pertenencia


--------------------------------------------------------------------------------------
M. Brox, S. Sánchez-Solano, E. del Toro, P. Brox, F. J. Moreno-Velo
CAD Tools for Hardware Implementation of Embedded Fuzzy Systems on FPGAs
IEEE Transactions on Industrial Informatics, 2012
DOI: 10.1109/TII.2012.2228871

Para comentarios, sugerencias, notificación de bugs, etc. contacte con nosotros en:   xfuzzy-team@imse-cnm.csic.es

©IMSE-CNM 2018