<?xml version="1.0" encoding="ISO-8859-1"?><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<journal-meta>
<journal-id>1815-5928</journal-id>
<journal-title><![CDATA[Ingeniería Electrónica, Automática y Comunicaciones]]></journal-title>
<abbrev-journal-title><![CDATA[EAC]]></abbrev-journal-title>
<issn>1815-5928</issn>
<publisher>
<publisher-name><![CDATA[Universidad Tecnológica de La Habana José Antonio Echeverría, Cujae]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S1815-59282014000200004</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[Implementación de la Función Sigmoidal Logarítmica en un FPGA]]></article-title>
<article-title xml:lang="en"><![CDATA[Implementation of the logarithmic sigmoid function on a FPGA]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Caballero Hernández]]></surname>
<given-names><![CDATA[José Abiel]]></given-names>
</name>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Díaz Salazar]]></surname>
<given-names><![CDATA[Martha]]></given-names>
</name>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Moradillos Paz-Lago]]></surname>
<given-names><![CDATA[Meyli]]></given-names>
</name>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Pavoni Oliver]]></surname>
<given-names><![CDATA[Sonnia]]></given-names>
</name>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Instituto Superior Politécnico José Antonio Echeverría  ]]></institution>
<addr-line><![CDATA[La Habana ]]></addr-line>
<country>Cuba</country>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>08</month>
<year>2014</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>08</month>
<year>2014</year>
</pub-date>
<volume>35</volume>
<numero>2</numero>
<fpage>35</fpage>
<lpage>44</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_arttext&amp;pid=S1815-59282014000200004&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_abstract&amp;pid=S1815-59282014000200004&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_pdf&amp;pid=S1815-59282014000200004&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[La función sigmoidal logarítmica es muy utilizada como función de activación de las neuronas que conforman una red neuronal artificial. En la implementación digital sobre FPGA de este tipo de redes, es importante la eficiencia en área de todos los elementos de cálculo. La síntesis hardware directa de la expresión matemática de la función de activación sigmoidal logarítmica no es práctica, ya que tanto las operaciones de división como la exponencial requieren lógica excesiva y convergen lentamente. En consecuencia, se han desarrollado aproximaciones matemáticas que facilitan esta implementación. En el presente trabajo se presenta la síntesis de la función sigmoidal logarítmica para un FPGA Spartan 3 de Xilinx con métodos de aproximación por tramos de primer orden, de aproximación por tramos de segundo orden y mediante el empleo de tablas de búsqueda. Para cada diseño se utilizaron las herramientas Simulink de MatLab y System Generator del programa Xilinx ISE Design Suit 12.4, a nivel de bloques específicos de Xilinx. Como resultado se obtuvo la mejor combinación entre los errores de implementación y el consumo de recursos del FPGA con una aproximación por tramos de primer orden y el empleo de datos de entrada con formato punto fijo de 12 bits de parte entera y 8 bits de resolución.]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[The logarithmic sigmoid function is the most commonly used activation function of the neurons forming an artificial neural network. Digital implementation of neural networks on FPGA must be efficient, especially in the elements estimation area. A direct hardware synthesis of the mathematics expression of logarithmic sigmoid activation function is not practical, because division and exponential estimation are demanding operations, which require excessive logic and convergence is slow. Therefore, some mathematics approximations have been developed to make easier this implementation. This study shows the synthesis of a logarithmic sigmoid function for a Xilinx´s FPGA Spartan-3 utilizing a piecewise first-order linear approximation method, a piecewise second-order linear approximation method, and a look-up table method. For each design was used MatLab's Simulink tool and the System Generator tool from Xilinx ISE Design Suit 12.4 program, at a Xilinx´s specifics blocks level. It is concluded that the best performance is achieved by the piecewise first-order linear approximation with input data format fixed point with 12 bits of integer bits and 8 bits of fractional bits.]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[función sigmoidal logarítmica]]></kwd>
<kwd lng="es"><![CDATA[FPGA]]></kwd>
<kwd lng="es"><![CDATA[system generator]]></kwd>
<kwd lng="en"><![CDATA[logarithmic sigmoid function]]></kwd>
<kwd lng="en"><![CDATA[FPGA]]></kwd>
<kwd lng="en"><![CDATA[system generator]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[ <P align="right"><font size="2" face="Verdana"><strong>ARTICULO ORIGINAL</strong></font></P>     <P>&nbsp;</P>     <P><font size="4" face="Verdana"><B>Implementaci&oacute;n de la Funci&oacute;n Sigmoidal Logar&iacute;tmica en un FPGA</B> </font></P>     <P>&nbsp;</P>     <P><font size="2"><b><font size="3" face="Verdana">Implementation of the logarithmic sigmoid function on a FPGA </font></b></font></P>     <P>&nbsp;</P>     <P>&nbsp;</P>     <P><font size="2" face="Verdana"><strong>Ing. Jos&eacute; Abiel Caballero Hern&aacute;ndez, Ing. Martha D&iacute;az Salazar, Ing. Meyli    Moradillos Paz-Lago, Dra. Sonnia Pavoni Oliver </strong></font></P>     <P><font size="2" face="Verdana">Instituto Superior Polit&eacute;cnico Jos&eacute; Antonio Echeverr&iacute;a, La Habana, Cuba. E-mail:</font> <font size="2" face="Verdana"><a href="mailto:jcaballero@electrica.cujae.edu.cu">jcaballero@electrica.cujae.edu.cu</a> , <a href="mailto:sonnia.pavoni@electrica.cujae.edu.cu">sonnia.pavoni@electrica.cujae.edu.cu</a></font></P>     <P>&nbsp;</P>     ]]></body>
<body><![CDATA[<P>&nbsp;</P> <hr>     <P><font size="2" face="Verdana"><B>RESUMEN</B> </font></P>     <P><font size="2" face="Verdana">La funci&oacute;n sigmoidal logar&iacute;tmica es muy utilizada como funci&oacute;n de activaci&oacute;n de las neuronas  que conforman una red neuronal artificial. En la implementaci&oacute;n digital sobre FPGA de este tipo de redes,  es importante la eficiencia en &aacute;rea de todos los elementos de c&aacute;lculo. La s&iacute;ntesis <I>hardware </I>directa de la expresi&oacute;n matem&aacute;tica de la funci&oacute;n de activaci&oacute;n sigmoidal logar&iacute;tmica no es pr&aacute;ctica, ya que tanto  las operaciones de divisi&oacute;n como la exponencial requieren l&oacute;gica excesiva y convergen lentamente.  En consecuencia, se han desarrollado aproximaciones matem&aacute;ticas que facilitan esta implementaci&oacute;n. En  el presente trabajo se presenta la s&iacute;ntesis de la funci&oacute;n sigmoidal logar&iacute;tmica para un FPGA Spartan 3  de Xilinx con m&eacute;todos de aproximaci&oacute;n por tramos de primer orden, de aproximaci&oacute;n por tramos de  segundo orden y mediante el empleo de tablas de b&uacute;squeda. Para cada dise&ntilde;o se utilizaron las  herramientas Simulink de MatLab y System Generator del programa Xilinx ISE Design Suit 12.4, a nivel de  bloques espec&iacute;ficos de Xilinx. Como resultado se obtuvo la mejor combinaci&oacute;n entre los errores de  implementaci&oacute;n y el consumo de recursos del FPGA con una aproximaci&oacute;n por tramos de primer orden y el empleo  de datos de entrada con formato punto fijo de 12 bits de parte entera y 8 bits de resoluci&oacute;n. </font></P>     <P><font size="2" face="Verdana"><strong>Palabras claves:</strong> funci&oacute;n sigmoidal logar&iacute;tmica, FPGA, system generator.    <br> </font></P> <hr>     <P><font size="2" face="Verdana"><B>ABSTRACT</B></font></P>     <P><font size="2" face="Verdana">The logarithmic sigmoid function is the most commonly used  activation function of the neurons forming an artificial neural network. Digital implementation of neural networks on FPGA must  be efficient, especially in the elements estimation area. A direct hardware synthesis of the  mathematics expression of logarithmic sigmoid activation function is not practical, because division and  exponential estimation are demanding operations, which require excessive logic and convergence is slow.  Therefore, some mathematics approximations have been developed to make easier this implementation.  This study shows the synthesis of a logarithmic sigmoid function for a Xilinx&#180;s FPGA Spartan-3 utilizing  a piecewise first-order linear approximation method, a piecewise second-order linear  approximation method, and a look-up table method. For each design was used MatLab's Simulink tool and  the System Generator tool from Xilinx ISE Design Suit 12.4 program, at a Xilinx&#180;s specifics blocks  level. </font> <font size="2" face="Verdana">It is concluded that the best performance is achieved by the piecewise first-order linear  approximation with input data format fixed point with 12 bits of integer bits and 8 bits of fractional bits.</font></P>     <P><font size="2"><font face="Verdana"><B>Key words: </B>logarithmic sigmoid function, FPGA, system    generator.</font> </font>    <br> </P> <hr>     <P>&nbsp;</P>     ]]></body>
<body><![CDATA[<P>&nbsp;</P>     <P><font size="3" face="Verdana"><B>INTRODUCCION</B> </font></P>     <P>&nbsp;</P>     <P><font size="2" face="Verdana">La implementaci&oacute;n circuital de funciones matem&aacute;ticas tiene aplicaci&oacute;n en diversas &aacute;reas de trabajo. En particular,    la funci&oacute;n sigmoidal es muy utilizada en el desarrollo de redes neuronales artificiales, espec&iacute;ficamente en la funci&oacute;n    de activaci&oacute;n de las neuronas que conforman la red[1-3]. </font></P>     <P><font size="2" face="Verdana">Desde el punto de vista electr&oacute;nico, las redes neuronales artificiales pueden ser implementadas con tecnolog&iacute;a  anal&oacute;gica o digital. Aunque las soluciones anal&oacute;gicas tienen ventajas en cuanto a la alta densidad y r&aacute;pida operaci&oacute;n, son  muy sensibles al ruido, al efecto de la temperatura y a las variaciones de suministro de potencia[4]. La tecnolog&iacute;a digital,  por su parte, ofrece mayores posibilidades en cuanto a flexibilidad, aprendizaje, tama&ntilde;o expandible y precisi&oacute;n. Debido  a la utilizaci&oacute;n de la funci&oacute;n sigmoidal como funci&oacute;n de activaci&oacute;n en redes neuronales y al paralelismo de estas  redes, una de las formas m&aacute;s utilizado es su implementaci&oacute;n sobre <I>hardware</I> reconfigurable. Particularmente, la s&iacute;ntesis  en FPGA (<I>Field Programmable Gate Arrays</I>, arreglos de compuertas programables por campo) es muy atractiva  debido a la alta flexibilidad que se alcanza como consecuencia de la naturaleza reprogramable de estos circuitos[4]. </font></P>     <P><font size="2" face="Verdana">Los recursos digitales necesarios para sintetizar la funci&oacute;n sigmoidal sobre un FPGA dependen del m&eacute;todo o  aproximaci&oacute;n matem&aacute;tica que se emplee. En este sentido se han reportado diversas alternativas aunque ninguna se ha convertido  en una soluci&oacute;n universal. Los principales reportes se basan en el uso de tablas de b&uacute;squeda y en el truncamiento de  la serie de Taylor[5]. Esta &uacute;ltima variante se puede dividir en aproximaciones lineales por tramos, aproximaciones  por tramos de segundo orden y mapeo combinacional de entrada/salida[5]. Adem&aacute;s, existe una variaci&oacute;n  considerable dentro de cada categor&iacute;a. Por ejemplo, se reporta una t&eacute;cnica de compresi&oacute;n denominada A-Law[6] y una  aproximaci&oacute;n por tramos sin multiplicadores [7]. Existen tambi&eacute;n generadores de funciones elementales capaces de  desarrollar m&uacute;ltiples funciones de activaci&oacute;n que utilizan aproximaciones polin&oacute;micas de primer y segundo orden [8].  Algunos m&eacute;todos utilizan bloques de memoria para su implementaci&oacute;n, otros necesitan multiplicadores de punto fijo y  otras aproximaciones m&aacute;s exigentes, demandan del uso de multiplicadores de punto flotante. Existen adem&aacute;s  m&eacute;todos, donde la aproximaci&oacute;n hecha sustituye el uso de multiplicadores por registros de desplazamiento, con lo que se  logra un menor consumo de recursos. Entre los indicadores que permiten evaluar el &eacute;xito de una implementaci&oacute;n  hardware est&aacute;n la precisi&oacute;n alcanzada, la velocidad m&aacute;xima de trabajo (frecuencia m&aacute;xima de la se&ntilde;al de reloj) y la cantidad  de recursos empleados en el dise&ntilde;o[9, 10]. </font></P>     <P><font size="2" face="Verdana">Este art&iacute;culo tiene como objetivo presentar tres dise&ntilde;os de la funci&oacute;n sigmoidal logar&iacute;tmica y su implementaci&oacute;n en  un FPGA Spartan 3 de Xilinx. Se utilizaron aproximaciones matem&aacute;ticas por tramos de primer orden PLAN  (<I>Piecewise Linear Approximation of a Nonlinear  Function</I>), por tramos de segundo orden (Zhang), as&iacute; como el m&eacute;todo de  tablas de b&uacute;squeda. Con la aproximaci&oacute;n PLAN y el empleo de datos de entrada con formato punto fijo de 12 bits de  parte entera y 8 bits de resoluci&oacute;n, se obtuvo la mejor combinaci&oacute;n entre los errores de implementaci&oacute;n y el consumo  de recursos del FPGA. Esta soluci&oacute;n se recomienda para la implementaci&oacute;n de la funci&oacute;n de activaci&oacute;n sigmoidal en  el dise&ntilde;o de redes neuronales artificiales. </font></P>     <P><font size="2" face="Verdana"><B>APROXIMACIONES MATEM&Aacute;TICAS DE LA FUNCI&Oacute;N SIGMOIDAL </B> </font></P>     <P><font size="2" face="Verdana">La funci&oacute;n sigmoidal puede ser logar&iacute;tmica o tangente hiperb&oacute;lica en dependencia de si corta o no el eje de  las abscisas. A estos dos casos, cuyas caracter&iacute;sticas se resumen en la <a href="/img/revistas/eac/v35n2/t0104214.jpg">Tabla 1</a>, tambi&eacute;n se les conoce en la literatura  como unipolar y bipolar, respectivamente. </font></P>     
<P><font size="2" face="Verdana">Algunos m&eacute;todos de aproximaci&oacute;n de la funci&oacute;n sigmoidal reportados en la literatura, se muestran en la <a href="/img/revistas/eac/v35n2/t0204214.jpg">Tabla 2</a>.  Los valores de error promedio  (E<SUB>promedio</SUB>) y error m&aacute;ximo  (E<SUB>m&aacute;ximo</SUB>) de las aproximaciones son proporcionados por los  autores de los respectivos trabajos.  </font></P>     
]]></body>
<body><![CDATA[<P><font size="2" face="Verdana">La aproximaci&oacute;n polinomial reportada por Faiedh[10] consiste en separar la funci&oacute;n en diez polinomios de primer  orden. Como se observa en la <a href="/img/revistas/eac/v35n2/t0204214.jpg">Tabla 2</a>, esta variante presenta los menores valores de error en comparaci&oacute;n con el resto,  sin embargo, no es viable para desarrollar en <I>hardware</I> debido a la excesiva cantidad de multiplicadores que se  requieren (uno por tramo).  </font></P>     
<P><font size="2" face="Verdana">La t&eacute;cnica de compresi&oacute;n A-Law[6] dise&ntilde;ada por Myers y Hutchinson, muestra los mayores valores de error.  Sin embargo, constituye una soluci&oacute;n ingeniosa puesto que propone dividir la funci&oacute;n en siete segmentos lineales  donde la pendiente de cada uno se expresa como una potencia de dos. Esto permite la sustituci&oacute;n de los multiplicadores  por registros de desplazamiento. </font></P>     <P><font size="2" face="Verdana">Por su parte, Alippi y Storti-Gajani[11] basan su aproximaci&oacute;n en seleccionar un conjunto de puntos de interrupci&oacute;n  y establecer los valores de &#171;y&#187; como potencias de dos. Al igual que A-Law, la f&oacute;rmula puede implementarse  mediante adiciones y operaciones de desplazamiento, lo que es muy conveniente para implementarla digitalmente[11].  Puesto que la funci&oacute;n sigmoidal tiene un punto de simetr&iacute;a en (0,0.5), en esta aproximaci&oacute;n se propone calcular s&oacute;lo la  mitad de los pares (<I>x, y</I>), lo que se muestra en las expresiones <a href="#e1">1</a> y<a href="#e2"> 2</a>.  </font></P>     <P align="center"><font size="2" face="Verdana">          <img src="/img/revistas/eac/v35n2/e0104214.jpg" width="295" height="41"></font><a name="e1"></a></P>     
<P align="center"><img src="/img/revistas/eac/v35n2/e0204214.jpg" width="294" height="44"><a name="e2"></a></P>     
<P>&nbsp;</P>     <P><font size="2" face="Verdana">La denominada aproximaci&oacute;n PLAN tambi&eacute;n se basa en dividir la funci&oacute;n en tramos de primer orden, que se    presentan en la <a href="#t3">Tabla 3</a>. Fue propuesta por Amin, Curtis y Hayes Gill en 1997 [7]. Esta variante puede implementarse    mediante adiciones y operaciones de desplazamiento al igual que la aproximaci&oacute;n de Alippi y Storti-Gajani. Al igual que en    el caso anterior se propone calcular s&oacute;lo la mitad de los pares (x, y), los c&aacute;lculos s&oacute;lo deben realizarse para    valores absolutos de la entrada x (ver la <a href="#e2">expresi&oacute;n 2</a>). </font></P>     <P align="center"><img src="/img/revistas/eac/v35n2/t0304214.jpg" width="313" height="174"><a name="t3"></a></P>     
<P><font size="2" face="Verdana">Esta aproximaci&oacute;n es m&aacute;s ventajosa con respecto a la A-Law en cuanto a que tiene menor error y menor cantidad  de tramos, aunque el rango de entrada es m&aacute;s limitado. </font></P>     <P><font size="2" face="Verdana">La funci&oacute;n sigmoidal tambi&eacute;n puede ser representada como una aproximaci&oacute;n por tramos de segundo orden  expresados de la forma: <a href="#e3">(ecuaci&oacute;n 3)</a> </font></P>     ]]></body>
<body><![CDATA[<P align="center"><img src="/img/revistas/eac/v35n2/e0304214.jpg" width="295" height="38"><a name="e3"></a></P>     
<P><font size="2" face="Verdana">La desventaja de este tipo de aproximaci&oacute;n es que se necesita de varios multiplicadores en su implementaci&oacute;n  circuital. Con el objetivo de resolver este inconveniente, Zhang, Vassiliadis y DelgadoFr&iacute;as[12] han presentado un esquema  de aproximaci&oacute;n de segundo orden en el rango de (-4,4) que requiere el uso de un solo multiplicador. En este intervalo  la funci&oacute;n queda como se muestra en la <a href="#e4">expresi&oacute;n 4</a>: </font></P>     <P align="center"><img src="/img/revistas/eac/v35n2/e0404214.jpg" width="457" height="85"><a name="e4"></a></P>     
<P><font size="2" face="Verdana">Una tabla de b&uacute;squeda tambi&eacute;n puede emplearse para sintetizar la funci&oacute;n sigmoidal mediante valores discretos.  Este m&eacute;todo de tabla de b&uacute;squeda consiste en una tabla de la verdad que almacena el resultado esperado para cada  valor de la entrada, esta tabla de la verdad se almacena en una memoria ROM. El tama&ntilde;o de la tabla depender&aacute; de  la resoluci&oacute;n de los datos de entrada, lo que determina el n&uacute;mero de combinaciones l&oacute;gicas y del formato de los datos  de salida. La implementaci&oacute;n de este m&eacute;todo consume gran cantidad de recursos del FPGA solo en el caso donde  la memoria ROM no es implementada con bloques RAM predeterminados del FPGA. </font></P>     <P><font size="2" face="Verdana">Con la utilizaci&oacute;n de este m&eacute;todo para realizar la funci&oacute;n de activaci&oacute;n, los niveles de exactitud que pueden  alcanzarse dependen siempre de la cantidad de puntos que sean almacenados en la memoria. Si se aumenta la cantidad de  puntos      ser&aacute; m&aacute;s precisa la funci&oacute;n que se obtenga pero aumentar&aacute; el tama&ntilde;o de la memoria y ser&aacute; mucho mayor el consumo  de recursos. </font></P>     <P><font size="2" face="Verdana"><B>REPRESENTACI&Oacute;N DE LOS DATOS Y REQUERIMIENTOS  DE PRECISI&Oacute;N</B> </font></P>     <P><font size="2" face="Verdana">En la aproximaci&oacute;n de funciones existen dos fuentes de error, el error inherente al m&eacute;todo de aproximaci&oacute;n empleado  y el error relacionado con la representaci&oacute;n de los datos que resulta del uso de un n&uacute;mero finito de bits. Para  minimizar el consumo de recursos, el m&iacute;nimo n&uacute;mero de bits debe escogerse de manera que resulte en un error aceptable[13]. </font></P>     <P><font size="2" face="Verdana">La representaci&oacute;n num&eacute;rica en punto flotante de precisi&oacute;n est&aacute;ndar se utiliza generalmente en la simulaci&oacute;n de RNA  en los microprocesadores de prop&oacute;sito general y ofrece mayor precisi&oacute;n y error de cuantificaci&oacute;n m&iacute;nimo con respecto  a otros tipos de representaci&oacute;n. Sin embargo, debido a los recursos limitados disponibles en un FPGA, el est&aacute;ndar  de punto flotante no es factible en comparaci&oacute;n con representaciones num&eacute;ricas m&aacute;s eficientes en &aacute;rea, tales como 16  o 32 bits de punto fijo [14]. </font></P>     <P><font size="2" face="Verdana">Otros autores han demostrado la ventaja del punto fijo por encima del punto flotante, al mostrar que las  necesidades de espacio/tiempo de sumadores y multiplicadores de 32-bit de punto fijo fueron inferiores a la de sus equivalentes  de 32 bits de punto flotante[15].  </font></P>     <P><font size="2" face="Verdana">La cantidad de bits que representan la parte entera del n&uacute;mero debe escogerse basado en el rango de la funci&oacute;n  de activaci&oacute;n. Dado que el rango de salida de la funci&oacute;n sigmoidal es diferente al de entrada, el formato de los datos  de salida no tiene que coincidir con el de los datos de entrada[13]. </font></P>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana">El n&uacute;mero de bits que se utilizan para representar la parte fraccional, depender&aacute; de la precisi&oacute;n que quiera  alcanzarse. Algunos autores plantean la utilizaci&oacute;n de 3, 4, 10, 12 o hasta 16 bits de precisi&oacute;n, aunque fue encontrado en  la literatura que 10 bits son suficientes para algunas aplicaciones, como redes neuronales tipo perceptr&oacute;n  multicapa[6-9, 16]. </font></P>     <P>&nbsp;</P>     <P><font size="3" face="Verdana"><B>MATERIALES Y M&Eacute;TODOS</B> </font></P>     <P>&nbsp;</P>     <P><font size="2" face="Verdana">Se realiz&oacute; la implementaci&oacute;n digital de la funci&oacute;n sigmoidal logar&iacute;tmica mediante tres aproximaciones: la variante    PLAN que se describe en la <a href="#t3">Tabla 3</a>; la aproximaci&oacute;n de segundo orden propuesta por Zhang presentada en la <a href="#e4">expresi&oacute;n 4</a>  y la t&eacute;cnica de tablas de b&uacute;squeda. </font></P>     <P><font size="2" face="Verdana">Para la implementaci&oacute;n de la funci&oacute;n se utiliz&oacute; el programa MatLab v.7.10 (R2010a), el cual permite mediante  su herramienta Simulink y el empleo de la herramienta System Generator del programa Xilinx ISE Design Suit 12.4 (ISE),  el dise&ntilde;o <I>hardware</I> de la funci&oacute;n, a nivel de bloques espec&iacute;ficos de Xilinx. </font></P>     <P><font size="2" face="Verdana">Se utiliz&oacute; formato de punto fijo para    los datos de entrada y salida. Como el rango de entrada para las aproximaciones    implementadas est&aacute; entre [-5,5] y (-4,4), bastan 4 bits de parte entera    para los datos de entrada. Para los datos de salida se tom&oacute; solo un bit    de parte entera pues la funci&oacute;n est&aacute; acotada en el intervalo (0,1)    y con esto es suficiente. En cuanto a los bits de precisi&oacute;n se tomaron    tres casos: 4 bits, 8 bits y 16 bits para cada una de las aproximaciones. En    la <a href="/img/revistas/eac/v35n2/t0404214.jpg">Tabla 4</a> se muestra    el formato empleado tanto para los datos de entrada como para los de salida.    </font></P>     
<P><font size="2" face="Verdana">El consumo de recursos y la frecuencia de reloj m&aacute;xima se obtienen para cada aproximaci&oacute;n mediante el  programa <I>System Generator</I> y el error se calcula con el empleo de MatLab. </font></P>     <P>&nbsp;</P>     <P><font size="3" face="Verdana"><B>RESULTADOS Y DISCUSI&Oacute;N</B> </font></P>     ]]></body>
<body><![CDATA[<P>&nbsp;</P>     <P><font size="2" face="Verdana">Como muestra la <a href="/img/revistas/eac/v35n2/f0104214.jpg">Figura    1</a>, la implementaci&oacute;n de la funci&oacute;n sigmoidal con la aproximaci&oacute;n    PLAN es la representaci&oacute;n del algoritmo matem&aacute;tico, donde se realizan    los c&aacute;lculos solo con los valores positivos de la entrada. Se utilizaron    cuatro multiplexores. El primero (<I>Mux</I>) se emple&oacute; para obtener    el m&oacute;dulo del dato de entrada, para controlar la entrada de selecci&oacute;n    de este multiplexor se utiliz&oacute; un bloque cuya funci&oacute;n es extraer    el signo del dato. El <I>Mux1</I> y <I>Mux2</I> se utilizaron para formar las    expresiones matem&aacute;ticas que representan la funci&oacute;n sigmoidal,    el bloque &#171;<I>compare</I>&#187; se encarga del control de la entrada de    selecci&oacute;n de ambos. Este bloque <I>&#171;compare&#187;</I> es un bloque    tipo &#171;<I>MCode</I>&#187;, el cual permite a&ntilde;adirle al dise&ntilde;o    funciones de MatLab, las cuales pueden ser desarrolladas por el dise&ntilde;ador.    El cuarto multiplexor (<I>Mux3</I>) se utiliz&oacute; para seleccionar el valor    de la salida, debido a que la funci&oacute;n sigmoidal es sim&eacute;trica,    si el valor de entrada es positivo se deja pasar a la salida el valor calculado    hasta el momento, sino la salida es 1-valor<SUB>calc</SUB>. Para aumentar la    frecuencia de trabajo del sistema, el dise&ntilde;o se segment&oacute; en tres    lugares: en los comparadores que seleccionan el tramo, se introdujo una latencia    unitaria, adem&aacute;s se utiliz&oacute; un bloque de demora con latencia unitaria    a la salida del bloque &#171;<I>compare</I>&#187; y por &uacute;ltimo se a&ntilde;adi&oacute;    una latencia unitaria en los multiplexores que se usan para formar la expresi&oacute;n    matem&aacute;tica. La segmentaci&oacute;n se hizo de esta forma para eliminar    los caminos combinacionales m&aacute;s largos, se&ntilde;alados en los reportes    del programa <I>System Generator</I>. De esta forma se introdujo una latencia    total al dise&ntilde;o de tres per&iacute;odos de reloj. </font></P>     
<P><font size="2" face="Verdana">La implementaci&oacute;n con la aproximaci&oacute;n    de segundo orden se muestra en la <a href="/img/revistas/eac/v35n2/f0204214.jpg">Figura    2</a>. El dato de entrada se desplaza dos veces hacia la derecha, con lo que    se divide entre cuatro. La entrada de selecci&oacute;n del primer multiplexor    (<I>Mux</I>) es el signo del dato de entrada, este se analiza con un bloque    slice, a partir de este se selecciona que operaci&oacute;n es la que va a propagar    el circuito, si la operaci&oacute;n de suma o la de resta (tramo positivo o    negativo). Con el multiplicador se eleva al cuadrado el dato que se encuentra    a la salida del multiplexor (<I>Mux</I>) y como indica la expresi&oacute;n 4,    se divide por dos el resultado obtenido hasta el momento, es por eso que se    desplaza el dato un lugar hacia la derecha. A la salida del dise&ntilde;o, en    el &uacute;ltimo multiplexor (<I>Mux1</I>), el signo del dato a la entrada del    dise&ntilde;o es la selecci&oacute;n del multiplexor, de este depende si el    resultado a la salida es el obtenido hasta el momento o uno menos el mismo.    </font></P>     
<P><font size="2" face="Verdana">Como la multiplicaci&oacute;n es la operaci&oacute;n m&aacute;s lenta a realizar en el dise&ntilde;o, se segment&oacute; este bloque mediante la  incorporaci&oacute;n de una latencia unitaria, para aumentar la frecuencia de trabajo.</font></P>     <P><font size="2" face="Verdana">En la <a href="/img/revistas/eac/v35n2/f0304214.jpg">Figura    3</a> se muestra el circuito que se utiliz&oacute; para la soluci&oacute;n mediante    el empleo de tablas de b&uacute;squeda. Los datos de entrada a la funci&oacute;n    est&aacute;n en el rango de [-5,5] y en la memoria hay almacenadas 1000 muestras    de la salida de la funci&oacute;n sigmoidal logar&iacute;tmica, con una resoluci&oacute;n    de 0.01 para ese tramo. Para direccionar la memoria, se necesita que los datos    de entrada est&eacute;n en el rango de [0,1000], para lograr esto se multiplican    por cien y se les suma quinientos. El bloque de memoria ROM del <I>System Generator</I>    se implementa en el FPGA con bloques de memoria RAM o con RAM distribuida, seg&uacute;n    escoja el dise&ntilde;ador, para este dise&ntilde;o se seleccionaron bloques    RAM, ya que como se plante&oacute; al inicio con RAM distribuida el consumo    de recursos es elevado. A este bloque se le puede definir el tama&ntilde;o de    la memoria y los valores con los que se quiere inicializar la misma, los cuales    se obtienen de la salida de la funci&oacute;n &#171;<I>logsig</I>&#187;, de    MatLab, para el rango de entrada en cuesti&oacute;n. </font></P>     
<P><font size="2" face="Verdana">La <a href="/img/revistas/eac/v35n2/f0404214.jpg">Figura    4</a> muestra la representaci&oacute;n gr&aacute;fica de la funci&oacute;n obtenida    con las tres aproximaciones implementadas para cada uno de los formatos de los    datos de entrada utilizados. Un resumen de los valores de error promedio y de    error m&aacute;ximo cometidos con cada uno de estos formatos de entrada se presenta    en la Tabla 5. </font></P>     
<P><font size="2" face="Verdana">Los errores m&aacute;ximo y promedio se utilizan para evaluar la exactitud de una aproximaci&oacute;n. Si se sigue la  metodolog&iacute;a descrita por Zhang[12], entonces si una funci&oacute;n f(x) es aproximada por una funci&oacute;n f*(x) en el intervalo  x &#186;  (&aacute;<SUB>0</SUB>,&aacute;<SUB>1</SUB>), los errores promedio  (E<SUB>promedio</SUB>) y m&aacute;ximo  (E<SUB>m&aacute;ximo</SUB>) se obtienen muestreando uniformemente x en  10<SUP>6</SUP> puntos igualmente espaciados en el dominio de  (&aacute;<SUB>0</SUB>,&aacute;<SUB>1</SUB>) seg&uacute;n se muestra en las    <br>     <br> </font><font size="2" face="Verdana"><a href="#e5">ecuaciones 5</a> y <a href="#e6">6</a>. </font></P>     <P align="center"><img src="/img/revistas/eac/v35n2/e0504214.jpg" width="403" height="66"><a name="e5"></a></P>     
]]></body>
<body><![CDATA[<P align="center"><img src="/img/revistas/eac/v35n2/e0604214.jpg" width="400" height="42"><a name="e6"></a></P>     
<P>&nbsp;</P>     <P><font size="2" face="Verdana">Como se puede observar en la <a href="/img/revistas/eac/v35n2/t0504214.jpg">Tabla    5</a>, los mayores errores promedio y m&aacute;ximo se obtuvieron con datos    de entrada de 4 bits de precisi&oacute;n, mientras que con 8 y 16 bits de precisi&oacute;n,    los errores difieren poco entre s&iacute; para las mismas aproximaciones. Sin    embargo, al observar la <a href="/img/revistas/eac/v35n2/t0604214.jpg">Tabla    6</a>, se ve que el consumo de recursos del FPGA s&iacute; es mucho menor cuando    se usan datos con 8 bits de precisi&oacute;n que con el empleo de 16 bits. De    este an&aacute;lisis se puede concluir que no es necesaria una implementaci&oacute;n    con 16 bits de precisi&oacute;n para alcanzar buenos niveles de exactitud. </font></P>     
<P><font size="2" face="Verdana">Si se analizan los errores para las diferentes aproximaciones, con un mismo formato de entrada, se puede observar  que los menores errores se obtienen con el m&eacute;todo de tablas de b&uacute;squeda, pero seg&uacute;n el reporte mostrado en la Tabla 6,  si se utiliza este m&eacute;todo se necesita mayor cantidad de bloques RAM, lo que no ser&iacute;a efectivo en un proyecto  que requiera m&aacute;s bloques de este tipo que los que tiene el FPGA. Si fuera esta la situaci&oacute;n, entonces es  recomendable  utilizar la aproximaci&oacute;n PLAN, que tiene menor error que la de segundo orden y no utiliza multiplicadores,  recurso tambi&eacute;n limitado en los FPGA. </font></P>     <P><font size="2" face="Verdana">En la <a href="#t7">Tabla 7</a> se muestra adem&aacute;s la frecuencia m&aacute;xima obtenida para cada aproximaci&oacute;n. </font></P>     <P align="center"><img src="/img/revistas/eac/v35n2/t0704214.jpg" width="442" height="217"><a name="t7"></a></P>     
<P>&nbsp;</P>     <P><font size="3" face="Verdana"><B>CONCLUSIONES</B> </font></P>     <P>&nbsp;</P>     <P><font size="2" face="Verdana">En este trabajo se present&oacute; el dise&ntilde;o de la funci&oacute;n sigmoidal logar&iacute;tmica para su implementaci&oacute;n en un FPGA    Spartan 3 de Xilinx. Para ello se utilizaron tres aproximaciones matem&aacute;ticas: por tramos de primer orden (PLAN), por tramos    de segundo orden (Zhang) y por tablas de b&uacute;squeda, cada una con datos de entrada en formato punto fijo (20,16),    (12,8) y (8,4). </font></P>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana">Como resultado se obtuvo que el tipo de dato m&aacute;s eficiente en cuanto al compromiso exactitud y consumo de  recursos del FPGA fue de (12, 8) independientemente de la aproximaci&oacute;n. </font></P>     <P><font size="2" face="Verdana">Mediante las tablas de b&uacute;squeda se obtuvieron los menores valores de error, sin embargo, como se esperaba,  precis&oacute; del empleo de bloques RAM, recurso escaso en los FPGA. Por esta raz&oacute;n se recomienda utilizarlo s&oacute;lo si el n&uacute;mero  de funciones que se necesite implementar en el sistema, es menor que el n&uacute;mero de bloques RAM disponibles en el FPGA. </font></P>     <P><font size="2" face="Verdana">Con la aproximaci&oacute;n PLAN se obtuvo el mejor compromiso entre los errores de implementaci&oacute;n y el consumo  de recursos del FPGA, por lo que esta soluci&oacute;n ser&iacute;a recomendable para aplicaciones donde se requiera de buena  exactitud en la aproximaci&oacute;n y el n&uacute;mero de funciones que se necesite implementar en el sistema sea mayor que el n&uacute;mero  de bloques RAM disponibles en el FPGA, por ejemplo, como funci&oacute;n de activaci&oacute;n en el dise&ntilde;o de redes  neuronales artificiales. </font></P>     <P>&nbsp;</P>     <P><font size="3" face="Verdana"><B>REFERENCIAS</B> </font></P>     <P>&nbsp;</P>     <!-- ref --><P><font size="2" face="Verdana">1.     Manish Panicker, C.B., Efficient FPGA Implementation of Sigmoid and Bipolar Sigmoid Activation    Functions for Multilayer Perceptrons. IOSR Journal of Engineering (IOSRJEN), Junio 2012.  2(6): p. PP 1352-1356.     </font></P>     <!-- ref --><P><font size="2" face="Verdana">2.     Thamer M.Jamel, B.M.K., IMPLEMENTATION OF A SIGMOID ACTIVATION FUNCTION FOR  NEURAL NETWORK USING FPGA. 13th Scientific Conference of Al-Ma'moon University College, Abril 2012.     </font></P>     ]]></body>
<body><![CDATA[<!-- ref --><P><font size="2" face="Verdana">3.     Djalal Eddine Khodja , A.K., and Larbi Refoufi, Sigmoid Function Approximation for ANN Implementation  in FPGA Devices. in Circuits, Systems, Electronics, Control &amp; Signal Processing, 2009.     </font></P>     <!-- ref --><P><font size="2" face="Verdana">4.     N. lzeboudjen, A.F., S. Titri, H.  Boumeridja, Digital Implementation of Artificial Neural Networks:  From VHDL Description to FPGA Implementation. 2004.     </font></P>     <!-- ref --><P><font size="2" face="Verdana">5.     TISAN, A., et al., DIGITAL IMPLEMENTATION OF THE SIGMOID FUNCTION  FOR FPGA  CIRCUITS. ACTA TECHNICA NAPOCENSIS Electronics and Telecommunications, 2009.  Vol. 50(No. 2): p. 6.     </font></P>     <!-- ref --><P><font size="2" face="Verdana">6.     Myers, D.J. and R.A. Hutchinson, Efficient Implementation of Piecewise Linear Activation Function  for Digital VLSI Neural Networks. Electronics Letters, 1989.  Vol. 25(24): p. 16621663.     </font></P>     <!-- ref --><P><font size="2" face="Verdana">7.     Amin, H., K. Curtis, and B.H.  Gill, Piecewise Linear Approximation applied to Non-Linear Function of  a Neural Network. IEE Proceedings Circuits, Devices and Systems, 1997.  Vol. 144: p. 313  317.     </font></P>     ]]></body>
<body><![CDATA[<!-- ref --><P><font size="2" face="Verdana">8.     Vassiliadis, S., Zhang, M., Delgado-Frias,  J., Elementary Function Generators for Neural-Network  Emulators. IEEE Transactions on Neural Networks, 2000.  Vol. 11 (6): p. 1438  1449.     </font></P>     <!-- ref --><P><font size="2" face="Verdana">9.     Tommiska, M.T., Ef&ucirc;cient digital implementation of the sigmoid function for reprogrammable  logic. Comput. Digit. Tech., 2003. Vol.  150(No. 6).     </font></P>     <!-- ref --><P><font size="2" face="Verdana">10.     Faiedh, H., et al., Digital Hardware Implementation of a Neural System Used for Nonlinear Adaptive  Prediction Journal of Computer Science, 2006.     </font></P>     <!-- ref --><P><font size="2" face="Verdana">11.     Alippi, C. and G. StortiGajani, Simple approximation of sigmoidal functions: realistic design of  digital neural networks capable of learning, in  Proc. IEEE Int. Symp. on Circuits and  Systems. 1991: Singapore. p. 1505-1508.     </font></P>     <!-- ref --><P><font size="2" face="Verdana">12.     Zhang M., V.a.D.-F., Sigmoid generators for neural computing using piecewise  approximations. 1996. 45.     </font></P>     ]]></body>
<body><![CDATA[<!-- ref --><P><font size="2" face="Verdana">13.     Daniel Larkin, A.K., Valentin Muresan, Noel  O'Connor, An Efficient Hardware Architecture for a  Neural Network Activation Function Generator. 2008.     </font></P>     <!-- ref --><P><font size="2" face="Verdana">14.     Omondi AR, R.J., FPGA implementations of neural  networks. Springer, 2006.     </font></P>     <!-- ref --><P><font size="2" face="Verdana">15.     Ligon III WB, M.S., Monn G, Schoonover K, Stivers F, Underwood  KD, A Re-evaluation of the Practicality of Floating Point Operations on  FPGAs. IEEE Symposium on FPGAs for Custom Computing Machines, 1998.     </font></P>     <!-- ref --><P><font size="2" face="Verdana">16.     Holt J, H.J., Finite Precision Error Analysis of Neural Network Hardware  Implementations. IEEE Transactions on Computers 1993.  42: p. 280  291.     </font></P>     <P>&nbsp;</P>     <P>&nbsp;</P>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana">Recibido: Abril 2014    <br> Aprobado: Mayo 2014</font></P>     <P></P>     <P></P>     <P> <font size="2" face="Verdana"><B></b></font></P>      ]]></body><back>
<ref-list>
<ref id="B1">
<label>1</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Manish Panicker]]></surname>
<given-names><![CDATA[C.B.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Efficient FPGA Implementation of Sigmoid and Bipolar Sigmoid Activation Functions for Multilayer Perceptrons]]></article-title>
<source><![CDATA[IOSR Journal of Engineering (IOSRJEN)]]></source>
<year>Juni</year>
<month>o </month>
<day>20</day>
<volume>2</volume>
<numero>6</numero>
<issue>6</issue>
<page-range>1352-1356</page-range></nlm-citation>
</ref>
<ref id="B2">
<label>2</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Thamer M]]></surname>
<given-names><![CDATA[Jame]]></given-names>
</name>
<name>
<surname><![CDATA[B.M.]]></surname>
<given-names><![CDATA[K.]]></given-names>
</name>
</person-group>
<source><![CDATA[IMPLEMENTATION OF A SIGMOID ACTIVATION FUNCTION FOR NEURAL NETWORK USING FPGA.]]></source>
<year>Abri</year>
<month>l </month>
<day>20</day>
<publisher-name><![CDATA[13th Scientific Conference of Al-Ma'moon University College]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B3">
<label>3</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Djalal Eddine Khodja]]></surname>
<given-names><![CDATA[A.K.]]></given-names>
</name>
<name>
<surname><![CDATA[Larbi]]></surname>
<given-names><![CDATA[Refoufi]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Sigmoid Function Approximation for ANN Implementation in FPGA Devices]]></article-title>
<source><![CDATA[Circuits, Systems, Electronics, Control & Signal Processing]]></source>
<year>2009</year>
</nlm-citation>
</ref>
<ref id="B4">
<label>4</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Djalal Eddine Khodja]]></surname>
<given-names><![CDATA[A.K.]]></given-names>
</name>
</person-group>
<person-group person-group-type="editor">
<name>
<surname><![CDATA[lzeboudjen]]></surname>
<given-names><![CDATA[N.]]></given-names>
</name>
<name>
</name>
<name>
<surname><![CDATA[Titri]]></surname>
<given-names><![CDATA[S.]]></given-names>
</name>
<name>
<surname><![CDATA[Boumeridja]]></surname>
<given-names><![CDATA[H.]]></given-names>
</name>
</person-group>
<source><![CDATA[Digital Implementation of Artificial Neural Networks: From VHDL Description to FPGA Implementation]]></source>
<year>2004</year>
</nlm-citation>
</ref>
<ref id="B5">
<label>5</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[TISAN]]></surname>
<given-names><![CDATA[A.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[DIGITAL IMPLEMENTATION OF THE SIGMOID FUNCTION FOR FPGA CIRCUITS]]></article-title>
<source><![CDATA[ACTA TECHNICA NAPOCENSIS Electronics and Telecommunications]]></source>
<year>2009</year>
<volume>50</volume>
<numero>2</numero>
<issue>2</issue>
<page-range>6</page-range></nlm-citation>
</ref>
<ref id="B6">
<label>6</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Myers]]></surname>
<given-names><![CDATA[D.J.]]></given-names>
</name>
<name>
<surname><![CDATA[R.A.]]></surname>
<given-names><![CDATA[Hutchinson]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Efficient Implementation of Piecewise Linear Activation Function for Digital VLSI Neural Networks]]></article-title>
<source><![CDATA[Electronics Letters]]></source>
<year>1989</year>
<volume>25</volume>
<numero>24</numero>
<issue>24</issue>
<page-range>16621663</page-range></nlm-citation>
</ref>
<ref id="B7">
<label>7</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Amin]]></surname>
<given-names><![CDATA[H.]]></given-names>
</name>
<name>
<surname><![CDATA[K.]]></surname>
<given-names><![CDATA[Curtis]]></given-names>
</name>
<name>
<surname><![CDATA[B.H.]]></surname>
<given-names><![CDATA[Gill]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Piecewise Linear Approximation applied to Non-Linear Function of a Neural Network]]></article-title>
<source><![CDATA[IEE Proceedings Circuits, Devices and Systems]]></source>
<year>1997</year>
<volume>144</volume>
<page-range>313 317</page-range></nlm-citation>
</ref>
<ref id="B8">
<label>8</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Vassiliadis]]></surname>
<given-names><![CDATA[S.]]></given-names>
</name>
<name>
<surname><![CDATA[Zhang]]></surname>
<given-names><![CDATA[M.]]></given-names>
</name>
<name>
<surname><![CDATA[Delgado-Frias]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Elementary Function Generators for Neural-Network Emulators]]></article-title>
<source><![CDATA[IEEE Transactions on Neural Networks]]></source>
<year>2000</year>
<volume>11</volume>
<numero>6</numero>
<issue>6</issue>
<page-range>1438 1449</page-range></nlm-citation>
</ref>
<ref id="B9">
<label>9</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Tommiska]]></surname>
<given-names><![CDATA[M.T.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Efûcient digital implementation of the sigmoid function for reprogrammable logic]]></article-title>
<source><![CDATA[Comput. Digit. Tech.]]></source>
<year>2003</year>
<volume>150</volume>
<numero>6</numero>
<issue>6</issue>
</nlm-citation>
</ref>
<ref id="B10">
<label>10</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Faiedh]]></surname>
<given-names><![CDATA[H.]]></given-names>
</name>
</person-group>
<source><![CDATA[Digital Hardware Implementation of a Neural System Used for Nonlinear Adaptive Prediction Journal of Computer Science]]></source>
<year>2006</year>
</nlm-citation>
</ref>
<ref id="B11">
<label>11</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Alippi]]></surname>
<given-names><![CDATA[C.]]></given-names>
</name>
<name>
<surname><![CDATA[G.]]></surname>
<given-names><![CDATA[StortiGajani]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Simple approximation of sigmoidal functions: realistic design of digital neural networks capable of learning]]></article-title>
<source><![CDATA[Proc. IEEE Int. Symp. on Circuits and Systems]]></source>
<year>1991</year>
<page-range>1505-1508</page-range><publisher-loc><![CDATA[Singapore ]]></publisher-loc>
</nlm-citation>
</ref>
<ref id="B12">
<label>12</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Zhang M.,]]></surname>
<given-names><![CDATA[V.a.D.-F.]]></given-names>
</name>
</person-group>
<source><![CDATA[Sigmoid generators for neural computing using piecewise approximations]]></source>
<year>1996</year>
<page-range>45</page-range></nlm-citation>
</ref>
<ref id="B13">
<label>13</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Daniel Larkin]]></surname>
<given-names><![CDATA[A.K.]]></given-names>
</name>
<name>
<surname><![CDATA[Valentin]]></surname>
<given-names><![CDATA[Muresan]]></given-names>
</name>
<name>
<surname><![CDATA[Noel]]></surname>
<given-names><![CDATA[O'Connor]]></given-names>
</name>
</person-group>
<source><![CDATA[An Efficient Hardware Architecture for a Neural Network Activation Function Generator]]></source>
<year>2008</year>
</nlm-citation>
</ref>
<ref id="B14">
<label>14</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Omondi AR]]></surname>
<given-names><![CDATA[R.J.]]></given-names>
</name>
</person-group>
<source><![CDATA[FPGA implementations of neural networks]]></source>
<year>2006</year>
<publisher-name><![CDATA[Springer]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B15">
<label>15</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Ligon III]]></surname>
<given-names><![CDATA[WB]]></given-names>
</name>
<name>
<surname><![CDATA[M.]]></surname>
<given-names><![CDATA[S.]]></given-names>
</name>
<name>
<surname><![CDATA[Monn]]></surname>
<given-names><![CDATA[G]]></given-names>
</name>
<name>
<surname><![CDATA[Schoonover]]></surname>
<given-names><![CDATA[K]]></given-names>
</name>
<name>
<surname><![CDATA[Stivers]]></surname>
<given-names><![CDATA[F]]></given-names>
</name>
<name>
<surname><![CDATA[Underwood]]></surname>
<given-names><![CDATA[KD]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[A Re-evaluation of the Practicality of Floating Point Operations on FPGAs.]]></article-title>
<source><![CDATA[IEEE Symposium on FPGAs for Custom Computing Machines]]></source>
<year>1998</year>
</nlm-citation>
</ref>
<ref id="B16">
<label>16</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Holt J,]]></surname>
<given-names><![CDATA[H.J.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Finite Precision Error Analysis of Neural Network Hardware Implementations]]></article-title>
<source><![CDATA[IEEE Transactions on Computers]]></source>
<year>1993</year>
<volume>42</volume>
<page-range>280 291</page-range></nlm-citation>
</ref>
</ref-list>
</back>
</article>
