分布式演算法是一種專門針對於乘加運算的運算方法,與傳統的演算法相比,分布式演算法可以極大地減少硬體規模,很容易實現流水線處理提高硬體的執行速度,也就是提高硬體系統運算速度,而這一點正是很多系統極力追求的目標。正如我們大家所知的那樣,在fpga設計中,通常情況下速度與硬體資源是不可以兼得的,分布式演算法不僅可以節省硬體資源又可以提高運算速度。要實現這一目標,自然與其他演算法有著本質的區別。
所謂分布式演算法,就是指在完成乘加功能時通過將各輸入資料每一對應位產生的運算結果預先進行相加形成相應的部分積,在對各部分積進行累加形成最終結果;而傳統的演算法則是等到所有乘積結果產生之後再進行相加,從而完成整個運算。但是分布式演算法應用有乙個限定的條件在於,每個乘法運算中必須有乙個乘數為常數,這一要求在fir濾波器中比較吻合。估計大家看到這裡,仍然是雲裡霧裡的,就像我剛接觸時一樣。
如何來理解分布式演算法呢?這要從最基本的固定係數乘法運算說起。對於乙個乘數是常數的運算,很容易想到用儲存器來完成。儲存器的運算速度比乘法器快得多,且又可以減少資源。比如 10xa 及100xa 、1000xa(a為3bit的補碼資料)則可以構造兩個儲存器,其中a為儲存器的尋位址訊號,儲存器的內容則為對應的乘法運算結果(用10進製來表示)
表1-a兩個常係數乘法運算的儲存器實現
輸入訊號(a)儲存位址
10xa運算結果/儲存內容
100xa運算結果/儲存內容
1000xa運算結果/儲存內容
000000
00110
1001000
01020
2002000
01130
3003000
100-40
-400
-4000
101-30
-300
-3000
110-20
-200
-2000
111-10
-100
-1000
因此,乘數中乙個為常數的乘法運算可採用查詢表來實現,而fpga的結構本身就是基於查詢表接否(lut)構建的。因此fpga十分適合查詢表來實現常係數乘法運算。fpga分布式演算法的基本思想即採用查詢方法實現的結構形式。先來舉個4個乘加運算的例項。如 10xa+20xb+30xc+40xd 其中a、b、c、d均是4位二進位制補碼資料。如果分別採用4個深度為16的儲存器來實現4個乘法運算,再將執行結果相加得出輸出,顯然不會降低多少硬體資源。分布式演算法高明之處在於,仍然只採用乙個儲存器即可實現乘加運算我們將運算形式進行逐位分解:
10xa+20xb+30xc+40xd= 10(-2^3a(3)+2^2a(2)+2a(1)+a(0))
+20(-2^3b(3)+2^2b(2)+2b(1)+b(0))
+30(-2^3c(3)+2^2c(2)+2c(1)+c(0))
+40(-2^3d(3)+2^2d(2)+2d(1)+d(0))
=-2^3(10a(3)+20b(3)+30c(3)+40d(3))
+2^2(10a(2)+20b(2)+30c(2)+40d(2))
+2(10a(1)+20b(1)+30c(1)+40d(1))
+(10a(0)+20b(0)+30c(0)+40d(0))
仔細分析,如果將a(3)b(3)c(3)d(3)組成的4位位址輸入訊號對應的儲存器的輸入內容,與將a(2)b(2)c(2)d(2)組成的4位位址輸入訊號的儲存器內容只差2的整數倍次冪倍,在fpga中可以通過位移來實現。對於上面的例子可以只構造乙個深度為16的儲存器查詢表,通過4次查詢表運算,3次移位運算以及一次4輸入加法運算,即可完成乘加運算。因此對於長度為n的乘加運算,只需構造乙個深度為n的儲存器查詢表,通過m(m為變數的資料長度)次查詢運算、m-1次移位運算及1次m輸入的加法運算即可完成乘加運算。這種運算結構極易實現流水線結構,且運算速度受限於加法與查詢表的速度,與運算的資料長度無關,從而實現完美的「魚與熊掌兼得」。
fir分布式濾波的fpga實現
此設計的結構包括 1.移位暫存器鏈,n階的有n 1個暫存器。2.第一次累加部分。由fir濾波係數對稱可得到對稱的暫存器相加可以減小電路規模,所以第一次累加很有必要。3,鎖存並移位部分。此部分是為了通過移出lut位址,通過給出lut位址即可得到lut輸出。4,lut部分,該部分實現的主要功能是輸出不同...
分布式事務 分布式事務的實現
如果在多個服務中需要對不同的資料庫進行操作。因為不同服務操作的資料庫都不同,所以保證在同乙個事務中完成操作顯然是不科學的。那實現分布式事務的思想 1 方法入口,建立一條日誌記錄,狀態定義為初始狀態,即儲存本條日誌記錄 可以儲存在資料庫中,也可以寫出到本地磁碟檔案 2 可以在非同步執行緒或在定時任務中...
分布式 分布式鎖
本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...