2013-02-23 172 views
0

這似乎是一個相當愚蠢的問題,但是從軟件到HDL的過渡有時相當令人沮喪!Verilog For Loop用於數組乘法

我的問題:我想要在Verilog中完成數組乘法。這是兩個數組的乘法(逐點),每個數組長度爲200。以下代碼在測試平臺中工作正常:

for (k=0; k<200; k=k+1) 
    result <= result + A[k] * B[k]; 

但它甚至不會接近在Verilog模塊中工作。我認爲這是因爲操作應該在許多時鐘週期內進行。由於它涉及寫出200次乘法和199次加法,如果我手動執行(!),我想知道是否有一個讓循環工作(並可合成)的技巧?

謝謝,

費薩爾。

回答

4

你不想在那裏使用for循環,你想使用一個時鐘邏輯塊。 For循環僅用於描述並不反饋自己的並行結構,它們只是很少有用,並不適用於在軟件程序中使用它們的相同類型的事物。

要做到你想做到什麼,你應該有一個塊,像這樣:

always @(posedge clk or posedge reset) 
    if (reset) begin 
     result <= 0; 
     k <= 0; 
     result_done <= 0; 
    end else begin 
     result  <= result_done ? result : (result + A[k] * B[k]); 
     k   <= result_done ?  k : k + 1; 
     result_done <= result_done ?  1 : (k == 200); 
    end 
end 

這歸零復位的結果,增加了A [K] * B [K]的總和200個時鐘,然後在k == 200時停止計數並斷言「完成」信號。

+0

非常感謝你......完美的作品! :) – 2013-02-23 07:31:21

+0

現在我知道如何編寫適當的verilog循環,謝謝。 – Jason 2017-03-03 07:29:30