原创 [博客大赛]小程序大道理---乘法器(续)

2014-4-3 09:59 1941 14 15 分类: FPGA/CPLD 文集: FPGA

对于乘法 P=A*B 有:

20140401203725177.jpg

实现:乘法转化成了个N(A的位宽)个加法运算;第n次加法的加数是A的第n位(An)与B左移n位(B<)的乘积;<>

权衡: 速度和面积。速度不够,吞吐不够,有流水线方式;面积太大(消耗资源多),用串行方式(时分复用)。

 

1、 串行方式,需要若干周期才能完成一次乘法计算

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;
reg [15:0] b;
reg [15:0] c;

reg [3:0] count;
reg [2:0] i;
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin 
 i<=3'd0;
 count<=4'd0;
 a<=8'd0;
 b<=16'd0;
 c<=16'd0;
 C<=16'd0;
end
else case(i)
  3'd0: begin
         a<=A;
         b[7:0]<=B;
         c<=16'd0;
         i<=3'd1;
        end
  3'd1: if(count==4'd8)
         begin
          C<=c;       
          i<=3'd0;
         end
        else begin
              if(a[0]==1'b1)
                begin
                 c<=c+b;
                 b<=b<<1;
                 a<=a>>1;
                 count<=count+4'd1;
                 i<=3'd1;
                end
             end
   default: i<=3'd0;
   endcase
endmodule

资源使用

20140401204613773.jpg

速率

20140401204636820.jpg

 

2、流水线

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;
reg [7:0] 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
// 移位(相乘)    
reg [7:0] x0;
always@(posedge clk or negedge rst_n)
if(!rst_n)
 x0<=8'd0;
else if(a[0])
 x0<=b;
else *0<=8'd0;

reg [8:0] x1;
always@(posedge clk or negedge rst_n)
if(!rst_n)
 x1<=9'd0;
else if(a[1])
 x1<={b[7],b};
else *1<=9'd0;

reg [9:0] x2;
always@(posedge clk or negedge rst_n)
if(!rst_n)
 x2<=10'd0;
else if(a[2])
 x2<={b[7],b[7],b};
else *2<=10'd0;

reg [10:0] x3;
always@(posedge clk or negedge rst_n)
if(!rst_n)
 x3<=11'd0;
else if(a[3])
 x3<={b[7],b[7],b[7],b};
else *3<=11'd0;
 
reg [11:0] x4;
always@(posedge clk or negedge rst_n)
if(!rst_n)
 x4<=12'd0;
else if(a[4])
 x4<={b[7],b[7],b[7],b[7],b};
else *4<=12'd0;

reg [12:0] x5;
always@(posedge clk or negedge rst_n)
if(!rst_n)
 x5<=13'd0;
else if(a[5])
 x5<={b[7],b[7],b[7],b[7],b[7],b};
else *5<=13'd0; 

reg [13:0] x6;
always@(posedge clk or negedge rst_n)
if(!rst_n)
 x6<=14'd0;
else if(a[6])
 x6<={b[7],b[7],b[7],b[7],b[7],b[7],b};
else *6<=14'd0;

reg [14:0] x7;
always@(posedge clk or negedge rst_n)
if(!rst_n)
 x7<=15'd0;
else if(a[6])
 x7<={b[7],b[7],b[7],b[7],b[7],b[7],b[7],b};
else *7<=15'd0;
// 第一流水
reg [9:0] y1;
always@(posedge clk or negedge rst_n)
if(!rst_n)
 y1<=10'd0;
else
 y1<=x0+x1;
 
reg [11:0] y2;
always@(posedge clk or negedge rst_n)
if(!rst_n)
 y2<=12'd0;
else
 y2<=x2+x3;
 
 reg [13:0] y3;
always@(posedge clk or negedge rst_n)
if(!rst_n)
 y3<=14'd0;
else
 y3<=x4+x5;
 
  reg [15:0] y4;
always@(posedge clk or negedge rst_n)
if(!rst_n)
 y4<=16'd0;
else
 y4<=x6+x7;
// 第二流水
reg [12:0] z1;
always@(posedge clk or negedge rst_n)
if(!rst_n)
 z1<=13'd0;
else
 z1<=y1+y2;

reg [15:0] z2;
always@(posedge clk or negedge rst_n)
if(!rst_n)
 z2<=16'd0;
else
 z2<=y3+y4;
 // 第三流水
always@(posedge clk or negedge rst_n)
if(!rst_n)
 C<=16'd0;
else
 C<=z1+z2;
 
endmodule

RTL 视图

20140401205204849.jpg

资源使用

20140401205230972.jpg

速率

20140401205254199.jpg

这里仅仅是一个例子,乘法器还有很多其他的实现算法,具体应用什么样的还要看实际情况。“解放思想”的同时还需要“实事求是”,哈哈

文章评论1条评论)

登录后参与讨论

用户1648762 2014-5-5 17:40

看不懂啊

644398774_263592779 2013-5-27 16:37

发现还需有勇气去追随,并坚持,更不容易!!!

644398774_263592779 2013-5-27 16:35

谢谢提醒,非常对!

用户1710126 2013-5-27 13:58

要敢于发现和守护自己的独一无二,不是一件容易的事儿!但是,你就是你。

用户1573081 2013-5-26 18:23

嗯,要努力活出自己的精彩,与众不同的人生,不要滂沱岁月啊。

用户377235 2013-5-25 00:31

生活就是需要这种勇气

644398774_263592779 2013-5-23 23:25

确实如此

用户1696769 2013-5-23 09:37

相信自己!!
相关推荐阅读
pengchengcheng082_593158939 2015-08-21 16:26
Linux 下 的 vi 编辑器
一、按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi :q 不保存文件,退出vi :wq 保存文件并退出vi :q! 不保存文件,强制退出vi :w! 强制保存,不推出...
pengchengcheng082_593158939 2015-07-28 15:57
面向对象和面向过程区别
转自 http://blog.sina.com.cn/s/blog_4dd5955301000a2m.html     面向对象和面向过程的区别,实在是难用一两句话说明白。   ...
pengchengcheng082_593158939 2015-05-23 10:39
后仿真能否被形式验证(Formal Verification)和静态时序分析(Static Timing Analysis)所取代
转自 http://www.cnblogs.com/jyaray/archive/2011/04/26/2029856.html 验证的主要目的:就是检查时间模型是否满足时间要求,是否实现了时...
pengchengcheng082_593158939 2015-05-19 11:18
两种代码方式
下面的两段程序等价,RTL图以及综合后的结果 完全一样。看似简单,其实是两种不同的思维方式。在复杂电路中能体现出两种方式各自的特点,第一种容易理解,第二种则结构更清晰,更接近综合后的结果。以前习惯用上...
pengchengcheng082_593158939 2015-05-14 16:28
Linux 下 的 cc 和 gcc
转自 http://www.cnblogs.com/zhouyinhui/archive/2010/02/01/1661078.html   在Linux下一会看到cc,另一会又看到gcc...
pengchengcheng082_593158939 2015-05-13 17:19
mips 编译器
1、linux 系统下编程的编译器 GNU toolchain(GNU工具链)是一个包含了由GNU项目所产生的各种编程工具的集合。这些工具形成了一条工具链,用于开发应用程序和操作系统。  ...
我要评论
1
14
关闭 站长推荐上一条 /2 下一条