Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组乘法循环的Verilog_Verilog - Fatal编程技术网

数组乘法循环的Verilog

数组乘法循环的Verilog,verilog,Verilog,这似乎是一个相当愚蠢的问题,但从软件到HDL的过渡在开始时有时相当令人沮丧 我的问题是:我有一个数组乘法,我正试图在Verilog中完成。这是两个数组逐点相乘,每个数组的长度为200。以下代码在测试台上运行良好: for (k=0; k<200; k=k+1) result <= result + A[k] * B[k]; 但它甚至不能在Verilog模块中工作。我认为原因是因为操作应该在许多时钟周期内进行。因为如果我手工写的话,需要写200个乘法和199个加法!,我想知

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

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

for (k=0; k<200; k=k+1)
    result <= result + A[k] * B[k]; 
但它甚至不能在Verilog模块中工作。我认为原因是因为操作应该在许多时钟周期内进行。因为如果我手工写的话,需要写200个乘法和199个加法!,我想知道让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

这会在重置时将结果归零,将[k]*B[k]添加到200个时钟的总和中,然后在k==200时停止计数并断言“完成”信号

您不希望在那里使用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

这会在重置时将结果归零,将[k]*B[k]添加到200个时钟的总和中,然后在k==200时停止计数并断言“完成”信号

现在我知道如何在verilog中正确地编写for循环,谢谢。现在我知道如何在verilog中正确地编写for循环,谢谢。