【问题标题】:Verilog For Loop For Array MultiplicationVerilog For循环用于数组乘法
【发布时间】:2013-02-23 06:21:06
【问题描述】:

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

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

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

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

谢谢,

费萨尔。

【问题讨论】:

    标签: verilog


    【解决方案1】:

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

    【讨论】:

    • 现在我知道如何在verilog中正确编写for循环了,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多