您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 基于修正Booth算法的实用型移位式二进制乘法器电路
算数运算电路扩展实验(基于修正Booth算法的实用型移位式二进制乘法器电路)1、电路功能设计一个16-bit的移位式乘法器电路,要求:(1)采用修正Booth算法产生部分积;(2)采用右移部分积之和的部分积求和累加方式;(3)结果乘积寄存器为32-bit。2、电路设计(1)电路设计方案整体框图将电路分为6个子模块进行独立的设计,最后在采用一个顶层模块将之综合起来,6个子模块分别:①部分积产生电路:设被乘数为x,该电路功能是产生0,x,2x,并且x要进行符号位扩展。②加减法器电路该加减法器为17bit的加减法器,能够由Booth译码产生的控制信号en_add来控制进行加法运算还是减法运算(高电平为加法,低电平为减法),将结果送给乘积寄存器的左半部分。③Booth译码产生电路通过乘数y右移2位,与之前保留的一位,总共三位构成译码电路的输入,最终将译码结果送给MUX8_3选择器,让其选出正确的部分积(0,x,2x)来参与下次的加法运算,同时Booth译码电路还产生一位控制加法器电路的控制信号en_add。④MUX数据选择器该MUX选择电路是通过译码电路产生的译码信号来选择下一步所需的部分积(0,x,2x)。⑤乘数y的右移电路先给y最高位和最低位均补0,然后每个时钟上升沿到来,将之右移2位,在通过内部控制信号,向右移9次。⑥部分积之和右移电路将加法器产生的输出放在其高16位,同时进行右移2位操作,并进行符号位的扩展。然后再将移位后的高16位送给加法器的被加数端,进行下一次的部分积求和,再通过内部控制信号,控制其向右移9次,最终得到正确的乘积。(2)电路设计①部分积的产生电路moduleCreat_part_pro(input[15:0]x,outputreg[16:0]x_0,outputreg[16:0]x_1,outputreg[16:0]x_2);always@(*)beginif(x[15])beginx_0=17'b0;x_1={1'b1,x};x_2={x1};endelsebeginx_0=17'b0;x_1={1'b0,x};x_2={x1};endendendmodule电路说明:x:输入的16位被乘数x_0:输出0x_1:输出x,并进行符号位扩展x_2:输出2x②加减法器moduleAdd(inputrst_n,inputen_add,//高为加法,低位减法input[16:0]add1,input[16:0]add2,outputreg[16:0]part_sum//部分积之和,送往移存器);always@(*)beginif(!rst_n)part_sum=17'b0;elseif(en_add)part_sum=add1+add2;elsepart_sum=add2-add1;endendmodule电路说明:add1:被加数add2:加数en_add:加减控制信号(高为加,低为减)part_sum:输出和③数据选择器moduleMux_3_1(input[16:0]x_0,//产生的0,X,2Xinput[16:0]x_1,input[16:0]x_2,input[2:0]en_x,//译码产生的控制信号outputreg[16:0]addx_i///送往加法器,与部分积之和相加);always@(*)begincase(en_x)3'b000:addx_i=x_0;3'b001:addx_i=x_1;3'b010:addx_i=x_2;default:addx_i=x_0;endcaseendendmodule电路说明:x_i:分别是电路①产生的0,x,2xenx:选择控制信号,由Booth译码电路产生addx_i:输出送往加法器④Booth译码电路moduleBooth_encode(input[2:0]y_n,//乘数y的三位需要译码outputreg[2:0]en_x,outputregen_add//决定加法器加减,高加低减);always@(*)begincase(y_n)3'b000:en_x=3'b000;3'b001:en_x=3'b001;3'b010:en_x=3'b001;3'b011:en_x=3'b010;3'b100:en_x=3'b010;3'b101:en_x=3'b001;3'b110:en_x=3'b001;3'b111:en_x=3'b000;default:en_x=3'b000;endcaseendalways@(*)begincase(y_n)3'b000:en_add=1'b1;3'b001:en_add=1'b1;3'b010:en_add=1'b1;3'b011:en_add=1'b1;3'b100:en_add=1'b0;3'b101:en_add=1'b0;3'b110:en_add=1'b0;3'b111:en_add=1'b1;default:en_add=1'b1;endcaseendendmodule电路说明:y_n:由y产生的三位译码输入en_x:译码电路的输出,送往数据选择器en_add:送往加法器,决定加减⑤乘数y右移电路moduleShift_y_right_2bit(inputclk,inputrst_n,input[15:0]y,outputreg[2:0]encode_in);reg[3:0]shift_cnt;wireen_shift;always@(posedgeclkornegedgerst_n)beginif(!rst_n)beginshift_cnt=4'b0000;endelseif(shift_cnt==4'b1001)shift_cnt=4'b0000;elseshift_cnt=shift_cnt+1'b1;endassignen_shift=(shift_cnt==4'b1001)?1'b0:1'b1;reg[17:0]y_r;always@(posedgeclkornegedgerst_n)beginif(!rst_n)beginy_r=18'b0;encode_in=3'b000;endelseif(en_shift)beginencode_in={y_r[2:0]};y_r=y_r2;endelsebeginy_r={1'b0,y,1'b0};endendendmodule电路说明:clk:系统时钟rst_n:系统复位信号y:乘数encode_in:产生的译码,送往Booth译码器shift_cnt:移位计数器en_shift:允许移位标志⑥求积电路moduleCreat_product(inputclk,inputrst_n,input[16:0]part_pro,outputreg[32:0]product);reg[3:0]shift_cnt;wireen_shift;always@(posedgeclkornegedgerst_n)beginif(!rst_n)beginshift_cnt=4'b0000;endelseif(shift_cnt==4'b1001)beginshift_cnt=4'b0000;endelsebeginshift_cnt=shift_cnt+1'b1;endendassignen_shift=(shift_cnt==4'b1001)?1'b0:1'b1;always@(posedgeclkornegedgerst_n)beginif(!rst_n)beginproduct=33'b0;product[32:16]=17'b0;endelseif(!en_shift)beginproduct=33'b0;product[15:0]=16'b0;endelsebeginproduct={product[32],product[32],product[32:2]};product[32:16]=part_pro;endendwire[32:0]product_test;assignproduct_test={product[32],product[32],product[32:2]};endmodule电路说明:clk:系统时钟rst_n:复位信号part_pro:部分积之和,由上述的加法器电路产生product:输出积(此处由于时序问题,并不是正确的乘积)shift_cnt:移位计数器en_shift:允许移位标志product_test:经过仿真,这个才是正确的乘积⑦顶层模块moduleBooth_16bit_TOP(inputclk,inputrst_n,input[15:0]x,input[15:0]y,output[32:0]product);wire[16:0]x_0;wire[16:0]x_1;wire[16:0]x_2;Creat_part_proU_Creat_part_pro//部分积产生模块(.x(x),.x_0(x_0),.x_1(x_1),.x_2(x_2));wire[2:0]encode_in;wire[2:0]en_x;wireen_add;Booth_encodeU_Booth_encode//Booth译码电路产生模块(.y_n(encode_in),.en_x(en_x),.en_add(en_add));Shift_y_right_2bitU_Shift_y_right_2bit//右移y产生译码信号(.clk(clk),.rst_n(rst_n),.y(y),.encode_in(encode_in));wire[16:0]addx_i;Mux_3_1U_Mux_3_1//选择加x,还是2x(.x_0(x_0),.x_1(x_1),.x_2(x_2),.en_x(en_x),.addx_i(addx_i));wire[16:0]part_sum;///部分积产生模块AddU_Add(.rst_n(rst_n),.en_add(en_add),.add1(addx_i),.add2({product[32],product[32],product[32:18]}),.part_sum(part_sum));Creat_productU_Creat_product//积的产生(.clk(clk),.rst_n(rst_n),.part_pro(part_sum),.product(product));endmodule电路说明:将之前的六个模块联系起来,形成一个完整的乘法器电路。(3)电路的整体结构图(4)电路仿真经过多个测试数据检验,证明了电路的正确性。
本文标题:基于修正Booth算法的实用型移位式二进制乘法器电路
链接地址:https://www.777doc.com/doc-6283121 .html