首页 > 代码库 > 转载FPGA学习之内嵌乘法器调用
转载FPGA学习之内嵌乘法器调用
补充一点,除法的时候如果直接a/b那么就会调用lpm模块,不管输入是否是常数,乘法的时候输入都是reg型变量会调用硬件乘法器,有一个是常数就会调用lpm模块。
上课的时候一直听老师说真正实践的时候你别想着要自己写一个乘法器,那样子做的孩子是笨蛋。
不管老师说得对不对,总之,既然FPGA内部有硬件乘法器那么为啥不直接使用呢,而且在写verilog使用是非常简单的,只是用个*号就轻易搞定。
只要所使用的FPGA内嵌有乘法器,则综合软件在综合的时候就会自动帮你调用乘法器实现。
下面是一段简单代码:
module mult(outcome,a,b); input [7:0] a,b; output [15:0]outcome;
assign outcome = a*b; endmodule
综合后RTL view为:
再查看综合报告,主要是看消耗了多少资源:
从上图可以清楚看出,逻辑单元几乎没有消耗,而看到Embedded Multipler 9-bit elements 使用了36个中的1个,意思说ep2c8q208c8这款FPGA有36个Embedded Multipler 9-bit elements 而这次设计使用了1个。这样一看,觉得资源消耗真的不多。
//==================================================== reg [17:0]yr, yg, yb; reg [19:0]y1; always @(posedge clk or negedge rst_n) begin if(!rst_n)begin yr <= 18‘d0; yg <= 18‘d0; yb <= 18‘d0; y1 <= 20‘d0; end else begin yr <= 10‘h132*r; yg <= 10‘h259*g; yb <= 10‘h074*b; y1 <= yr + yg + yb; end end
从代码可以看出这里出现了三个*号,本以为会调用三个内嵌的硬件乘法单元,结果不是,在综合报告里面可以看出,调用的硬件乘法单元为0,这是为什么呢,然后我将上面两段代码做了一下比较,发现,下面这段是乘以常数的,而上面的是乘以寄存器。为了证明这个变化会使得综合有所变化我做了一下改动,就是把乘以常数的某一句改成乘以寄存器:yg <= yr*g;
综合报告显示使用了两个硬件乘法单元,至于为什么是两个是因为yr的宽度超出了9bits。
接下来再看看综合时候的一些信息:
想必大家都看得到lpm这三个字母,意思就是调用了altera自带的宏模块。
反正我们是不用自己写乘法器的,即使只是调用了宏模块,我相信宏模块有经过优化的,而且可以加快我们的开发周期。
以上的看法也可以在RTL view里面得到验证。
得到的结论是:有常数作为输入的时候,tool是不会调用内嵌的硬件乘法器,但是会调用tool自带的宏模块。而且做乘法的时候tool并不会帮 你把代码优化成移位操作。
当相乘的两个数都是reg的时候,tool会调用内嵌的乘法器。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。