verilog中使用乘法运算符的问题

一直有一个疑问。verilog中有乘法运算符,也有乘法器。我在想,为什么要乘法器的设计啊。直接用乘法运算符不就搞定啦?例如c=a*b
直接一相乘不就搞定了吗
为什么还要那么麻烦进行乘法器设计?是因为乘法运算符不能被综合吗?我试了一下可以进行RTL网表的综合啊。希望高手讲解一下

下面有一段乘法器的设计程序

module mult_for(outcome,a,b);
parameter size=8;
input [size:1] a,b;//两个操作数
output [2*size:1] outcome;//结果
reg [2*size:1] outcome;
integer i;
always@(a or b)
begin
outcome=0;
for(i=1;i<=size;i=i+1)//for语句
if(b[i])
outcome=outcome+(a<<(i-1));
end
endmodule

下面一段是直接用运算符相乘
module multi(ina,inb,inc);
output[13:0] inc;
input[7:0] ina,inb;
reg[13:0] inc;
always @(ina or inb)
begin
inc=ina*inb;
end
endmodule

verilog不像C语言,它不是高级语言,你写乘号有时是可以的,但是有时是不可以的,所以不要使用乘号,更不要使用除号,因为除法在FPGA中是不能在一个周期之内出结果的。为什么有时可以有时不可以呢?因为用来综合你的程序的软件(例如XILINX 的XST)还没有那么智能,有时候它会根据你的乘号自动给你生成乘法器,但是有时不会,而且有时会生成错误的乘法器,除法器这个问题要更突出,所以不要使用乘除号,在参数定义中可以使用
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-03-19
这个问题好,关注!