劉毅飛
(湖北科技學(xué)院生物醫(yī)學(xué)工程學(xué)院,咸寧437100)
基于Python的sigmoid函數(shù)FPGA實(shí)現(xiàn)
劉毅飛
(湖北科技學(xué)院生物醫(yī)學(xué)工程學(xué)院,咸寧437100)
sigmoid函數(shù)是人工神經(jīng)網(wǎng)絡(luò)中通常采用的傳遞函數(shù),采用基于Python的軟硬件協(xié)同設(shè)計(jì)方法,在FPGA上實(shí)現(xiàn)了定點(diǎn)sigmoid函數(shù)。實(shí)驗(yàn)結(jié)果表明采用基于Python的軟硬件協(xié)同設(shè)計(jì)方法,可以利用Python上大量的包和模塊從而大幅度提高系統(tǒng)設(shè)計(jì)、仿真和校驗(yàn)的效率,并且能將軟件算法快速有效地轉(zhuǎn)換為硬件實(shí)現(xiàn),在整個(gè)軟硬件設(shè)計(jì)過(guò)程中僅采用Python語(yǔ)言,解決了當(dāng)前系統(tǒng)設(shè)計(jì)中軟硬件設(shè)計(jì)者分別采用不同設(shè)計(jì)語(yǔ)言存在的溝通問(wèn)題。
Python語(yǔ)言;現(xiàn)場(chǎng)可編程門陣列;sigmoid函數(shù);軟硬件協(xié)同設(shè)計(jì);神經(jīng)網(wǎng)絡(luò)
人工神經(jīng)網(wǎng)絡(luò)在模式識(shí)別、分類、人工智能領(lǐng)域有著廣泛應(yīng)用。在人工神經(jīng)網(wǎng)絡(luò)中,sigmoid函數(shù)是人工神經(jīng)網(wǎng)絡(luò)中常用的一種傳遞函數(shù),在嵌入式應(yīng)用中,sigmoid函數(shù)通常可以在DSP和FPGA上實(shí)現(xiàn)。FPGA作為一種可編程邏輯器件,具有功耗低、可以在上面實(shí)時(shí)實(shí)現(xiàn)大量的算法。目前在FPGA上面有許多神經(jīng)網(wǎng)絡(luò)和sigmoid函數(shù)的實(shí)現(xiàn)方案,在這些方案中普遍采用Verilog和VHDL語(yǔ)言進(jìn)行硬件設(shè)計(jì),而軟件設(shè)計(jì)通常采用其他高級(jí)語(yǔ)言比如C語(yǔ)言,Python語(yǔ)言等,由于這種設(shè)計(jì)方法硬件設(shè)計(jì)者和軟件設(shè)計(jì)者之間采用不同的設(shè)計(jì)語(yǔ)言,存在著仿真和校驗(yàn)效率低、軟硬件設(shè)計(jì)者之間溝通較為困難等問(wèn)題,而軟硬件協(xié)同設(shè)計(jì)方法在軟硬件設(shè)計(jì)過(guò)程中僅采用一種設(shè)計(jì)語(yǔ)言,具體到神經(jīng)網(wǎng)絡(luò)上比如采用SystemC[1],handle-C[2]等基于C語(yǔ)言的軟硬件協(xié)同設(shè)計(jì)語(yǔ)言。Python[3]是一種簡(jiǎn)單易學(xué)并且功能強(qiáng)大的編程語(yǔ)言,采用這種新的基于Python的軟硬件設(shè)計(jì)方法,可以通過(guò)Python擴(kuò)展包MyHDL[4]使其能支持硬件設(shè)計(jì)和仿真,并能夠在FPGA上快速實(shí)現(xiàn)人工神經(jīng)網(wǎng)絡(luò)中的sigmoid函數(shù)。
2.1 sigmoid的FPGA實(shí)現(xiàn)方法
在人工神經(jīng)網(wǎng)絡(luò)中,通常使用的一種sigmoid函數(shù)為log-sigmoid函數(shù),其公式如式(1)所示,函數(shù)f(x)的值域在(0,1)之間,
sigmoid的FPGA實(shí)現(xiàn)方法主要包括LUT查找表,分段線性逼近,高階逼近或泰勒級(jí)數(shù)展開[5-8]等。本文采用文獻(xiàn)[8]中描述的分段線性逼近方法,計(jì)算公式如式(2)
2.2 log-sigmoid定點(diǎn)數(shù)的格式表示
通常在FPGA上的數(shù)可以采用定點(diǎn)和浮點(diǎn)兩種方式來(lái)表示,由于定點(diǎn)的表示方式盡管設(shè)計(jì)較為復(fù)雜,但是速度較快,占用FPGA資源較小,通常采用定點(diǎn)來(lái)完成。本設(shè)計(jì)中輸入數(shù)x為9位定點(diǎn)數(shù),其中符號(hào)位1位,整數(shù)4位,小數(shù)4位;輸出y也為9位定點(diǎn)數(shù),符號(hào)位1位,整數(shù)1位,小數(shù)位7位。式(2)中的常數(shù)采用符號(hào)位1位,整數(shù)1位,小數(shù)位7位的表示方式。
2.3 Python軟硬件協(xié)同設(shè)計(jì)
基于Python的軟硬件協(xié)同設(shè)計(jì)過(guò)程如圖1所示[9],圖中Python的硬件設(shè)計(jì)部分采用MyHDL可綜合子集,最后使用MyHDL的toVerilog()方法將MyHDL設(shè)計(jì)自動(dòng)轉(zhuǎn)換為相應(yīng)的Verilog代碼,而Python硬件測(cè)試平臺(tái)可以使用任何Python語(yǔ)句從而支持復(fù)雜的仿真校驗(yàn)。另外MyHDL支持與Verilog混合仿真,設(shè)計(jì)的硬件測(cè)試平臺(tái)還可以用來(lái)作為轉(zhuǎn)換后的Verilog代碼測(cè)試平臺(tái),也就是測(cè)試平臺(tái)可以重用,不用重新編寫,仿真速度和設(shè)計(jì)效率大大提高。在仿真符合要求之后,就可以進(jìn)行FPGA設(shè)計(jì)流程后續(xù)的下載,綜合和測(cè)試工作。
3.1 實(shí)驗(yàn)環(huán)境
Python上存在大量的軟件包,模塊可以用來(lái)提高設(shè)計(jì)效率,實(shí)驗(yàn)用到的Python包包括:硬件設(shè)計(jì)和仿真使用MyHDL 0.8[10],繪圖使用matplotlib,定點(diǎn)設(shè)計(jì)采用fixedpoint,數(shù)值運(yùn)算采用numpy。波形查看工具為GTKWAVE,Python開發(fā)環(huán)境使用SPE(Stani’s Python Editor),所有的這些工具都是免費(fèi)的。FPGA器件采用altera公司CycloneII2C35F672C6,編譯綜合采用Quartus 12.1sp1 webpack。
圖1 基于Python軟硬件協(xié)同設(shè)計(jì)流程
3.2 仿真波形
在設(shè)計(jì)過(guò)程中生成的VCD仿真波形可以隨時(shí)采用GTKWAVE查看,可以便于校驗(yàn)設(shè)計(jì)是否正確,最終設(shè)計(jì)完成的sigmoid函數(shù)輸出的仿真模擬波形如圖2所示。
3.3 精度及誤差
由于整個(gè)過(guò)程采用Python設(shè)計(jì),Python存在大量的軟件包可以使用,來(lái)評(píng)估設(shè)計(jì)精度和繪制各種圖,采用matplotlib包繪制的MyHdl完成的sigmoid函數(shù)FPGA實(shí)現(xiàn)和numpy的sigmoid函數(shù)比較圖如圖3所示,函數(shù)輸入x在[-8,8]之間時(shí)的sigmoid函數(shù)FPGA實(shí)現(xiàn)誤差如圖4所示。
圖2 MyHDL的sigmoid實(shí)現(xiàn)的仿真波形
圖3 sigmoid函數(shù)的實(shí)現(xiàn)比較圖
圖4 MyHDL的sigmoid函數(shù)的FPGA實(shí)現(xiàn)的誤差圖
3.4 綜合結(jié)果
在仿真,校驗(yàn)和精度符合系統(tǒng)設(shè)計(jì)要求后,采用MyHdl包的toVerilog()方法將Python的sigmoid硬件描述自動(dòng)轉(zhuǎn)換為Verilog描述,另外MyHDL本身還支持與modelsim的協(xié)同仿真。使用modelsim仿真的波形如圖5所示,與圖2的Python環(huán)境下仿真波形相似,采用Quartus編譯綜合后FPGA資源使用情況為:使用125個(gè)LE,9個(gè)寄存器。
圖5 sigmoid函數(shù)的Modelsim仿真波形圖
采用一種新的基于Python的軟硬件協(xié)同設(shè)計(jì)方法,在FPGA上實(shí)現(xiàn)了在人工神經(jīng)網(wǎng)絡(luò)上廣泛使用的sigmoid函數(shù)。設(shè)計(jì)仿真過(guò)程使用Python語(yǔ)言擴(kuò)展包MyHDL及其他python包,使得仿真校驗(yàn)和傳統(tǒng)的設(shè)計(jì)方法相比效率更高,仿真速度也更快。從轉(zhuǎn)換后的硬件綜合結(jié)果可以看出,Python也具有較好的硬件描述能力,可以有效地完成硬件設(shè)計(jì)。
現(xiàn)代系統(tǒng)的算法越來(lái)越復(fù)雜,傳統(tǒng)的軟硬件設(shè)計(jì)分開的方法越來(lái)越不適應(yīng)市場(chǎng)對(duì)設(shè)計(jì)的要求。采用Python的軟硬件協(xié)同設(shè)計(jì)方法,軟硬件設(shè)計(jì)僅僅采用一種語(yǔ)言Python,軟硬件設(shè)計(jì)者之間不存在溝通問(wèn)題,另外仿真和校驗(yàn)的速度也會(huì)大大提高。所以采用基于Python的軟硬件協(xié)同設(shè)計(jì)方法設(shè)計(jì)效率大大提高,設(shè)計(jì)的產(chǎn)品能更快地進(jìn)入市場(chǎng)。
[1]Lettnin D,Braun A,Bodgan M,et al.Synthesis of Embedded SystemC Design:A Case Study of Digital Neural Networks[C].Proceedings of the Design,Automation and Test in Europe Conference and Exhibition Designers:IEEE,2004:248-253.
[2]Pandya V,Areibi S,Moussa M.A Handel-C Implementation of the Back-Propagation Algorithm On Field Programmable Gate Arrays[C].Proceedings of the 2005 International Conference on Reconfigurable Computing and FPGAs:IEEE,2005.
[3]Python Software Foundation.Python Documentation(Python 2.7)[EB/OL].[2013-6-10],http://www.python.org.
[4]Decaluwe J.MyHDL:a Python-Based Hardware Description Language[J].Linux Journal,2004,127(10):5.
[5]Tommiska M T.Efficient digital implementation of the sigmoid function for reprogrammable logic[C].IEEE Proceedings-Computers and Digital Techniques:IET,2003:403-411.
[6]Himavathi S,Anitha D,Muthuramalingam A.Feedforward Neural Network Implementation in FPGA Using Layer Multiplexing for Effective Resource Utilization[J].IEEE TRANSACTIONS ON NEURAL NETWORKS,2007,18(3):880-888.
[7]Namin,A.H.Leboeuf,K.Wu Huapeng Artificial neural networks activation function HDL coder[C].IEEE International Conference on Electro/Information Technology.Windsor,ON:IEEE,2009:389-392.
[8]Amin H,Curtis K M,Hayes-Gill B R.Piecewise linear approximation applied to nonlinear function of a neural network[C].IEEE Proceedings-Circuits,Devices and Systems:IET,1997:313-317.
[9]劉毅飛.基于Python的軟硬件協(xié)同設(shè)計(jì)方法[J].現(xiàn)代電子技術(shù),2013,36(8):76-78.
[10]Decaluwe J.MyHDLmanual[R].Decaluwe J.2013.5
FPGA Im p lementation of Sigmoid Function Based on Python
LIU Yi-fei
(School of Biomedical Engineering,Hubei University of Science and Technology,Xianning 437100,China)
Sigmoid is an activation function which is commonly used in the artificial neutral network.This paper implementes the sigmoid function on FPGA by using the software and hardware co-design methodology based on Python.The result shows that themethod can highly improve efficiency of system design,simulation and verification by using many python packages and modules,and it can quickly convert the software algorithm to its hardware implementation.During the software and hardware design,only python design language is used,so there is no gap between the hardware and software designers.
Python;FPGA;Sigmoid;Software-hardware co-design;Neutral network
10.3969/j.issn.1002-2279.2014.01.020
TN407
:A
:1002-2279(2014)01-0073-03
劉毅飛(1971-),男,湖北咸寧人,副教授,碩士,主研方向:嵌入式系統(tǒng)、醫(yī)學(xué)圖像處理與分析。
2013-03-15