文獻(xiàn)標(biāo)識(shí)碼: A
DOI:10.16157/j.issn.0258-7998.173486
中文引用格式: 周松江,李圣辰,劉明. 一種基于FPGA的低功耗高速解碼器設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2018,44(4):27-32.
英文引用格式: Zhou Songjiang,Li Shengchen,Liu Ming. A low power and high speed decoder design based on FPGA[J]. Application of Electronic Technique,2018,44(4):27-32.
0 引言
計(jì)算機(jī)處理多媒體或文字信息的基礎(chǔ)是對(duì)相關(guān)信息進(jìn)行編碼和解碼,以利于信息的傳輸、顯示和保護(hù)[1]。面對(duì)巨大信息量的處理需求,快速高效的編解碼系統(tǒng)能夠有效提高信息處理能力。近年來(lái),隨著神經(jīng)網(wǎng)絡(luò)的發(fā)展和應(yīng)用,利用神經(jīng)網(wǎng)絡(luò)進(jìn)行數(shù)學(xué)函數(shù)回歸的方案,為信息的編解碼提供了簡(jiǎn)單有效的途徑[2]。自編碼神經(jīng)網(wǎng)絡(luò)是一種無(wú)監(jiān)督的人工神經(jīng)網(wǎng)絡(luò),其利用反向傳播算法訓(xùn)練使得網(wǎng)絡(luò)的輸出值等于輸入值,從而為輸入數(shù)據(jù)學(xué)習(xí)到一種特征表示,廣泛應(yīng)用于圖像壓縮和數(shù)據(jù)降維等領(lǐng)域[3-4]。自編碼神經(jīng)網(wǎng)絡(luò)輸出等于輸入的特點(diǎn)適合用于數(shù)據(jù)編碼和解碼,相比于傳統(tǒng)的編解碼方法,如熵編碼[5],該算法更簡(jiǎn)潔高效,結(jié)構(gòu)可擴(kuò)展,實(shí)用性更強(qiáng)[3]。
而隨著編解碼器在一些低功耗、便攜式產(chǎn)品中的應(yīng)用,高速、高精度和低功耗已經(jīng)成為編解碼器的一種發(fā)展趨勢(shì)?,F(xiàn)場(chǎng)可編程門陣列(Field Programmable Gate Array,FPGA)是一種可編程邏輯器件,用戶可通過(guò)硬件描述語(yǔ)言完成硬件電路設(shè)計(jì)。FPGA內(nèi)部集成了具有高性能的數(shù)字信號(hào)處理器和大量存儲(chǔ)資源,可以高效低成本地實(shí)現(xiàn)定點(diǎn)運(yùn)算和數(shù)據(jù)存儲(chǔ),因此目前FPGA是一種理想的編解碼器實(shí)現(xiàn)平臺(tái)[5-6]。FPGA中各個(gè)硬件模塊并行執(zhí)行,可將計(jì)算量大的算法映射到FPGA中實(shí)現(xiàn)硬件加速。有學(xué)者嘗試采用FPGA作為神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)平臺(tái),并取得了優(yōu)異的性能,尤以速度和功耗突出[7-8]。綜上所述,基于自編碼神經(jīng)網(wǎng)絡(luò),以FPGA為實(shí)現(xiàn)平臺(tái)的編解碼系統(tǒng),具有靈活性高、高速、低功耗等特點(diǎn),可廣泛應(yīng)用于各種低功耗、便攜式應(yīng)用中。
本文通過(guò)分析自編碼神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)和特點(diǎn),提出了一種用于數(shù)據(jù)解碼的硬件實(shí)現(xiàn)架構(gòu)。根據(jù)網(wǎng)絡(luò)計(jì)算過(guò)程中包含的運(yùn)算和神經(jīng)元間的并行性特點(diǎn),結(jié)合FPGA高并行、低功耗和高速數(shù)據(jù)處理的優(yōu)勢(shì),將自編碼神經(jīng)網(wǎng)絡(luò)的解碼部分映射到FPGA中。該架構(gòu)具有速度快、功耗低等特點(diǎn),除文中論述的文字信息解碼外,該架構(gòu)具備擴(kuò)展到圖像編解碼的可能性。
1 自編碼神經(jīng)網(wǎng)絡(luò)
人工神經(jīng)網(wǎng)絡(luò)是基于生物神經(jīng)網(wǎng)絡(luò)的基本原理,通過(guò)模擬人腦神經(jīng)系統(tǒng)的結(jié)構(gòu)和功能而建立的一個(gè)數(shù)學(xué)模型,該模型擁有以任意精度逼近一個(gè)離散值、實(shí)數(shù)值或者目標(biāo)函數(shù)的功能[9-10]。自編碼神經(jīng)網(wǎng)絡(luò)是一種無(wú)監(jiān)督的人工神經(jīng)網(wǎng)絡(luò),其采用反向傳播算法,通過(guò)學(xué)習(xí)試圖使得網(wǎng)絡(luò)的輸出值等于輸入值,從而為輸入數(shù)據(jù)學(xué)習(xí)到一種特征表示[3-4]。
自編碼神經(jīng)網(wǎng)絡(luò)模型是一種對(duì)稱結(jié)構(gòu),中間為隱含層,輸入輸出層神經(jīng)元節(jié)點(diǎn)數(shù)相等且通過(guò)訓(xùn)練使得網(wǎng)絡(luò)輸出值和輸入值相等。如圖1所示為自編碼神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)圖,輸入層和輸出層含有m個(gè)神經(jīng)元,隱含層含有n個(gè)神經(jīng)元,輸入層和隱含層下方的“+1”是偏置節(jié)點(diǎn)。自編碼神經(jīng)網(wǎng)絡(luò)的輸入層到隱含層構(gòu)成編碼器,隱含層到輸出層構(gòu)成解碼器,對(duì)自編碼神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過(guò)程就是通過(guò)調(diào)整編碼器和解碼器中的權(quán)值和偏置,使其逼近一個(gè)恒等函數(shù),從而使得網(wǎng)絡(luò)輸出值等于輸入值,這樣網(wǎng)絡(luò)隱含層的輸出數(shù)據(jù)為原始輸入數(shù)據(jù)的另一種特征表示,即該數(shù)據(jù)經(jīng)過(guò)自編碼神經(jīng)網(wǎng)絡(luò)的解碼器可以恢復(fù)原始的輸入數(shù)據(jù)[11]。
在本文中,利用自編碼神經(jīng)網(wǎng)絡(luò)的編碼器對(duì)輸入數(shù)據(jù)進(jìn)行編碼,所得到隱含層的輸出數(shù)據(jù)稱為原始數(shù)據(jù)的編碼;該編碼數(shù)據(jù)經(jīng)過(guò)自編碼神經(jīng)網(wǎng)絡(luò)的解碼器實(shí)現(xiàn)數(shù)據(jù)解碼,從而恢復(fù)原始輸入數(shù)據(jù)。下面參照?qǐng)D1所示的自編碼神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),介紹自編碼神經(jīng)網(wǎng)絡(luò)的前向計(jì)算過(guò)程,首先計(jì)算隱含層n個(gè)神經(jīng)元的輸出如式(1):
輸出層m個(gè)神經(jīng)元的輸出如式(2):
通過(guò)對(duì)網(wǎng)絡(luò)前向計(jì)算過(guò)程式(1)和式(2)的分析可以看出:自編碼神經(jīng)網(wǎng)絡(luò)對(duì)信息的處理為從輸入層開(kāi)始,經(jīng)過(guò)隱含層直到輸出層輸出為止,每一層各個(gè)神經(jīng)元之間的計(jì)算具有獨(dú)立性和并行性;式(1)和式(2)的計(jì)算包括乘加運(yùn)算和激勵(lì)函數(shù)運(yùn)算,且兩者按照順序依次進(jìn)行。
2 FPGA設(shè)計(jì)方案
本章對(duì)基于FPGA的硬件解碼系統(tǒng)的設(shè)計(jì)需求進(jìn)行分析,介紹整個(gè)系統(tǒng)的硬件架構(gòu)設(shè)計(jì)、系統(tǒng)工作原理,最后對(duì)設(shè)計(jì)中的網(wǎng)絡(luò)計(jì)算模塊進(jìn)行詳細(xì)介紹。
2.1 系統(tǒng)分析
本文在FPGA中設(shè)計(jì)實(shí)現(xiàn)圖1所示自編碼神經(jīng)網(wǎng)絡(luò)的解碼器部分,從而實(shí)現(xiàn)數(shù)據(jù)解碼功能。在軟件端對(duì)自編碼神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,得到網(wǎng)絡(luò)模型后將對(duì)現(xiàn)今最通用的單字節(jié)編碼ASCII碼歸一化后的數(shù)據(jù)輸入至自編碼神經(jīng)網(wǎng)絡(luò)的編碼器以獲得編碼數(shù)據(jù),最后將編碼數(shù)據(jù)送至FPGA端實(shí)現(xiàn)數(shù)據(jù)解碼以恢復(fù)原始輸入的ASCII碼。
通過(guò)對(duì)自編碼神經(jīng)網(wǎng)絡(luò)前向計(jì)算的分析,其計(jì)算過(guò)程中包括乘加運(yùn)算和激勵(lì)函數(shù)運(yùn)算,網(wǎng)絡(luò)每層中各個(gè)神經(jīng)元之間的計(jì)算具有獨(dú)立性和并行性。而對(duì)編碼數(shù)據(jù)進(jìn)行解碼操作的過(guò)程中,要求所設(shè)計(jì)的硬件系統(tǒng)具有實(shí)時(shí)性特點(diǎn)。FPGA作為一個(gè)分布式并行處理系統(tǒng),其內(nèi)部包含大量邏輯單元和計(jì)算單元,且具有可編程、速度快、靈活性高、易配置、設(shè)計(jì)周期短等特點(diǎn),因此本文選用FPGA作為所設(shè)計(jì)數(shù)據(jù)解碼器的硬件實(shí)現(xiàn)平臺(tái)。
所設(shè)計(jì)的解碼器為圖1所示自編碼神經(jīng)網(wǎng)絡(luò)的隱含層到輸出層部分,其所包含的權(quán)值參數(shù)有n×m個(gè),偏置參數(shù)有m個(gè),n和m分別表示網(wǎng)絡(luò)隱含層和輸出層神經(jīng)元的個(gè)數(shù)。由于實(shí)現(xiàn)解碼功能僅需要網(wǎng)絡(luò)的前向計(jì)算,因此網(wǎng)絡(luò)的權(quán)值和偏置為固定值,所以在設(shè)計(jì)中可利用FPGA內(nèi)部資源對(duì)網(wǎng)絡(luò)權(quán)值和偏置進(jìn)行存儲(chǔ)并以固定值的形式參與網(wǎng)絡(luò)運(yùn)算。
解碼器一次完整的解碼過(guò)程可簡(jiǎn)述為:輸入數(shù)據(jù)→解碼計(jì)算→輸出結(jié)果。在實(shí)際應(yīng)用中往往包含有多組編碼數(shù)據(jù),因此設(shè)計(jì)中將編碼數(shù)據(jù)存儲(chǔ)在外部存儲(chǔ)器中以供FPGA讀取。SD存儲(chǔ)卡是一種基于半導(dǎo)體快閃記憶器的新一代記憶設(shè)備,由于它具有體積小、數(shù)據(jù)傳輸快、可熱插拔等優(yōu)良特性,被廣泛應(yīng)用于便攜式設(shè)備中[13]。因此本設(shè)計(jì)選擇使用SD卡來(lái)存儲(chǔ)編碼數(shù)據(jù)。SD卡讀操作為每次讀取一個(gè)扇區(qū)的數(shù)據(jù),而網(wǎng)絡(luò)計(jì)算模塊的輸入數(shù)據(jù)的個(gè)數(shù)與圖1所示隱含層神經(jīng)元個(gè)數(shù)相同,兩個(gè)數(shù)據(jù)量并不匹配。另外,SD卡讀數(shù)據(jù)操作和網(wǎng)絡(luò)計(jì)算為異步關(guān)系,因此本設(shè)計(jì)中加入FIFO模塊,作為SD卡讀數(shù)據(jù)模塊和網(wǎng)絡(luò)計(jì)算模塊兩個(gè)異步模塊之間的數(shù)據(jù)緩存器,這樣的設(shè)計(jì)也易于擴(kuò)展到其他不同神經(jīng)元數(shù)量的網(wǎng)絡(luò)結(jié)構(gòu)。
另外,為了便于人為控制對(duì)多組編碼數(shù)據(jù)進(jìn)行解碼,系統(tǒng)設(shè)計(jì)中利用按鍵來(lái)產(chǎn)生一次解碼操作的起始信號(hào)。本設(shè)計(jì)是以ASCII碼的編碼和解碼對(duì)系統(tǒng)進(jìn)行測(cè)試,因此設(shè)計(jì)中采用專門顯示字母、數(shù)字和符號(hào)等的工業(yè)字符型液晶LCD1602顯示解碼結(jié)果。最后為了增加FPGA硬件系統(tǒng)穩(wěn)定性,減少系統(tǒng)時(shí)鐘的抖動(dòng)和傾斜,設(shè)計(jì)中增加混合模式時(shí)鐘管理器(MMCM),用于在與輸入時(shí)鐘信號(hào)有設(shè)定的相位和頻率關(guān)系的情況下,生成不同的時(shí)鐘信號(hào),該信號(hào)用于各個(gè)模塊工作。
2.2 硬件系統(tǒng)架構(gòu)
基于上述分析,所設(shè)計(jì)FPGA硬件系統(tǒng)結(jié)構(gòu)如圖2所示。系統(tǒng)外圍模塊包括存儲(chǔ)編碼數(shù)據(jù)的SD卡,產(chǎn)生差分時(shí)鐘信號(hào)的晶振,產(chǎn)生復(fù)位信號(hào)和控制系統(tǒng)工作的按鍵,和顯示網(wǎng)絡(luò)計(jì)算結(jié)果的LCD1602顯示器。FPGA內(nèi)部包含三大模塊,分別是:數(shù)據(jù)加載模塊、數(shù)據(jù)處理模塊和混合模式時(shí)鐘管理器。
設(shè)計(jì)中利用SD卡來(lái)存儲(chǔ)編碼數(shù)據(jù),對(duì)SD卡的操作采用簡(jiǎn)單的命令/響應(yīng)協(xié)議[13],全部命令由FPGA發(fā)起,SD卡接收到命令后返回響應(yīng)數(shù)據(jù)。要讀取SD卡中的數(shù)據(jù),需要首先完成SD卡的初始化,該系統(tǒng)按照功能分別設(shè)計(jì)SD卡初始化模塊和SD卡讀數(shù)據(jù)模塊,其符合FPGA模塊化的設(shè)計(jì)原則。FIFO模塊作為SD卡和網(wǎng)絡(luò)計(jì)算模塊之間的數(shù)據(jù)緩存器,同時(shí)又用于異步數(shù)據(jù)傳輸,因此在設(shè)計(jì)中采用獨(dú)立的讀時(shí)鐘和寫時(shí)鐘,以用于異步操作。
按鍵檢測(cè)模塊不斷讀取外部按鍵輸出信號(hào)key_in的值,當(dāng)檢測(cè)到按鍵按下時(shí)該模塊產(chǎn)生一個(gè)高脈沖信號(hào),該信號(hào)將作為一次解碼操作的起始信號(hào)。網(wǎng)絡(luò)計(jì)算模塊按照神經(jīng)網(wǎng)絡(luò)的計(jì)算方法對(duì)讀入的數(shù)據(jù)進(jìn)行計(jì)算。顯示驅(qū)動(dòng)模塊設(shè)計(jì)中采用有限狀態(tài)機(jī)的方式控制LCD1602的初始化和數(shù)據(jù)顯示操作,該模塊與網(wǎng)絡(luò)計(jì)算模塊之間有信號(hào)線連接,以實(shí)現(xiàn)將計(jì)算結(jié)果送至顯示驅(qū)動(dòng)模塊,顯示驅(qū)動(dòng)模塊控制LCD1602對(duì)計(jì)算結(jié)果進(jìn)行顯示。
在圖2所示的硬件架構(gòu)圖中,混合模式時(shí)鐘管理器將外部時(shí)鐘分頻產(chǎn)生各個(gè)模塊工作所需要的時(shí)鐘信號(hào),其通過(guò)兩個(gè)時(shí)鐘線分別與數(shù)據(jù)加載模塊和數(shù)據(jù)處理模塊連接,而數(shù)據(jù)加載模塊和數(shù)據(jù)處理模塊之間通過(guò)data_en、data和read_clk 3個(gè)信號(hào)連接。
2.3 系統(tǒng)工作原理
FPGA的特點(diǎn)是可以實(shí)現(xiàn)并行操作,在圖2所示的系統(tǒng)架構(gòu)圖中,數(shù)據(jù)加載模塊和數(shù)據(jù)處理模塊以并行異步的方式工作,下面對(duì)其工作原理分別介紹。
數(shù)據(jù)加載模塊:系統(tǒng)上電后,數(shù)據(jù)加載模塊首先控制SD卡初始化模塊對(duì)SD卡進(jìn)行初始化,其初始化操作包含有一系列的命令,在初始化完成后SD卡初始化模塊輸出初始化完成信號(hào)。由于SD卡中的編碼數(shù)據(jù)是在PC端以FAT32文件系統(tǒng)的形式寫入的,因此在對(duì)SD卡初始化完成后,數(shù)據(jù)加載模塊控制SD卡讀數(shù)據(jù)模塊讀取SD卡中的FAT32文件系統(tǒng)信息,獲取編碼數(shù)據(jù)的長(zhǎng)度,即文件所包含的字節(jié)數(shù),該數(shù)據(jù)將用于控制對(duì)編碼數(shù)據(jù)的讀取。最后,數(shù)據(jù)加載模塊不斷檢測(cè)FIFO中緩存數(shù)據(jù)的數(shù)量,當(dāng)數(shù)據(jù)的數(shù)量不足設(shè)定值時(shí)便控制SD卡讀數(shù)據(jù)模塊將SD卡中的編碼數(shù)據(jù)讀入FIFO中進(jìn)行緩存。
數(shù)據(jù)處理模塊:當(dāng)按鍵檢測(cè)模塊檢測(cè)到外部按鍵被按下時(shí)會(huì)產(chǎn)生一個(gè)高脈沖信號(hào),然后數(shù)據(jù)處理模塊會(huì)通過(guò)data_en、data和read_clk 3個(gè)信號(hào)從FIFO中讀取數(shù)據(jù)到網(wǎng)絡(luò)計(jì)算模塊進(jìn)行計(jì)算,然后通過(guò)顯示驅(qū)動(dòng)模塊控制將計(jì)算結(jié)果顯示在外部的LCD1602上。數(shù)據(jù)加載模塊和數(shù)據(jù)處理模塊之間data_en、data和read_clk 3個(gè)信號(hào)的時(shí)序關(guān)系如圖3所示,當(dāng)data_en為高電平時(shí),代表FIFO中存在有效的數(shù)據(jù)可以讀取,此時(shí)每當(dāng)read_clk信號(hào)的上升沿到達(dá)時(shí),從data端口可以讀取一個(gè)數(shù)據(jù)。
如圖4所示為FPGA硬件系統(tǒng)工作流程圖,其中SD卡讀操作和網(wǎng)絡(luò)計(jì)算之間為異步關(guān)系,系統(tǒng)中所加入的FIFO模塊作為SD卡讀數(shù)據(jù)模塊和網(wǎng)絡(luò)計(jì)算模塊兩個(gè)異步模塊之間的數(shù)據(jù)緩存器。
2.4 網(wǎng)絡(luò)計(jì)算模塊設(shè)計(jì)
網(wǎng)絡(luò)計(jì)算模塊是本設(shè)計(jì)中的核心模塊,用于實(shí)現(xiàn)圖1中的解碼器,將編碼數(shù)據(jù)和解碼器部分的權(quán)值與偏置按式(2)進(jìn)行乘加運(yùn)算,并經(jīng)過(guò)激勵(lì)函數(shù)得到輸出值。
通過(guò)對(duì)網(wǎng)絡(luò)前向計(jì)算分析可知其包括乘加運(yùn)算和激勵(lì)函數(shù)運(yùn)算。由于本設(shè)計(jì)中自編碼神經(jīng)網(wǎng)絡(luò)的輸入是對(duì)ASCII碼歸一化后的數(shù)據(jù),即原ASCII碼值除以128后的值,因此在FPGA模塊中激勵(lì)函數(shù)的輸出值需要擴(kuò)大128倍才是真正的ASCII碼值。由于128=27,在FPGA中乘操作可通過(guò)移位實(shí)現(xiàn),因此對(duì)計(jì)算結(jié)果擴(kuò)大128倍相當(dāng)于將二進(jìn)制格式的小數(shù)點(diǎn)右移7位。更進(jìn)一步,直接截取小數(shù)點(diǎn)后7位即為計(jì)算結(jié)果擴(kuò)大128倍后的ASCII碼值。因此在網(wǎng)絡(luò)計(jì)算模塊將計(jì)算分為3部分:乘加運(yùn)算、激勵(lì)函數(shù)運(yùn)算和截位運(yùn)算,如圖5所示為一個(gè)輸出層神經(jīng)元的計(jì)算結(jié)構(gòu)示意圖,輸出層各個(gè)神經(jīng)元按照?qǐng)D5所示的計(jì)算結(jié)構(gòu)以并行、獨(dú)立的方式進(jìn)行計(jì)算。
模塊中的乘加運(yùn)算是將編碼數(shù)據(jù)、解碼器部分權(quán)值和偏置按照式(2)中激勵(lì)函數(shù)內(nèi)部的乘加運(yùn)算規(guī)則進(jìn)行計(jì)算。本設(shè)計(jì)輸出層神經(jīng)元的激勵(lì)函數(shù)為hard_sigmoid函數(shù)[12],表達(dá)式為式(3):
根據(jù)定義,hard_sigmoid函數(shù)為分段函數(shù),且各段均為線性關(guān)系,其非常便于在FPGA系統(tǒng)中實(shí)現(xiàn),即利用條件判斷語(yǔ)句對(duì)輸入進(jìn)行判斷并輸出不同的值,如圖6所示為hard_sigmoid函數(shù)硬件實(shí)現(xiàn)示意圖。
3 系統(tǒng)測(cè)試分析
為了測(cè)試所設(shè)計(jì)自編碼神經(jīng)網(wǎng)絡(luò)在FPGA平臺(tái)上的實(shí)現(xiàn),本文選擇的網(wǎng)絡(luò)結(jié)構(gòu)為輸入層、輸出層含有4個(gè)神經(jīng)元節(jié)點(diǎn),隱含層含有8個(gè)神經(jīng)元節(jié)點(diǎn)。所選擇的應(yīng)用背景為對(duì)ASCII碼的編碼和解碼,其中軟件端完成對(duì)ASCII碼的編碼,所得到的編碼數(shù)據(jù)在FPGA端實(shí)現(xiàn)解碼。
本實(shí)驗(yàn)測(cè)試集由軟件生成,軟件環(huán)境下對(duì)ASCII碼中非控制字符(碼值為32~127,共96個(gè))做歸一化處理,然后按照隨機(jī)組合的方式4個(gè)一組輸入至所設(shè)計(jì)的自編碼神經(jīng)網(wǎng)絡(luò)并獲得隱含層的輸出,將該輸出作為FPGA的測(cè)試輸入數(shù)據(jù)保存在SD卡中。所選擇的FPGA硬件平臺(tái)是Xilinx VC707 FPGA開(kāi)發(fā)板,系統(tǒng)開(kāi)發(fā)環(huán)境為Xilinx ISE 14.7,仿真環(huán)境為ModelSim SE 10.1c,如圖7所示為硬件系統(tǒng)測(cè)試圖。
在圖7所示的硬件系統(tǒng)測(cè)試圖中,①為SD卡,②為L(zhǎng)CD1602顯示屏,③為控制按鍵。系統(tǒng)上電后,通過(guò)控制按鍵的按下操作不斷從SD卡中讀取數(shù)據(jù),經(jīng)過(guò)網(wǎng)絡(luò)計(jì)算模塊計(jì)算后將結(jié)果顯示在LCD1602顯示屏上,每次顯示4個(gè)字符,如圖7中LCD1602顯示屏的第二行即為解碼后的4個(gè)數(shù)據(jù),對(duì)應(yīng)于圖1所示神經(jīng)網(wǎng)絡(luò)的4個(gè)輸出。
3.1 網(wǎng)絡(luò)計(jì)算結(jié)果分析
神經(jīng)網(wǎng)絡(luò)經(jīng)過(guò)訓(xùn)練得到一組最優(yōu)參數(shù),包括網(wǎng)絡(luò)權(quán)值和偏置。為了在FPGA中實(shí)現(xiàn)所設(shè)計(jì)自編碼神經(jīng)網(wǎng)絡(luò)的解碼器部分,需要獲取對(duì)ASCII碼編碼后的數(shù)據(jù)(神經(jīng)網(wǎng)絡(luò)隱含層的輸出數(shù)據(jù))和解碼器部分的網(wǎng)絡(luò)權(quán)值與偏置。另外由于FPGA僅能對(duì)二進(jìn)制數(shù)據(jù)識(shí)別和計(jì)算,因此需要將上述數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)。
在FPGA設(shè)計(jì)中,數(shù)據(jù)的表示方式與FPGA邏輯資源消耗直接相關(guān)的。數(shù)據(jù)表示位數(shù)越多,數(shù)據(jù)精度越高,邏輯資源的消耗也就越多,因此在FPGA設(shè)計(jì)中需要權(quán)衡FPGA資源消耗和數(shù)據(jù)精度之間的關(guān)系。結(jié)合本文的實(shí)際應(yīng)用,同時(shí)為了更好地權(quán)衡FPGA設(shè)計(jì)中的精度、資源占用和功耗,本設(shè)計(jì)采用定點(diǎn)數(shù)表示上述數(shù)據(jù)。
由于在FPGA設(shè)計(jì)中采用有限位定點(diǎn)數(shù)來(lái)表示數(shù)據(jù)時(shí),對(duì)原數(shù)據(jù)進(jìn)行定點(diǎn)量化的過(guò)程中會(huì)因?yàn)閿?shù)據(jù)的截?cái)喽a(chǎn)生誤差。根據(jù)網(wǎng)絡(luò)計(jì)算模塊的設(shè)計(jì),其輸出為計(jì)算結(jié)果二進(jìn)制小數(shù)點(diǎn)后7位,因此在設(shè)計(jì)中需要保證這7位數(shù)據(jù)正確,即與原始輸入數(shù)據(jù)相比,經(jīng)過(guò)解碼后輸出結(jié)果的誤差需要小于2-7,即應(yīng)小于7.812 5×10-3。本文利用MATLAB下的Fixed Point Toolbox對(duì)數(shù)據(jù)進(jìn)行量化,然后分析本設(shè)計(jì)中數(shù)據(jù)不同的量化位數(shù)對(duì)計(jì)算結(jié)果誤差的影響,如圖8所示為定點(diǎn)數(shù)表示中小數(shù)點(diǎn)的位數(shù)和最大誤差之間的關(guān)系。
從圖8可以看出:
(1)隨著定點(diǎn)數(shù)小數(shù)位數(shù)的增加,最大誤差值不斷降低,即數(shù)據(jù)精度越來(lái)越高;
(2)定點(diǎn)數(shù)小數(shù)位變?yōu)?2位之后,其最大誤差基本保持不變;
(3)定點(diǎn)數(shù)小數(shù)位為9位時(shí),其最大誤差與7.812 5×10-3基本一致;定點(diǎn)數(shù)小數(shù)位為10位時(shí),其最大誤差已符合小于7.812 5×10-3的要求。
基于圖8所示的分析結(jié)果,本文在對(duì)設(shè)計(jì)中的網(wǎng)絡(luò)權(quán)值、偏置和編碼數(shù)據(jù)進(jìn)行定點(diǎn)數(shù)量化時(shí),小數(shù)位均設(shè)計(jì)為10位。進(jìn)一步通過(guò)對(duì)網(wǎng)絡(luò)的權(quán)值、偏置和編碼數(shù)據(jù)的大小范圍進(jìn)行分析可以確定其整數(shù)位的位數(shù),3種數(shù)據(jù)的二進(jìn)制定點(diǎn)數(shù)格式如表1所示。
本設(shè)計(jì)在ModelSim環(huán)境下對(duì)網(wǎng)絡(luò)計(jì)算模塊進(jìn)行仿真,并對(duì)模塊輸出的計(jì)算結(jié)果與軟件中的原始輸入數(shù)據(jù)進(jìn)行分析比對(duì),所測(cè)試數(shù)據(jù)中的絕對(duì)誤差最大值小于7.812 5×10-3,符合設(shè)計(jì)中的誤差要求。另外通過(guò)硬件實(shí)測(cè),所有被編碼后的數(shù)據(jù)經(jīng)過(guò)FPGA計(jì)算后均被正確解碼,并將結(jié)果顯示在LCD1602上,即所設(shè)計(jì)的FPGA硬件系統(tǒng)正確地完成了解碼功能,從而驗(yàn)證了對(duì)所設(shè)計(jì)網(wǎng)絡(luò)計(jì)算模塊的誤差分析。
3.2 系統(tǒng)性能分析
如表2所示為Xilinx ISE對(duì)系統(tǒng)工程綜合實(shí)現(xiàn)后列出的主要資源占用情況??梢钥闯?,DSP資源占用較大,主要原因是網(wǎng)絡(luò)計(jì)算模塊中的乘加計(jì)算和激勵(lì)函數(shù)運(yùn)算均含有定點(diǎn)數(shù)乘法和加法操作,因此會(huì)占用較多的DSP資源。另外,BRAM資源的占用主要來(lái)自于FIFO模塊的實(shí)現(xiàn)和網(wǎng)絡(luò)計(jì)算模塊中網(wǎng)絡(luò)權(quán)值與偏置的存儲(chǔ)。
如表3所示為FPGA硬件實(shí)現(xiàn)數(shù)據(jù)解碼的速度和軟件解碼速度的比較,軟件解碼是在MATLAB軟件中測(cè)試所得,CPU為Intel Core i7,主頻為2.5 GHz。FPGA硬件解碼速度是通過(guò)在FPGA中設(shè)置計(jì)數(shù)器,對(duì)從讀取解碼器輸入數(shù)據(jù)到最后輸出結(jié)果的時(shí)鐘進(jìn)行計(jì)數(shù),然后利用ChipScope工具查看計(jì)數(shù)值來(lái)計(jì)算工作時(shí)間。表3中的結(jié)果顯示,相比于CPU軟件解碼,本文所設(shè)計(jì)的FPGA硬件解碼器加速了7倍以上。
通過(guò)Xilinx ISE自帶的XPower工具可以得到FPGA的運(yùn)行功耗大致為0.389 W,所設(shè)計(jì)系統(tǒng)的外圍設(shè)備中LCD1602功耗大致為0.693 W,其余外設(shè)的功耗可忽略不計(jì),因此整個(gè)系統(tǒng)總功耗為1 W左右。而相比之下,Intel Core i7-6500U主頻為2.5 GHz的CPU的功耗可高達(dá)65 W,可見(jiàn)本系統(tǒng)功耗僅為通用CPU的1.5%,因此特別適合將本文所設(shè)計(jì)的基于FPGA的解碼器應(yīng)用于低功耗便攜式設(shè)備中。
4 結(jié)論
利用神經(jīng)網(wǎng)絡(luò)所具有的輸入輸出之間的映射關(guān)系,可以簡(jiǎn)單高效地實(shí)現(xiàn)數(shù)據(jù)編碼和解碼。本文根據(jù)自編碼神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)和特點(diǎn),將其用于編碼和解碼,并在FPGA中實(shí)現(xiàn)自編碼神經(jīng)網(wǎng)絡(luò)的解碼器部分。通過(guò)對(duì)軟件算法的設(shè)計(jì)和網(wǎng)絡(luò)計(jì)算過(guò)程的分析,按照功能和需求對(duì)FPGA模塊進(jìn)行設(shè)計(jì)。利用ModelSim軟件對(duì)所設(shè)計(jì)的各個(gè)FPGA模塊進(jìn)行仿真驗(yàn)證,利用Xilinx ISE對(duì)整個(gè)工程進(jìn)行設(shè)計(jì)、綜合和實(shí)現(xiàn),并將編程文件下載至Xilinx VC707 FPGA開(kāi)發(fā)板中進(jìn)行驗(yàn)證,同時(shí)對(duì)FPGA系統(tǒng)的資源占用、計(jì)算速度和功耗進(jìn)行評(píng)估。通過(guò)測(cè)試,對(duì)于在軟件中經(jīng)過(guò)編碼的數(shù)據(jù),在FPGA系統(tǒng)中可以正確解碼。同時(shí)相比于通用CPU,該系統(tǒng)計(jì)算過(guò)程加速了7倍以上,而運(yùn)行功耗僅為CPU的1.5%,因此具有速度快、功耗低的特點(diǎn),特別適合將其應(yīng)用于實(shí)時(shí)性、低功耗便攜式設(shè)備中。
參考文獻(xiàn)
[1] 曹雪虹,張宗橙.信息論與編碼[M].北京:清華大學(xué)出版社,2016.
[2] 張定會(huì),李敬紅,左小五.神經(jīng)網(wǎng)絡(luò)編碼和解碼[C].全國(guó)青年通信學(xué)術(shù)會(huì)議.2002.
[3] 王雅思.深度學(xué)習(xí)中的自編碼器的表達(dá)能力研究[D].哈爾濱:哈爾濱工業(yè)大學(xué),2014.
[4] 李時(shí)峰.基于自編碼神經(jīng)網(wǎng)絡(luò)文本特征選擇的研究[D].天津:天津科技大學(xué),2016.
[5] 白玉婷,張剛.AVS熵編碼的FPGA實(shí)現(xiàn)[J].軟件,2012,33(2):102-104,156.
[6] 陳章進(jìn),鐘國(guó)海,畢卓.一種基于低成本FPGA的高速8B/10B編解碼器設(shè)計(jì)[J].微計(jì)算機(jī)信息,2012,28(10):189-190,480.
[7] Li Huimin,F(xiàn)an Xitian,Jiao Li,et al.A high performance FPGA-based accelerator for large-scale convolutional neural networks[C].Field Programmable Logic and Applications(FPL),2016 26th International Conference on.IEEE,2016:1-9.
[8] NURVITADHI E,VENKATESH G,SIM J,et al.Can FPGAs beat GPUs in accelerating next-generation deep neural networks?[C].Proceedings of the 2017 ACM/SIGDA International Symposium on Field-Programmable Gate Arrays.ACM:5-14.
[9] CYBENKO G.Approximation by superpositions of a sigmoidal function[J].Mathematics of Control,Signals,and Systems(MCSS),1989,2(4):303-314.
[10] BENGIO Y.Learning deep architectures for AI[J].Foundations and trends? in Machine Learning,2009,2(1):1-127.
[11] 魯亞平.面向深度網(wǎng)絡(luò)的自編碼器研究[D].蘇州:蘇州大學(xué),2016.
[12] Tensorflow.hard_sigmoid definition[EB/OL].[2017-07-26].https://www.tensorflow.org/api_docs/python/tf/contrib/keras/backend/hard_sigmoid.
[13] 張鋒,潘冀寧,朱振榮.基于SPI模式的Micro SD卡驅(qū)動(dòng)設(shè)計(jì)與驗(yàn)證[J].通訊世界,2017(12):3-4.
作者信息:
周松江,李圣辰,劉 明
(北京郵電大學(xué) 信息光子學(xué)與光通信研究院,北京100876)