2013-02-23 68 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