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

布斯算法介绍
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为例,做一个计算过程的举例。
将所有寄存器初始化,累加器a初始化为0,乘数加载寄存,最低位移出位设定为0。判定最低位和移出位为“00”,不进行加减操作,将结果结果值右移一位。判定最低位和移出位为“00”,不进行加减操作,将结果结果值右移一位。判定最低位和移出位为“10”,对累加器减去被乘数,并将结果结果值右移一位,注意此时累加器a为负数。判定最低位和移出位为“10”,不进行加减操作,将结果结果值右移一位,此时累加器为负数,因此右移最高位补1。判定最低位和移出位为“10”,不进行加减操作,将结果结果值右移一位,此时累加器为负数,因此右移最高位补1。计数器为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; endend//状态机第二段,状态跳转,组合逻辑阻塞赋值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 endcaseend//状态机第三段,结果输出,时序逻辑非阻塞赋值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 >1; end 2'b10: begin z > >1; end 2'b01: begin z > >1; end endcase end finish: begin cnt <= 'd0; q_reg <= 'd0; z <= z; end endcase endendassign valid = (state==finish);endmoduletestbench 代码
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*//* 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/1nsmodule 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; endbooth_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,可以看到仿真波形中,正确的得到了计算结果,并且有效标志信号也同步输出。
验证成功!

宏光Mini EV爆红后,A00级电动车市场热情重燃
分享几种可以与MATLAB媲美的开源工具
定位于自动驾驶的域控制器系统应运而生!
庭院太阳能LED照明灯电路
非易失性存储器-Nor Flash的特点都有哪些
布斯算法(Booth Algorithm)乘法器的Verilog实现
用于AM/FM、ISM频段、LoRa传输以及卫星追踪的RTL-SDR简介
Unity与HERE达成合作,共创未来汽车新体验
如何通过使用Docker来快速搭建IPsec VPN Serve?
如何利用电流隔离来消除接地环路
窄频低功耗网络协议 最大化物联网节点容量
华为mate9正在内部测试Android O?华为再次抢先一步,试运安卓8.0,快的飞起
Bose将在明年推出新的降噪耳机
新能源汽车有哪些_新能源汽车价格表_5万到10万的新能源汽车
chisel(二)scala语法 函数与变量
6N1电子管耳放的电源电路图
解析4680电池和21700电池
基于蒙特卡罗方法的理论
奥克斯空调多重优惠“花式”来袭 巅峰狂欢趴即将开幕
人脸识别系统现如今已发展到了什么程度?