FlowHDL, lenguaje de programación visual
para el diseño digital de lógica programable
FlowHDL, visual programming language for digital design of programmable logic
Anibal Fernando Antonelli
1
and Carlos Arturo Gayoso
2
Laboratorio de Componentes Electrónicos, Facultad de Ingeniería, Universidad Nacional de Mar del Plata (FI-UNMdP)
Juan B. Justo 2002, Mar del Plata, Buenos Aires, Argentina
1
anibal.antonelli@fi.mdp.edu.ar
2
cgayoso@fi.mdp.edu.ar
Resumen Dentro del diseño digital de lógica programable
se cuenta con una gran cantidad de herramientas de software,
sin embargo se observa que existe la necesidad de disponer
de mayores facilidades para los usuarios de estos sistemas.
Los principios necesarios de usabilidad pueden ser provistos
por los lenguajes de programación visual. Por otro lado,
para generar código VHDL o Verilog sintentizable en una
FPGA a través de un sistema visual coherente, es necesario
superar múltiples inconvenientes. En este trabajo se presenta
una nueva herramienta visual para el diseño de circuitos
electrónicos digitales.
Palabras clave: lenguaje de programación visual, diseño
digital, VHDL, máquinas de estado, tablas de verdad,
desarrollo de software.
Within the digital design of programmable logic there
is a large number of software, however the need for greater
facilities for the users of these systems is observed. The
necessary principles of usability can be provided by visual
programming languages. On the other hand, to generate
synthesizable VHDL or Verilog code in an FPGA through a
coherent visual system, it is necessary to overcome multiple
drawbacks. This work presents a new visual tool for the
design of digital electronic circuits.
Keywords: visual programming language, digital design,
VHDL, state machines, truth tables, software development.
I. INTRODUCCIÓN
Si bien se dispone de una gran cantidad de herramientas
de diseño digital, se observa que existe la necesidad de
contar con aquellas que simplifiquen la descripción, en-
tendimiento y desarrollo de circuitos digitales. Lenguajes
de programación visuales como LabView [1] se vienen
desarrollando en éste sentido. También herramientas de
código abierto como RKH [2] para máquinas de estado, o
Icestudio [3] para interconexión de componentes. En éste
contexto, la mejora en los tiempos de diseño y aprendizaje,
aprovechando el recurso visual deben ser explotados aún
más para el desarrollo del diseño digital.
Además, en la actualidad también se cuenta con herra-
mientas que facilitan el trabajo de describir hardware a
partir lenguajes de alto nivel como C, C++, SystemC [4],
Matlab [5] e incluso en el último tiempo Rust [6]. Éstas
herramientas aceleran el proceso de desarrollo de sistemas
digitales, pero no siempre garantizan resultados óptimos en
término de área utilizada y rendimiento del sistema [7]. De
ésta forma, lenguajes que faciliten y enriquezcan el diseño
digital a toda escala sigue siendo de interéz.
Según Marriott y Meyer [8] un lenguaje visual es un con-
junto de diagramas que representan sentencias válidas en ese
mismo lenguaje. Tales diagramas se pueden entender como
una colección de símbolos en un espacio bidimensional o
tridimensional. Usando este paradigma, se puede lograr el
diseño de sistemas de forma más accesible para los usuarios
[9].
En el presente trabajo se introduce un lenguaje de progra-
mación visual para el diseño digital denominado FlowHDL.
Al igual que en VHDL y Verilog, donde existen especi-
ficaciones funcionales denominadas Entidades y Módulos
respectivamente, en FlowHDL se cuenta también con nodos
funcionales, los cuales pueden instanciar componentes par-
ticulares y ser interconectados a través de sus compuertas de
entrada y salida. Una vez que se cuenta con el Lenguaje de
Descripción de Hardware (HDL por sus siglas en ingles),
los componentes se sintetizan en elementos electrónicos
digitales y las interconexiones en conexiones físicas que
transmiten señales eléctricas.
Con el presente Lenguaje Visual se busca agilizar y lograr
un entendimiento estructural del sistema en su conjunto [9]
en el proceso de diseño digital de la lógica programable.
El mismo por ser un lenguaje de programación visual con
manipulación directa desde la interfaz, puede ser utilizado
en una etapa inicial para la enseñanza; pero en la medida
que vaya madurando puede llegar a tener un general en el
desarrollo de un proyectos.
II. IMPLEMENTACIÓN
El sistema se ha implementado utilizado el lenguaje de
programación C++ debido a la necesidad de utilizar la
Programación Orientada a Objetos (OOP, por sus siglas
en inglés). Se utiliza la herencia para realizar definicio-
nes de código generales que funcionaran más allá de las
particularidades del sistema. Así, las funcionalidades de
las conexiones, los espacios (slots) donde se encastran las
conexiones, y los nodos que contienen transformaciones de
datos, se definen de manera abstracta en la lógica central
del sistema. Con los aspectos generales cubiertos, las parti-
cularidades se modelan y solucionan. El sistema constituye
Recibido: 16/10/20; Aceptado: 04/02/21
https://doi.org/10.37537/rev.elektron.5.1.113.2021
Creative Commons License - Attribution-NonCommercial-
NoDerivatives 4.0 International (CC BY-NC-ND 4.0)
Original Article
Revista elektron, Vol. 5, No. 1, pp. 56-63 (2021)
ISSN 2525-0159
56
así un framework [10], el cual se detallará más adelante.
II-A. Estructura del sistema
Se cuenta con tres grandes bloques en la arquitectura del
software (Fig. 1). Desde la interfaz de usuario se crean y
conectan nodos funcionales a través de la interacción directa,
los nodos pueden provenir de Entidades en archivos VHDL
de proyectos pre-existentes, tablas de verdad creadas desde
cero o importadas desde archivos con el formato utilizado
por el software Espresso Logic Minimizer [11], máquinas
de estado para ser creadas en la interfaz o nodos jerárquicos
que contendrán otros nodos visuales de cualquiera de los
tipos ya citados. La estructura funcional de mayor jerarquía
(top Entity en VHDL), es un nodo jerárquico que comienza
vacío en el proyecto. Del diseño se encuentra con el nodo
funcional padre, en donde los sub-nodos se conectan.
Figura 1: Diagrama del sistema FlowHDL.
Figura 2: Bloques principales del sistema FlowHDL.
Como se observa en la Fig. 2 se encuentran los bloques
del sistema correspondientes a cada una de las capas, así
1:flowcore y 3:from corresponden a la interfaz de
usuario. El bloque
1:flowcore
se ha programado como
un framework visual que interactúa con las clases internas
abstractas del modelo. Es importante destacar que este
framework visual se ha logrado a partir de realizar amplias
modificaciones a la herramienta de código abierto Node
Editor [12]. En 2:model se agrupan las implementaciones
concretas de los modelos para cada uno de los tipos de
elementos: VHDL, tablas de verdad, maquinas de estado y
una representación textual intermedia denominada genHDL.
Por otro lado 3:from contiene los formularios visuales de
edicion de estos elementos.
Como se muestra en la Fig. 2 4:vhdl,
5:truthtable, 6:statemachine y 7:genhdl
son encapsulados por 2:model para utilizarse desde
el framework visual 1:flowcore siendo trasparente
para éste último. También todos estos bloques del núcleo
mencionados, contienen estructuras y objetos que validan y
almacenan los datos necesarios para generar VHDL válido
a partir de la utilización de la librería de generación de
código 8:condegen.
Por ejemplo, el bloque 5:truthtable mantiene las
estructuras de datos que almacenan las tablas de verdad,
a través de 8:condegen se genera un archivo entendible
por Espresso Logic Minimizer. El bloque 9:esperesso
se comunica con el sistema Espresso Logic Minimizer y
éste devuelva las funciones lógicas que representan cada
salida respecto a las entradas. Por último se transforman las
funciones en formato Espresso a formato VHDL a través de
un conjunto de expresiones regulares.
En el bloque 10:parser se toma como entrada código
VHDL y genHDL. Allí se mantiene una comunicación con
subsistemas que analizan los lenguajes de entrada textual,
generando así objetos JSON [13], que se devolverán a
FlowHDL y servirán para crear los elementos necesarios
en los bloques 4:vhdl y 7:genhdl. Estos subsistemas
se han desarrollado en el lenguaje de programación Rust,
dejando su estudio para futuros trabajos.
II-B. Clases del sistema
Teniendo tres elementos visuales, dos ranuras (slots) y
una conexión, se puede tener funcionalidades subyacentes
diferentes: cuando estas ranuras contienen puertos VHDL
(algo transparente para 1:flowcore), se llamará a una
funcionalidad diferente a cuando se conecten dos estados en
una máquina de estados; pero, las clases abstractas generales
que rigen esta funcionalidad son las mismas en ambos casos.
Con esto se logra tener menor repetición de código y mayor
facilidad de extender el sistema, ya que las generalidades
no deberían cambiar si hay un buen diseño de software.
Como ya se ha dicho, de esta forma, se da la posibilidad
de extender el sistema visual en forma de framework. Las
clases abstractas que brindan esta posibilidad se encuentran
en el modelo de datos.
A continuación se verán las especificaciones de las clases
ranuras y conexiones para observar la especificación de los
nodos ver el Apéndice A.
II-B1. Ranuras: En la Fig. 3 se puede observar la clase
abstracta SlotModel que representa un elemento al que
se pueden agregar conexiones; se procede a detallar algunos
de sus métodos concretos y abstractos:
- haveConnectionSpace: método abstracto que de-
vuelve un valor booleano verdadero en caso que tenga
espacio para realizar una conexión.
Revista elektron, Vol. 5, No. 1, pp. 56-63 (2021)
ISSN 2525-0159
57
http://elektron.fi.uba.ar