2

这似乎是一个相当愚蠢的问题,但从软件到 HDL 的过渡最初有时是相当令人沮丧的!

我的问题:我想在 Verilog 中完成一个数组乘法。这是两个数组(逐点)的乘法,每个数组的长度为 200。以下代码在测试台中运行良好:

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

但它甚至无法在 Verilog 模块中工作。我认为原因是因为操作应该在许多时钟周期内进行。因为如果我手动(!)它涉及写出 200 个乘法和 199 个加法,我想知道是否有使 for 循环工作(并且可以综合)的技巧?

谢谢,

费萨尔。

4

1 回答 1

6

你不想在那里使用 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 时停止计数并断言“完成”信号。

于 2013-02-23T06:36:00.437 回答