感謝您的所有建議。我應該更好地把這個問題放在我原來的問題中,對於不清楚這個問題感到抱歉。行prod [0] < = prod [0] + input [0] x weight1 [i];直到產品[25]被執行超過200個時鐘週期。但是,這26次乘法確實同時發生。一次是否太多,或者是否需要在一個時鐘週期內執行1次乘法(32位x 32位),這意味着在200 x 26個時鐘週期內進行所有200 x 26次乘法運算?
另外,我有6個階段到管道整個事情通過:
26並聯矩陣乘法重複200次(200個時鐘週期)。
設置一個控制標誌,以便由具有大約200個元素的LUT組成的激活模塊可以完成它的工作併發送結果。每個神經元重複25次(超過25個時鐘週期)。
重置標誌停止激活功能。重置計數器和一切準備下一部分。
3個矩陣乘法並行重複25次(25個時鐘週期)。
再次呼叫激活功能。
查找從6中獲得的三個值的最大值,以確定輸出應該是什麼(這是一個分類問題)。
以上階段和每個時鐘週期的乘法次數(階段1中的25次和階段2中的3次)是否正常?
或者我應該重做它執行階段2超過200x25時鐘週期和階段4執行超過10x3時鐘週期?
非常感謝所有幫助和建議的傢伙,
費薩爾
ORIGINAL:
我已經編寫,並模擬了人工神經網絡的前饋算法模塊。綜合工具需要很長時間(Synopsys DCS和Xilinx ISE 14.4)......它已經運行了9個多小時,所以我對它的感覺非常糟糕!模擬結果是正確的。
我對NEW設計有一個想法(在消息結尾處),但想由有經驗的人來運行它,看看這是否更有效率,我目前的實施(見下文)或更糟糕,如果更糟,我可以使這麼多算術運算更有效率嗎?
在網絡上的一些背景:
輸入層有200個輸入,
隱層具有25個神經元,
輸出層有3個輸出。
Verilog代碼思路: 我只有一個模塊實現了整個算法。
- 第一步是乘以權重(其中200)的輸入端(其中200),用於每個神經元(也有25個神經元) 它計算
prod[0] <= prod[0] + input[0] x weight1[i]; i = 0 to 200-1
.......
prod[25] <= prod[25] + input[25] x weight1[i]; i = 0 to 200-1
和上面重複200個輸入中的每一個都是200次。它同時進行所有25個神經元的計算。
接下來,對上述結果調用ANN激活函數。這是通過使用具有接近200個元素的LUT(我使用case語句)完成的。爲此,我編寫了另一個activation.v文件,並且必須爲每個神經元實例化25次!
接着,乘以權重以上的結果的最後3個神經元:
prod_2[0] <= prod_2[0] + prod[0]*weight2[i]; i = 0 to 25-1;
prod_2[1] <= prod_2[1] + prod[0]*weight2[i]; i = 0 to 25-1;
prod_2[2] <= prod_2[2] + prod[0]*weight2[i]; i = 0 to 25-1;
,反覆進行上述25次,每次的25個刺激輸入。它同時對所有3個輸出神經元進行計算。
- 最後一步是在prod_2 [0到2]上調用sigmoid。我必須爲此實例化3個更多的激活模塊。
模擬結果很好。但可能非常低效!
所以,我想知道這是否是一個更好的主意?
Top_Module - >神經元 - >乘法和激活
頂部模塊調用的神經元功能(需要實例28元這個!),並把相關的輸入和權重了。神經元函數調用乘法模塊(第一部分需要200個,第二部分需要25個)。神經元函數接下來添加上述200個結果(第2部分中的25個)並調用激活函數。輸出最終返回到Top_Module。
我的問題:
這是更有效,越早實施這是一個模塊中執行的一切嗎?
就是實例28層的神經元和神經元的每個實例200個乘法模塊壞或好?
任何其他的想法,使我的代碼有效,使Synopsys設計編譯器不需要12小時?
如果我這樣做,每個神經元有200個輸入和200個權重,這將是它的輸入端口。我不認爲Verilog模塊可以相互傳遞數組。如果沒有,我必須手動寫出所有的400端口而不是傳遞數組嗎?
對不起一個奇怪的問題,但我是新來的整體綜合概念,並想知道這些工具如何去實例化模塊?
謝謝,
費薩爾。
200次乘法運算真的很大。你的設計在每次乘法之間看起來很相似,所以我認爲你可以聲明它是一個模塊並使用generate。可能是這樣更快。 – Khanh 2013-02-27 08:58:37
太好了。非常感謝這個建議......我會盡力而爲,希望它會更有效率。 – 2013-02-27 09:07:40