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