乘法器
一个最基本的运算,在写C程序时,一条语句就行了,然而我们写硬件程序,面对的是最底层,是和“ 0和1 ”打交道,必须搞清楚乘法器的实现方式。当然,直接写一条语句也不是不可以,但是在某些情况下,并不是最明智的方式!
注: 以下例子都是 无符号型的8位乘法运算 。
在Quartus环境下,可以通过设置“综合选项”来选择乘法器的实现方式,也可以在程序中使用一些预编译指令,指示综合器乘法器的实现方式。LEs 或者 硬件嵌入式乘法器,当然,各有特点,留着硬件专用乘法器不用,也是一种资源浪费,但是速率受限;用LEs设计的优质的流水线乘法器,速率可以很高,代价是消耗逻辑资源 。 具体使用哪种方式,要看具体情况。
1、 Quartus 用 硬件乘法器
(*multstyle="dsp"*)module top(clk,rst_n,A,B,C);
input clk;
input rst_n;
input [7:0]A;
input [7:0]B;
output reg [15:0]C;
reg [7:0] a,b;
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
a<=8'd0;
b<=8'd0;
end
else begin
a<=A;
b<=B;
end
always@(posedge clk or negedge rst_n)
if(!rst_n)
C<=16'd0;
else
C<=a*b;
endmodule
RTL视图
资源使用情况
注: 硬件乘法器中,含有触发器 [7:0]a [7:0]b ,[15:0]C
Technology Map Viewer
速率
2、Quartus 用 LEs 实现,程序不采用任何算法,编译器自己综合乘法器,至于Quartus用什么算法实现的乘法器,没有深入研究。。。。反正实现了乘法功能(哈哈)。
(*multstyle="logic"*)module top(clk,rst_n,A,B,C);
input clk;
input rst_n;
input [7:0]A;
input [7:0]B;
output reg [15:0]C;
reg [7:0] a,b;
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
a<=8'd0;
b<=8'd0;
end
else begin
a<=A;
b<=B;
end
always@(posedge clk or negedge rst_n)
if(!rst_n)
C<=16'd0;
else
C<=a*b;
endmodule
资源使用
Technology Map Viewer (部分),简直不忍直视。。。
速率
用算法实现乘法器,设计比较好的乘法器,下篇博文续。。。。
pengchengcheng082_593158939 2014-4-4 10:20
用户442704 2014-4-3 21:13