引言卷積佔據了cnn網路中絕大部分運算,進行乘法運算通常都是使用fpga中的dsp,這樣算力就受到了器件中dsp資源的限制。比如在zynq7000器件中,dsp資源就較少,神經網路的效能就無法得到提公升。利用xilinx器件中lut的結構特徵,設計出的乘法器不但能靈活適應資料位寬,而且能最大限度降低lut資源使用。
01
xilinx ultrascale器件lut結構
在這裡簡要介紹一下ultrascale系列器件中的lut結構,有助於後邊對乘法器設計思路的理解。clb(configuratble logic block)是主要的資源模組,其包含了8個lut,16個暫存器,carry邏輯,以及多路選通器等。其中lut可以用作6輸入1輸出,或者兩個5輸入lut,但是這兩個lut公用輸入,具有不同輸出。每個lut輸出可以連線到暫存器或者鎖存器,或者從clb輸出。lut可以用於64x1和32x2的分布式ram,乙個clb內最大可以支援512x1大小的ram。ram的讀寫位址和輸入的讀寫資料是共享的,資料通道可以使用x和i介面。lut還可以配置用於4:1選通器,clb最大能夠支援到32:1的選通器。clb中的carry邏輯含有異或門和產生進製的門,用於生成進製資料。
圖1.1 lut結構
lut還可以被動態配置成32bit移位暫存器,這個功能在乘法器設計中可以用於改變乘法器的乘數和被乘數。在寫入lut資料的時候,每個時鐘週期從d介面進入資料,依次寫入32bit資料。讀資料的時候,可以通過位址來定位任何32bit中的資料。這樣就可以配置成任何小於32bit的移位暫存器。移位輸出q31可以進入下一級lut用於串聯產生更大移位暫存器。在乙個clb中最大可以串聯產生256bit移位暫存器。
圖1.2 移位暫存器配置
02
lut乘法器原理
首先假設我們處理整數乘法,小數乘法也可以用這樣的方法。基本思想就是將m bit大小的資料進行分割表示:
其中0<=di<2^q。乘以乙個常數k:
這樣就將兩個資料乘法分解成低bit資料乘法,結果是乙個常數k和di相乘,然後再進行移位求和。m bit資料分解後的低bit資料位寬通常都適配lut輸入寬度,這樣能最大利用lut資源。現在乘法只有k*di,由於bit位寬較小,這部分可以用lut查詢表的形式來。預先將0k到(2^q-1)k的資料儲存到lut中,然後通過di來選擇對應的資料。如果是負數乘法,那麼資料使用補碼表示,那麼lut中儲存的資料是從-2^(q-1)k到(2^(q-1)-1)k。針對以上介紹的ultrascale器件的lut6,q可以選擇為5。但是在本**中使用的是lut4器件,其只有4輸入,因此選擇了q=3,為什麼沒有選擇4呢?另外1bit是為了用於半加器的實現。
03
基本結構
實現上述累加的方法有很多種,**中採用了進製鏈加法器。圖2.1中是m bit和n bit資料乘法,每個e結構計算di*k,並且和上乙個結構求和,輸出的低3bit直接作為最終結果,而n bit傳輸到下一級進行計算。q=3的計算單元e有[m/3]個。k*di是有n+3bit的查詢表實現的。查詢表的結果由di選擇,然後再通過乙個求和器和之前資料求和。這是乙個最基本的結構,**又針對這個結構做了優化,用乙個lut同時實現了乙個查詢表和半加器。具體來講,其中3bit輸入用於di,還有1bit用於上一次輸出,lut中存放資料是di*k和上一次結果第j bit的半加結果,實際上是第j bit資料lut中結果的異或。而進製資料由clb中相應的carry邏輯來計算。相比於粗暴的進行資料求和,這樣精確的來控制lut能夠大大節省資源。
圖2.1 基本結構
圖2.2 lut實現乘法和半加,外圍carry邏輯實現進製
04
動態配置lut內容
xilinx的lut結構允許在執行過程中改變lut中的內容,這樣的乘法器就能改變被乘數據k。這可以實現在神經網路計算中需要更新權重引數。**中使用的是lut4,所以乙個lut可以被配置成16bit移位暫存器。通過這16bit暫存器可以來配置lut中的內容,每個時鐘週期更新1bit資料,16個時鐘週期可以完成乙個lut中資料更新。是否進行lut內容更新通過ce使能訊號控制。
如何產生lut中資料的值呢?如果上一次輸出資料對應bit為0,那麼lut中就存放0*k到7*k的值,如果上一次對應bit為1,那麼存放值為對以上資料取反。圖4.1表示了獲得lut中內容的電路圖。首先資料被初始化為0*k,下一次對應著求和進製為1的情況,取反,然後再加k得到1*k的值,這樣每隔兩個時鐘週期就得到下乙個乘法的資料值,依次對lut進行更新。上述中針對的是正整數,如果對於負數乘法更新,可以在上述求整數乘法的電路基礎上做一下改進,如圖4.2。當最高位為0的時候,輸出結果就是之前求得的乘法結果。如果最高位是1,那麼負數的補碼表示是乘法的原碼結果減去最高位數值。
圖4.1 lut中內容更新電路圖
圖4.2 負數乘法結果更新電路
05
結果分析
最後我們來看看這種乘法器的實現效果,圖5.1表示對多級進製不適用pipeline結構的時鐘頻率隨著被乘數k位寬變化,可以看到隨著級數e的增加,頻率降低很多,這主要是進製鏈邊長導致。而隨著k位寬增加,頻率也有降低,這主要是因為實現di*k乘法的lut資源增加導致。
圖5.1 沒有pipeline下頻率mhz
圖5.2是不同乘法位寬下的使用slice數量。**中考慮了兩種極端情況,一種是完全pipeline下,即每級計算單元都經過暫存器,另外一種是完全沒有pipeline,所有級e都是串聯。
圖5.2 slice資源
結論上述通過lut來設計乘法器的方法,可以應用於cnn中的卷積運算當中,因為權重可以被當做被乘數,用於lut內容的配置,在更換權重時,可以對lut內容更新,這樣就能避免了dsp資源的限制,不失為一種增加算力的方法。
文獻1. hormigo, j.c., gabriel oliver, juan p.boemo, eduardo, self-reconfigurable constant multiplier for fpga. acm transactions on reconfigurable technology and systems, 2013. 6
往期回顧
1. 可變位寬的大規模矩陣乘法
2. 脈動陣列
3. 在dnn中fpga做了什麼?
移位暫存器示例
這裡的移位暫存器不是簡單的向左移位將序列輸入轉換為並行輸出,而且要保留最後乙個週期的輸入數作為下一次輸出的最高位,如下所示 module shift reg clk,rst,din,dout ordy input clk input rst input 7 0 din output 31 0 dou...
左移暫存器vhdl 移位暫存器的VHDL設計
系部 計算機與資訊工程系 班級學號 姓名課程名稱 pld原理與應用 實驗日期 2012.10.31 實驗名稱 實驗三移位暫存器的 vhdl 設計成績 實驗目的 建立乙個移位模式可控的 位移位暫存器。練習建立工程 檔案 實體 結構體的建立,編譯 修改 實驗條件 裝有quartus 軟體的電腦 實驗內容...
線性反饋移位暫存器(LFSR)實現
線性反饋移位暫存器 移位暫存器 組合邏輯反饋 用處 產生偽隨機序列 資料壓縮 計數器 資料編碼解碼等等 好處 具有速度和面積優勢 特點 產生偽隨機序列的最大長度 2 n 1 種類 one to many many to one 最大 的線性反饋移位暫存器 最大是指能產生的偽隨機序列長度最長 乙個d觸...