原创 FPGA学习笔记3——booth乘法器设计

2015-11-5 13:18 3552 10 11 分类: FPGA/CPLD

Booth乘法器设计

booth乘法器是一种可以计算带符号数的乘法器,他的实现思维较为简单,具体的重要逻辑是设乘数分别为a[3:0]和b[3:0],积为y[8:1],在这里y其实是一个9位的寄存器,只不过高8位才是真正的结果。首先我们把b[3:0]装进y[4:0]的高四位,低一位装一个1'b0,之后我们便可以实现我们的逻辑了判断y[1:0],如果为2'b00或者2'b11,则不操作,如果为2'b01,y[8:5]+a,如果为2'b10,则y[8:5]-a;之后再判断y[8],如果为1'b1则右移一位,再把y[8]置1,如果为1'b0则有一位,再把y[8]置0,重复以上步骤4次,最后就会得到积为y[8:1]。

在这个给出代码
  1. module booth(clk,rst_n,a,b,y,start,done);
  2. input clk,rst_n;
  3. input [7:0]a,b;//输入乘数a,b,8位
  4. input start;//开始信号,只有在高电平时,乘法器才工作
  5. output [15:0]y;//积,为16位
  6. output done;//完成一次乘法信号会输出一个高电平
  7.  
  8. reg[16:0]y_reg;//17位的寄存器,用来完成移位和加法的操作
  9. reg[4:0]i;//状态寄存器
  10. reg done;
  11. reg [7:0]temp1,temp2;//中间变量,用来简化移位操作
  12.  
  13. always @ (posedge clk or negedge rst_n)
  14. begin
  15. if (!rst_n)
  16.         begin
  17. y_reg<=17'd0;
  18.         i<=4'd0;
  19.         done<=1'b0;
  20.         temp1<=8'd0;
  21.         temp2<=8'd0; 
  22.         end
  23. else if(start)
  24.         case(i)
  25.         0:begin
  26.         y_reg<={8'd0,b[7:0],1'b0};
  27. i<=i+1'b1;
  28. temp1<=8'd0;
  29.         temp2<=8'd0; 
  30.         end
  31.         1,2,3,4,5,6,7,8:begin
  32.         temp1=y_reg[16:9]+a;
  33. temp2=y_reg[16:9]-a;
  34.         if(y_reg[1:0]==2'b01)
  35.         y_reg<={temp1[7],temp1,y_reg[8:1]};
  36. else if(y_reg[1:0]==2'b10)
  37.         y_reg<={temp2[7],temp2,y_reg[8:1]};
  38. else
  39. y_reg<={y_reg[16],y_reg[16:1]};
  40. i<=i+4'd1;  
  41.         end
  42.         9:begin
  43.         done<=1'b1;
  44.         i<=i+4'd1;
  45.         end
  46.         10:begin
  47.         done<=1'b0;
  48.         i<=4'd0;
  49.         end
  50.         endcase
  51. end
  52. assign y=y_reg[16:1];
  53. endmodule

重点分析booth算法中最重要的逻辑
  1.  1,2,3,4,5,6,7,8:begin
  2.         temp1=y_reg[16:9]+a;
  3. temp2=y_reg[16:9]-a;
  4.         if(y_reg[1:0]==2'b01)
  5.         y_reg<={temp1[7],temp1,y_reg[8:1]};
  6. else if(y_reg[1:0]==2'b10)
  7.         y_reg<={temp2[7],temp2,y_reg[8:1]};
  8. else
  9. y_reg<={y_reg[16],y_reg[16:1]};
  10. i<=i+4'd1;  
  11.         end
在这里的8个循环中,我们再一个步骤里完成了判断和移位的两个操作,我们先用了两个变量,temp1,temp2,来计算y_reg[16:9]+a和y_reg[16:9]-a的值,那么在下一步的判断中,就可以直接完成移位的操作了,大大缩短了时钟的周期。在这里贴一个在网上找到的流程图,就知道booth乘法器是怎么样工作的了。20151104123752509.jpg

我们来分析一下booth算法中的数学原理是怎么样的,在网上查找了很多资料,都只直接给出了流程图,或者是计算的步骤,并没有说出到底为什么这样可以成立,当中蕴含着的数学原理是什么,我们来探讨一下。

因为有些符号不知道怎么打出来,我直接用了草稿纸写了推导过程。


20151105131715339.jpg20151105131758922.jpg



文章评论1条评论)

登录后参与讨论

用户1696769 2015-11-5 17:19

赞一个!博主可以晋升为明星博主了
相关推荐阅读
广州老伯 2015-11-18 21:40
FPGA学习笔记6——VGA显示图片
VGA显示图片 在上一个笔记熟悉了VGA的时序后,显示了一个翡翠台彩条的图片,采用的思想是在vga_output模块上,根据x,y坐标的不同,把图片分成了三个800*200的区域,分别在三个区域上显示...
广州老伯 2015-11-07 23:51
FPGA学习笔记5——VGA驱动
VGA驱动     VGA接口是一个常用到的接口,今天笔者带大家来探讨下怎么样编写VGA驱动。从数据手册上我们可以看到VGA接口一共有15个引脚,但其实真正需要我们去操作的只有5个引脚,他们分...
广州老伯 2015-11-05 21:24
FPGA学习笔记4——PLL的IP核使用
PLL的IP核使用    PLL锁相环的IP核应该是在FPGA开发中用得最多的一个模块了,下面介绍如何使用PLL的IP核。首先,我们新建一个工程,新建一个verilog文件,保存。    然后选择to...
广州老伯 2015-11-03 17:24
FPGA学习笔记2——传统乘法器设计
传统乘法器设计传统乘法器我们以传统的乘法竖式计算为例说明一下。以10*9为例,即二进制1010*1001有  1 0 1 0                   X    1 0 0 1     ...
广州老伯 2015-10-30 23:29
FPGA学习笔记1——分频电路设计
    分频就是用一个时钟信号通过一定的电路结构变成不同频率的时钟信号,这里介绍一下整数分频电路的设计方法。整数分频电路有偶数分频和奇数分频两种,我们以实现占空比为50%的分频电路为例子来解释一下...
我要评论
1
10
关闭 站长推荐上一条 /2 下一条