【Verilog】布斯算法(Booth Algorithm)乘法器的 Verilog 实现
目录布斯算法介绍计算步骤计算流程图举个栗子Verilog 实现设计思想Verilog 代码TestBench 代码仿真波形布斯算法介绍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并且净效应被解释为相应值的负数。计算步骤使用的寄存器AMQQresQres是Q右移后的残余位n计数器第 1 步加载寄存器的初始值。A 0累加器Qres 0M 乘法Q 乘法器n是等于乘法器位数的计数值。第 2 步检查 {Q0Qres} 的值。如果为 00 或 11请转到步骤 5。如果为01转到步骤3。如果为 10转到步骤 4。第 3 步执行 A A M转到步骤 5。第 4 步执行 A A - M。第 5 步执行 {AQQres} 的算术位移和递减计数。第 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) /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ module booth_multiple( input clk, input rst, input start, input signed [3:0] X, input signed [3:0] Y, output reg signed [7:0] Z, output valid ); /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /* 参数和信号申明 */ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ parameter IDLE 3b001; parameter CACULATE 3b010; parameter FINISH 3b100; 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],1b0}; Z {4b0000,Y}; end CACULATE: begin cnt cnt d1; q_reg {Y[cnt1],Y[cnt]}; case(q_reg) 2b00,2b11: begin Z $signed(Z)1; end 2b10: begin Z $signed({Z[7:4]-X,Z[3:0]})1; end 2b01: 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 (stateFINISH); 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/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可以看到仿真波形中正确的得到了计算结果并且有效标志信号也同步输出。验证成功
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2423952.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!