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,可以看到仿真波形中,正确的得到了计算结果,并且有效标志信号也同步输出。

验证成功!

图片

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

    关注

    31

    文章

    5317

    浏览量

    120002
  • Verilog
    +关注

    关注

    28

    文章

    1343

    浏览量

    109980
  • 乘法器
    +关注

    关注

    8

    文章

    205

    浏览量

    36974
  • 累加器
    +关注

    关注

    0

    文章

    50

    浏览量

    9440
  • MSB
    MSB
    +关注

    关注

    0

    文章

    13

    浏览量

    8250
收藏 人收藏

    评论

    相关推荐

    基于EPF10K100EQ 240-132和Booth编码实现位浮点阵列乘法器的设计

    阵列乘法器的设计, 采用了改进的Booth 编码, 和Wallace树结构, 在减少部分积的同时, 使系统具有高速度, 低功耗的特点, 并且结构规则, 易于VLSI的实现
    发表于 11-06 12:47 1951次阅读
    基于EPF10K100EQ 240-132和<b class='flag-5'>Booth</b>编码<b class='flag-5'>实现</b>位浮点阵列<b class='flag-5'>乘法器</b>的设计

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

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

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

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

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

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

    基于跳跃式Wallace树的低功耗32位乘法器

    为了提高乘法器的综合性能,从3个方面对乘法器进行了优化设计。采用改进的Booth算法生成各个部分积,利用跳跃式Wallace树结构进行部分积压缩,通过改进的LING加
    发表于 04-17 09:35 27次下载

    基于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次下载

    数字阵列乘法器算法及结构分析

    对数字阵列乘法器的移位加算法、Pezaris 算法、Baugh-Wooley 算法的性能进行了分析,讨论其各自的特点;指出进一步提高并行快速乘法器
    发表于 12-14 09:28 41次下载

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

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

    乘法器的基本概念

    乘法器的基本概念 乘法器是一种完成两个互不相关的模拟信号相乘作用的电子器件。理想乘法器的输出特性方程可由下式表示: UO
    发表于 05-18 14:03 1.4w次阅读
    <b class='flag-5'>乘法器</b>的基本概念

    基于FPGA的高速流水线浮点乘法器设计与实现

    设计了一种支持IEEE754浮点标准的32位高速流水线结构浮点乘法器。该乘法器采用新型的基4算法,改进的4:2压缩结构和部分积求和电路,完成Carry Save形式的部分积压缩,再
    发表于 02-29 11:20 3510次阅读

    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>

    乘法器原理_乘法器的作用

    乘法器(multiplier)是一种完成两个互不相关的模拟信号相乘作用的电子器件。它可以将两个二进制数相乘,它是由更基本的加法器组成的。乘法器可以通过使用一系列计算机算数技术来实现
    发表于 02-18 15:08 2.6w次阅读
    <b class='flag-5'>乘法器</b>原理_<b class='flag-5'>乘法器</b>的作用