首页 > 解决方案 > 数组乘法与输入的综合误差

问题描述

您好,我正在尝试项目代码的一小部分,其中等式将输入与数组的所有值相乘,然后将它们相加到一个最终输出中。

module arraywithinput(input in,
    output reg [11:0] out0
    );

reg [7:0] xin[3:0];


initial 
begin
xin[0]=7;
xin[1]=6;
xin[2]=5;
xin[3]=2;
end



integer i;

always@(*)
begin
for (i=0; i<4; i=i+1)
out0<=out0+(in*xin[i]);
end

endmodule

我在始终阻止敏感度列表中收到 Unexpected xin 事件的合成错误。为了实现这种情况,我可能做错了什么。

标签: verilogxilinxhdlintel-fpgaxilinx-ise

解决方案


初始块不是可综合的结构,仅用于测试台。此外,不建议将 NBA 放在 always@* 块中。Mult/Div 是计算密集型和使用大量资源的,最好使用一些算法,如重复加法、booth 等来实现乘法。

我已经修改了你的代码。我使用了时钟信号。

module arraywithinput(input in,
                      input clk,
                      output [11:0] out0
                );

 reg [7:0]xin[3:0];
 reg [11:0] out0_r[3:0];

 always@(*)  
 begin 
  xin[0]=7; 
  xin[1]=6;
  xin[2]=5;
  xin[3]=2;
 end

 integer i;

 always@(posedge clk)
 begin
   out0_r[0] <= (in*xin[0]);
  for (i=1; i<4; i=i+1)
   out0_r[i] <= out0_r[i-1] + (in*xin[i]);
 end

 assign out0 = out0_w[3];  //Please note that output will be stable after 4 cycles.
 
endmodule

推荐阅读