0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

布斯算法(Booth Algorithm)乘法器的Verilog实现

冬至子 来源:Lin芯说 作者:Lin芯说 2023-12-04 15:16 次阅读

布斯算法介绍

Booth 的算法检查有符号二的补码表示中 'N'位乘数 Y 的相邻位对,包括低于最低有效位 y−1 = 0 的隐式位。对于每个位 yi,对于从 0 到 N − 1 的 i,考虑位 yi 和 yi−1。当这两个位相等时,乘积累加器P保持不变。其中 yi = 0 且 yi−1 = 1,乘以 2i 添加到 P;其中 yi = 1 且 yi−1 = 0,则从 P 中减去乘以 2i。P 的最终值为有符号结果。

未指定乘数和乘积的表示形式;通常,这些也都在二的补码表示中,就像乘数一样,但是任何支持加法和减法的数字系统也可以工作。如此处所述,步骤的顺序尚未确定。通常,它从LSB到MSB,从i = 0开始;然后乘以2i通常被P累加器在步长之间向右的增量移位所取代;低位可以移出,然后可以在P的最高N位上进行后续的加法和减法。

该算法通常被描述为将乘数中 1 的字符串转换为字符串末端的高阶 +1 和低阶 −1。当字符串通过 MSB 运行时,没有高阶 +1,并且净效应被解释为相应值的负数。

计算步骤

使用的寄存器:A,M,Q,Qres(Qres是Q右移后的残余位),n(计数器)

第1步: 加载寄存器的初始值。

A = 0(累加器),Qres = 0,M = 乘法,Q = 乘法器,n是等于乘法器位数的计数值。

第2步: 检查 {Q0,Qres} 的值。如果为 00 或 11,请转到步骤 5。如果为01,转到步骤3。如果为 10,转到步骤 4。

第3步: 执行 A = A + M,转到步骤 5。

第4步: 执行 A = A - M。

第5步: 执行 {A,Q,Qres} 的算术位移和递减计数。

第6步: 检查计数器值 n 是否为零。如果是,请转到下一步。否则转到步骤 2。

第7步: 停止计算,输出计算结果。

计算流程图

以下是布斯计算的流程图,从图中可以清楚的看出计算的过程,简单的来说就是判定乘数的最低位和次低位,如果两位相同则直接执行移位操作,如果两者不同,如为“10”则将原始值减去被乘数,如为“01”则将原始值加上被乘数。

图片

举个栗子

下面就以被乘数为6,乘数为-4为例,做一个计算过程的举例。

图片

  1. 将所有寄存器初始化,累加器A初始化为0,乘数加载寄存,最低位移出位设定为0。
  2. 判定最低位和移出位为“00”,不进行加减操作,将结果结果值右移一位。
  3. 判定最低位和移出位为“00”,不进行加减操作,将结果结果值右移一位。
  4. 判定最低位和移出位为“10”,对累加器减去被乘数,并将结果结果值右移一位,注意此时累加器A为负数。
  5. 判定最低位和移出位为“10”,不进行加减操作,将结果结果值右移一位,此时累加器为负数,因此右移最高位补1。
  6. 判定最低位和移出位为“10”,不进行加减操作,将结果结果值右移一位,此时累加器为负数,因此右移最高位补1。
  7. 计数器为0表示计算完成,停止计算并输出计算结果值。

Verilog 实现

设计思想

总的来说和上面提到的计算步骤是一致的,利用三段状态机实现,分别为空闲状态、计算状态和完成状态,其中空闲状态等待开始计算信号的到来,计算状态完成布斯计算步骤,完成状态输出结果数据以及同步的有效标志信号。

Verilog 代码

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*Engineer    : Linest-5                                                         
/*File        : booth_multiple.v                                                         
/*Create      : 2022-08-27 16:40:34
/*Revise      : 2022-08-27 16:40:34                                                  
/*Module Name : booth_multiple                                                  
/*Description : 基于布斯算法的乘法器设计                                                                         
/*Editor : sublime text3, tab size (4)                                                                                
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

modulebooth_multiple(
inputclk,
inputrst,
inputstart,
inputsigned [3:0]   X,
inputsigned [3:0]   Y,
outputreg signed [7:0]   Z,
outputvalid
);

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*参数和信号申明                                                              */
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
parameterIDLE      =  3'b001;
parameterCACULATE  =  3'b010;
parameterFINISH    =  3'b100;
reg[2:0]   state;
reg[2:0]   next_state;
reg[1:0]   q_reg;           //右移最后两位寄存 
reg[2:0]   cnt;             //右移次数计数信号  
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*三段状态机                                                                  */
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//状态机第一段,状态初始化,时序逻辑非阻塞赋值
always @(posedge clk or posedge rst) begin
  if (rst) begin
    state <= IDLE;
  end
  else begin
    state <= next_state;
  end
end
//状态机第二段,状态跳转,组合逻辑阻塞赋值
always @(*) begin
  next_state = state;
  case(state)
    IDLE: begin
      if (start) begin
        next_state = CACULATE;
      end
      else begin
        next_state = IDLE;
      end
    end
    CACULATE: begin
      if (cnt == 'd3) begin
        next_state = FINISH;
      end
      else begin
        next_state = CACULATE;
      end
    end
    FINISH: begin
      next_state = IDLE;
    end
  endcase
end

//状态机第三段,结果输出,时序逻辑非阻塞赋值
always @(posedge clk or posedge rst) begin
  if (rst) begin
    cnt   <= 'd0;
    q_reg <= 'd0;
    Z     <= 'd0;
  end
  else begin
    case(state)
      IDLE: begin
        cnt   <= 'd0;
        q_reg <= {Y[cnt],1'b0};
        Z     <= {4'b0000,Y};
      end
      CACULATE: begin
        cnt   <= cnt + 'd1;
        q_reg <= {Y[cnt+1],Y[cnt]};
        case(q_reg)
          2'b00,2'b11: begin
            Z <= $signed(Z) >> >1;
          end
          2'b10: begin
            Z <= $signed({Z[7:4]-X,Z[3:0]}) >> >1;
          end
          2'b01: begin
            Z <= $signed({Z[7:4]+X,Z[3:0]}) >> >1;            
          end
        endcase
      end
      FINISH: begin
        cnt   <= 'd0;
        q_reg <= 'd0;
        Z     <= Z;        
      end          
    endcase
  end
end
assign valid = (state==FINISH);
endmodule

TestBench 代码

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/* Engineer    : Linest-5                                                         
/* File        : tb_booth_multiple.v                                                         
/* Create      : 2022-08-27 19:22:46
/* Revise      : 2022-08-27 20:21:49                                                  
/* Module Name : tb_booth_multiple                                                  
/* Description : 基于布斯算法的乘法器仿真模块                                                                         
/* Editor : sublime text3, tab size (4)                                                                                
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

`timescale 1ns/1ns
module tb_booth_multiple();
  reg                 clk;
  reg                 rst;
  reg                 start;
  reg  signed [3:0]   X;
  reg  signed [3:0]   Y;
  wire signed [7:0]   Z;
  wire                valid;

  initial begin
    clk = 'd0;
    rst = 'd1;
    #20
    rst = 'd0;
  end
  always #10 clk = ~clk;
  initial begin
    #20
    X = 6;
    Y = -4;
    start = 'd0;
    #50
    start = 'd1;
    #20
    start = 'd0;
    #200
    X = 7;
    Y = -5;
    start = 'd1;
    #20
    start = 'd0;
    #200
    X = 7;
    Y = 5;
    start = 'd1;
    #20
    start = 'd0;
  end


booth_multiple inst_booth_multiple (
  .clk   (clk),
  .rst   (rst),
  .start (start),
  .X     (X),
  .Y     (Y),
  .Z     (Z),
  .valid (valid)
);

endmodule

仿真波形

分别进行有符号的乘法,6和-4、7和-5、7和5,可以看到仿真波形中,正确的得到了计算结果,并且有效标志信号也同步输出。

验证成功!

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5037

    浏览量

    117765
  • Verilog
    +关注

    关注

    28

    文章

    1327

    浏览量

    109312
  • 乘法器
    +关注

    关注

    8

    文章

    192

    浏览量

    36587
  • 累加器
    +关注

    关注

    0

    文章

    50

    浏览量

    9366
  • MSB
    MSB
    +关注

    关注

    0

    文章

    13

    浏览量

    8215
收藏 人收藏

    评论

    相关推荐

    fpga中定点乘法器设计(中文)

    …………………………………………………………………………………………… 51、 无符号数一位乘法 …………………………………………………………………………… 72、 符号数一位乘法 ……………………………………………………………………………… 83、
    发表于 08-12 11:59

    verilog乘法器延时问题

    刚刚学习verilog,夏宇闻的《verilog数字系统设计教程(第三版)》中,P143中图10.3,乘法器延时为1个与门和8个全加器的延时,为什么是 8 个?我觉得应该是 10 个全加器延时,请求大神帮忙解答一下,谢了。
    发表于 10-10 23:04

    Verilog中用*实现乘法和用乘法器ip核实现乘法的区别?

    Verilog中用*实现乘法和用乘法器ip核实现乘法综合结果有哪些不同?
    发表于 03-18 09:35

    怎么实现32位浮点阵列乘法器的设计?

    本文介绍了32 位浮点阵列乘法器的设计, 采用了改进的Booth 编码, 和Wallace树结构, 在减少部分积的同时, 使系统具有高速度, 低功耗的特点, 并且结构规则, 易于VLSI的实现
    发表于 05-08 07:44

    硬件乘法器是怎么实现的?

    硬件乘法器是怎么实现
    发表于 09-22 06:53

    基于Verilog HDL设计实现乘法器性能研究

    本文在设计实现乘法器时,采用了4-2 和5-2 混合压缩器对部分积进行压缩,减少了乘法器的延时和资源占用率;经Xilinx ISE 和Quartus II 两种集成开发环境下的综合仿真测试,与用
    发表于 09-17 11:13 27次下载

    一种用于SOC中快速乘法器的设计

    本文设计了适用于 SOC(System On Chip)的快速乘法器内核。通过增加一位符号位,可以支持24×24 无符号和有符号乘法。在乘法器的设计中,采用了改进的Booth
    发表于 09-21 10:40 20次下载

    基于FPGA 的单精度浮点数乘法器设计

    设计了一个基于FPGA的单精度浮点数乘法器.设计中采用改进的带偏移量的冗余Booth3算法和跳跃式Wallace树型结构,并提出对Wallace树产生的2个伪和采用部分相加的方式,提高了乘法器
    发表于 09-29 16:46 44次下载

    1/4平方乘法器

    1/4平方乘法器 这种乘法器是根据数学关系设计而成的,因此称为1/4平方乘法电路,或称1/4平方乘法器。其
    发表于 05-18 14:08 1815次阅读
    1/4平方<b class='flag-5'>乘法器</b>

    N象限变跨导乘法器

    N象限变跨导乘法器 为了克服图5.4-25所示的乘法器的缺点,在基电路的基础上,采用了双重差分放大式结构,设计出如图5.4-27所示的N象限变跨导乘法器
    发表于 05-18 15:24 1580次阅读
    N象限变跨导<b class='flag-5'>乘法器</b>

    变跨导乘法器

    变跨导乘法器 这种乘法器现在已经成为一种工业上的标准方法,是应用极为广泛的优质乘法器
    发表于 05-18 16:00 1115次阅读

    基于IP核的乘法器设计

    实验目的 1、熟悉Xilinx的ISE 软件的使用和设计流程; 2、掌握Modelsim仿真软件的使用方法; 3、用乘法运算符实现一个16*16 乘法器模块; 4、用IP核实现一个16
    发表于 05-20 17:00 66次下载
    基于IP核的<b class='flag-5'>乘法器</b>设计

    8乘8乘法器verilog源代码

    8乘8乘法器verilog源代码,有需要的下来看看
    发表于 05-23 18:21 24次下载

    一种高速流水线乘法器结构

    设计了一种新颖的3232位高速流水线乘法器结构.该结构所采用的新型Radix-16 Booth算法吸取了冗余Booth编码与改进Booth
    发表于 03-15 13:34 6次下载
    一种高速流水线<b class='flag-5'>乘法器</b>结构

    使用verilogHDL实现乘法器

    ,与用VerilogHDL语言实现的两位阵列乘法器和传统的 Booth编码乘法器进行了性能比较,得出用这种混合压缩的器乘法器要比传统的4-2
    发表于 12-19 13:30 1.1w次阅读
    使用verilogHDL<b class='flag-5'>实现</b><b class='flag-5'>乘法器</b>