Booth算法_乘法器实验报告
实验二_乘法器
2 运算器部件实验:乘法器 (1)2.1、实验目的 (1)2.2、实验原理 (1)2.3、实验步骤 (7)2.4、实验现象 (7)2.5、思考题 (8)2 运算器部件实验:乘法器2.1、实验目的1、掌握乘法器以及booth乘法器的原理2.2、实验原理首先我们看一下十进制数的乘法。
为了方便起见,我们假定十进制数的各位要么为1要么为0,例如1000×1001:被乘数 1 0 0 010乘数× 1 0 0 1101 0 0 00 0 0 00 0 0 01 0 0 0积 1 0 0 1 0 0 010从上面的步骤我们可以看到,1)从右到左用乘数的每一位乘以被乘数,每一次乘得的中间结果比上一次的结果往左移一位。
2)积的位数比被乘数和乘数的位数要多的多。
事实上,如果我们忽略符号位,n位的被乘数和m位的乘数相乘的结果的位数有(n+m)位。
因此,乘法必须象加法那样处理溢出问题,如果两个32位的数相乘,积也只有32位的时候,就会出现溢出。
在上面的例子中,我们把十进制数的各位限制为0或1。
因此,每一步的乘法相当简单:1)如果乘数位是1,则简单的复制被乘数到合适的位置(1×被乘数);2)如果乘数位是0,则在合适的位置置0因为二进制数的各位是0或1,所以与上面情况类似。
既然已经知道了乘法的基本规律,下一步就是设计高度优化的乘法器硬件。
为了让大家更明了乘法器的原理,我们一一列举乘法器的三个版本的改进。
我们先假定被乘数和乘数都是正数。
1、第一代乘法器初始的设计模拟我们刚才提到的乘法流程,硬件结构如图2.1所示。
假定乘数在32位乘数寄存器里,64位的积寄存器初始化为0,显然每一步需要把被乘数左移一位。
左移32次之后,被乘数的32位会被移到左边,因此我们需要64位的被乘数寄存器,初始状态为低32位是被乘数,高32位是0。
这个寄存器每一步左移一位,和中间结果对齐,进行相加,相加的结果存在被乘数寄存器里。
基于形式化方法的Booth乘法器可靠性研究的开题报告
基于形式化方法的Booth乘法器可靠性研究的开题报告一、研究背景和研究意义数字电路是现代数字系统的核心,其可靠性直接决定了整个系统的可靠性。
在众多数字电路中,乘法器是一个特别重要的组成部分,其性能和可靠性都对整个系统的性能产生重要影响。
目前,Booth乘法器是一种常见的乘法器,其在低功耗、高速、可靠性等方面都具有优异的特点,已被广泛应用于数字信号处理、图像处理和通信系统等领域。
然而,随着集成度的不断提高和电压规模的不断缩小,Booth乘法器的可靠性也面临着越来越大的挑战。
在现有的设计方法中,往往只能对Booth乘法器进行部分验证,无法全面分析其可靠性。
因此,需要采用更加全面、精确、可靠的验证方法来确保Booth乘法器的可靠性。
二、研究目的和主要内容本研究旨在基于形式化方法,通过模型验证的手段深入研究Booth乘法器的可靠性问题,探索Booth乘法器的设计优化和可靠性提升方法。
具体研究内容包括以下几个方面:(1)建立Booth乘法器的数学模型,研究其逻辑功能和特性,并提出相应的形式化验证方法。
(2)基于模型检测、定理证明等形式化方法,对Booth乘法器进行严格的可靠性分析,并发现可能存在的故障和漏洞。
(3)提出相应的自动化验证工具和算法,帮助设计者发现和修复可靠性问题,提高Booth乘法器的可靠性。
(4)根据实验结果,总结Booth乘法器的设计优化和可靠性提升方法,为数字电路设计提供参考。
三、研究方法和技术路线本研究使用形式化方法,通过建立Booth乘法器的数学模型和形式化验证手段,探索Booth乘法器的可靠性问题。
具体研究方法和技术路线如下:(1)建立Booth乘法器的数学模型。
通过对Booth乘法器的逻辑结构和数学原理进行分析,建立其形式化模型,并使用模型检测、定理证明等工具验证模型的正确性。
(2)设计并编写相应的自动化验证工具和算法。
选择适合Booth乘法器的验证工具,编写相应的程序对Booth乘法器进行验证,并根据实验结果提出相应的优化策略。
计算机组成原理实验_乘法器
数学与计算机学院计算机组成原理实验报告年级08信计学号2008431066 姓名刘泽隶实验地点主楼528 指导教师陈昊实验项目运算器部件实验乘法器实验日期2010-11-10一、实验目的理解并掌握乘法器的原理。
二、实验原理(1)从右到左用乘数的每一位乘以被乘数,每一次乘得的中间结果比上一次的结果往左移一位。
(2)积的位数比被乘数和乘数的位数要多得多。
如果忽略符号位,n位的被乘数和m位的乘数相乘的结果的位数有(m+n)位。
每一位的乘法:(1)如果乘数位是1,则简单的复制被乘数到合适的位置(1*被乘数);(2)如果乘数位是0,则在合适的位置置0。
三、实验步骤(1) 打开QuartusⅡ,参照3.4节,安装ByteBlasterⅡ。
(2) 将子板上的JTAG端口和PC机的并行口用下载电缆连接。
打开实验台电源。
(3) 执行Tool->Progmmer命令,将Hamming.sof下载到FPGA中。
SOF(SRAMobject file)类型的文件是一种课下载到FPGA中的目标文件。
注意在执行Programmer命令中,英在program/configure下的方框中打钩,然后下载。
(4) 在实验台上通过模式开关选择FPGA-CPU独立调试模式010。
(5)将开关CLKSEL拨到0,将短路子DZ3短接且短路子DZ4断开,使FPGA-CPU所需要的时钟使用正单脉冲时钟。
四、实验现象本实验实现4位数的Booth乘法(有符号数乘法)输入输出规则对应如下:(1)输入的4位被乘数md3~md0对应开关SD11~SD8。
(2)输入的4位乘数mr3~mr0对应开关SD3~SD0。
(3)按单脉冲按钮,输入脉冲,也即节拍。
(4)乘积productp8-p0,对应灯A8-A0。
(5)当计算结束时,final信号为1,对应灯A7。
如表所示的booth算法运算过程,4位乘法一共需要0-8共9个小步骤计算出结果,本实验也是通过9个小步骤实现的,通过按单脉冲按钮输入脉冲,观察积寄存器的变化,掌握booth乘法器的原理。
基于修正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)电路设计①部分积的产生电路module Creat_part_pro(input [15:0] x,output reg [16:0] x_0,output reg [16:0] x_1,output reg [16:0] x_2);always@(*)beginif (x[15])beginx_0 = 17'b0;x_1 = {1'b1,x};x_2 = {x<<1};endelsebeginx_0 = 17'b0;x_1 = {1'b0,x};x_2 = {x<<1};endendendmodule电路说明:x:输入的16位被乘数x_0: 输出0x_1:输出x,并进行符号位扩展x_2:输出2x②加减法器module Add(input rst_n,input en_add,//高为加法,低位减法input [16:0] add1,input [16:0] add2,output reg [16:0] part_sum//部分积之和,送往移存器);always @(*)beginif (!rst_n)part_sum = 17'b0;else if(en_add)part_sum = add1 + add2;elsepart_sum = add2 - add1;endendmodule电路说明:add1:被加数add2:加数en_add:加减控制信号(高为加,低为减)part_sum:输出和③数据选择器module Mux_3_1(input [16:0] x_0,//产生的0,X,2Xinput [16:0] x_1,input [16:0] x_2,input [2:0] en_x,//译码产生的控制信号output reg [16:0] addx_i ///送往加法器,与部分积之和相加);always @(*)begincase (en_x)3'b010 : addx_i = x_2;default : addx_i = x_0;endcaseendendmodule电路说明:x_i :分别是电路①产生的0,x,2xenx:选择控制信号,由Booth译码电路产生addx_i:输出送往加法器④Booth译码电路module Booth_encode(input [2:0] y_n,//乘数y的三位需要译码output reg [2:0] en_x,output reg en_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;default : en_add = 1'b1;endcaseendendmodule电路说明:y_n:由y产生的三位译码输入en_x:译码电路的输出,送往数据选择器en_add:送往加法器,决定加减⑤乘数y右移电路module Shift_y_right_2bit(input clk,input rst_n,input [15:0] y,output reg [2:0] encode_in);reg [3:0] shift_cnt;wire en_shift;always@(posedge clk or negedge rst_n)beginif (!rst_n)beginshift_cnt <= 4'b0000;endelse if (shift_cnt == 4'b1001)shift_cnt <= 4'b0000;elseshift_cnt <= shift_cnt + 1'b1;endassign en_shift = (shift_cnt == 4'b1001) ? 1'b0 : 1'b1;reg [17:0] y_r;always@(posedge clk or negedge rst_n)beginif (!rst_n)beginy_r <= 18'b0;encode_in <= 3'b000;endelse if(en_shift)beginencode_in <= {y_r[2:0]};y_r <= y_r >> 2;endelsebeginy_r <= {1'b0,y,1'b0};endendendmodule电路说明:clk:系统时钟rst_n:系统复位信号y:乘数encode_in:产生的译码,送往Booth译码器shift_cnt:移位计数器en_shift:允许移位标志⑥求积电路module Creat_product(input clk,input rst_n,input [16:0] part_pro,output reg [32:0] product);reg [3:0] shift_cnt;wire en_shift;always@(posedge clk or negedge rst_n)beginif (!rst_n)beginshift_cnt <= 4'b0000;endelse if (shift_cnt == 4'b1001)beginshift_cnt <= 4'b0000;endelsebeginshift_cnt <= shift_cnt + 1'b1;endendassign en_shift = (shift_cnt == 4'b1001) ? 1'b0 : 1'b1;always@(posedge clk or negedge rst_n)beginif (!rst_n)beginproduct <= 33'b0;product[32:16] <= 17'b0;endelse if(!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;assign product_test = {product[32],product[32],product[32:2]}; endmodule电路说明:clk:系统时钟rst_n:复位信号part_pro:部分积之和,由上述的加法器电路产生product:输出积(此处由于时序问题,并不是正确的乘积)shift_cnt:移位计数器en_shift:允许移位标志product_test:经过仿真,这个才是正确的乘积⑦顶层模块module Booth_16bit_TOP(input clk,input rst_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_pro U_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;wire en_add;Booth_encode U_Booth_encode //Booth译码电路产生模块(.y_n (encode_in),.en_x (en_x),.en_add (en_add));Shift_y_right_2bit U_Shift_y_right_2bit //右移y产生译码信号(.clk (clk),.rst_n (rst_n),.y (y),.encode_in (encode_in));wire [16:0] addx_i;Mux_3_1 U_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; ///部分积产生模块Add U_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_product U_Creat_product //积的产生(.clk (clk),.rst_n (rst_n),.part_pro (part_sum),.product (product));endmodule电路说明:将之前的六个模块联系起来,形成一个完整的乘法器电路。
booth编码乘法器
booth编码乘法器
Booth编码乘法器是一种实现定点补码一位乘的乘法器,采用Booth算法来实现。
这种算法采用相加和相减的操作计算补码数据的乘积,对
乘数从低位开始判断,根据后两个数据位的情况决定进行加法、减法
还是仅仅进行移位操作。
具体来说,Booth编码将乘数中的位划分为不同的组,每一组包括3位,这些组互相交叠。
这种编码可以减少部分积的数目(即减少乘数中1
的个数),用来计算有符号乘法,提高乘法运算的速度。
在Booth编码乘法器中,首先将乘数进行Booth编码,然后将编码后
的乘数和被乘数相加,得到部分积,再将部分积移位并重复上述操作,直到完成所有位的乘法运算。
booth算法浮点乘法器
booth算法浮点乘法器(原创版)目录1.Booth 算法简介2.Booth 算法的原理3.Booth 算法的实现4.Booth 算法的应用5.Booth 算法的优缺点正文1.Booth 算法简介Booth 算法是一种用于计算机中浮点数乘法的算法,它可以提高计算机中浮点数乘法的运算速度。
在计算机科学中,浮点数乘法是一个非常重要的运算,因为许多科学计算和工程应用都需要进行大量的浮点数乘法运算。
2.Booth 算法的原理Booth 算法的原理是减少乘法过程中所需的乘法次数。
在传统的浮点数乘法中,我们需要进行多次乘法运算才能得到最终的结果。
而 Booth 算法通过观察两个数的小数点位置,可以减少乘法次数,从而提高运算速度。
3.Booth 算法的实现Booth 算法的实现过程可以分为以下几个步骤:(1) 观察两个数的小数点位置,确定它们的乘积的小数点位置。
(2) 根据小数点位置,将两个数分成整数部分和小数部分。
(3) 对整数部分进行乘法运算,得到一个中间结果。
(4) 对小数部分进行乘法运算,得到最终的结果。
4.Booth 算法的应用Booth 算法广泛应用于计算机科学中,它可以提高计算机中浮点数乘法的运算速度。
Booth 算法不仅可以用于普通的浮点数乘法,还可以用于大量的并行计算中,进一步提高运算速度。
5.Booth 算法的优缺点Booth 算法的优点是可以减少乘法次数,提高运算速度。
与传统的浮点数乘法相比,Booth 算法可以大大提高运算速度,特别是在大规模数据处理中。
Booth 算法的缺点是它的实现过程比较复杂,需要进行多次条件判断和指针操作。
64位乘法器实验报告
64位乘法器实验报告64位乘法器设计实验是我在科大的第一个课程设计,verilog程序的熟练掌握对于微电子专业的学生来讲是非常必要的,对于此次设计我也花费了很长时间。
本设计分为3个部分,即控制和(1)状态选择部分,(2)乘法器部分,(3)加法器部分。
以下我将按此顺序进行说明。
需要指出的是,在实际设计中的顺序恰好是颠倒的,这与设计思路有关,在刚开始的时候由于对整体没有一个很好的把握就先选择最简单的一部分几加法器开始入手,然后就是乘法器,最后作乐一个状态控制电路将两部分联系起来。
状态选择部分设计:本电路状态选择部分设计比较简单,只有一个控制信号sel来控制电路的工作状态,我选定的状态是:sel为00的时候做加法,sel为01时做减法,sel为10时做乘法。
从节省功耗的角度出发,当电路处于加法状态的时候,乘法器最好是能够不工作,反之也一样在乘法器工作时要求加法器也处于不工作状态。
我在设计中在两个电路块的输入上都加了一个二选一开关,使不处于工作状态的电路块的输入始终为0,可是使电路减少由动态翻转产生的功耗。
加法器的设计:为了能更好地掌握加法器的设计过程,本部分采用门级描述语言,本加法器采用流水线的设计方案。
实际上该部分是不需要流水,因为乘法器是本电路的关键路径,即使乘法器采用流水线的设计方案延迟也肯定比加法器要大。
为了能够掌握流水线设计,加法器也采用了流水线来实现。
加法器的整体结构见附图(1),有超前进位产生电路,和超前进位电路来实现。
超前进位产生电路是对两个64位输入按位进行异或和与从而产生超前进位电路的输入信号P,Q。
教材上在此处也产生了部分和结果S,但我认为在此处产生结果不妥,因为要产生部分和结果必须有上一级的进位信号,对于本加法器进位信号将在下一步才产生。
所以我将作后结果的产生放在了最后一拍来完成将P与产生的进位信号按位异或即可得到最后结果。
但要注意P与进位信号CP产生的时间是不一致的,所以P信号要送到寄存器中等待一拍。
booth8乘法器实验
8位booth乘法器设计实验一、实验分析:4 位位宽:A=7(0111),B=2(0010)。
A = (7) 0000 0111;2A = (14) 0000 1110;-2A = (-14) 1111 0010。
在这里我们必须注意一下当B[1:-1] 等于011 或者100 的时候,4 位的被乘数A 的取值范围最大是-7 ~ 7 然而,+2(被乘数) 或者-2(被乘数) 都会使得A 的最大值突破取值范围。
所以需要从4 位位宽的空间向更大的位位宽空间转换。
这里就选择向8 位位宽的空间转换。
B 乘数加码为B[1:-1] = 3'b100 ,亦即-2(被乘数) 和B[3:1] = 3'b100 ,亦即+被乘数。
二、实验所需程序:module booth8(A,B,clk,product);input [7:0] A,B;input clk;output [15:0] product;reg [3:0] i;reg [15:0] a;reg [15:0] a2;reg [15:0] s;reg[15:0] s2;reg [15:0] p;reg [3:0] M;reg [8:0] N;reg [15:0] p1;always @(posedge clk)begini <= 4'd0;case(i)0:begina <= A[7] ? { 8'hFF , A } : { 8'd0, A };a2 <= A[7] ? { 8'hFF ,A + A} :{ 8'd0,A + A };s <= ~A[7] ? { 8'hFF , (~A + 1'b1 )} : { 8'd0 ,( ~A + 1'b1 )};s2 <=~A[7] ? {8'hFF , ( ~A + 1'b1 ) + (~A+1'b1)} : { 8'd0 , (~A + 1'b1) + (~A + 1'b1)};p <= 16'd0;p1<=16'd0;M <= 4'd0;N <= { B , 1'b0};i <= i+ 1'b1;end1,2,3,4:beginif( N[2:0] == 3'b001 || N[2:0] == 3'b010 ) p <= p+ (a<< M);else if (N[2:0] == 3'b011 ) p <= p+ ( a2 << M );else if (N[2:0] == 3'b100 ) p <= p + ( s2 << M);else if ( N[2:0] == 3'b101 || N[2:0] == 3'b110 ) p <= p + (s << M);M <= M + 2'd2;N <= ( N >> 2);i <= i + 1'b1;end5:beginif(i==5) p1<= p;endendcaseendassign product = p1;endmodule二、实验结果及功能仿真:(下页)功能仿真图可以看到,在得到正确解之前经历了多个时钟,这是因为需要计算四次所致的,本来应该在正确解之前会有三个数值的,为了更好的查看结果,本程序采用屏蔽手段使其前三个值为零了。
基于FPGA的Booth算法乘法器
Booth算法乘法器可以看做是一种“加码”乘法运算。
这是数学角度的Booth算法。
这里的B[-1]是什么意思呢?B的最右边的后面一位就称为B[-1],假设B是2即4’b0010。
加上B[-1]位的效果就是4’b0010_0。
后边这个0是默认的。
实现B[0:-1]时,可以将B 对某个变量赋值,例N<={B,1’b1},此时的N[1:0]就是B[0:-1]。
从数学的角度来看Booth算法是比较麻烦的,需要进行移位相加等操作。
当从位操作的角度来看,Booth算法的优势就可以体现出来。
这是位操作的Booth算法。
设乘数和被乘数都为4位,即n=4。
这里要建立一个P空间,容量为2*n+1,还要将p空间初始化,默认为0;第一步:先用补码的形式表现出-1*被乘数,方便一会儿做减法,将p[4:1]填入乘数B,空出来的p[0]相当于前边的N[0],即为了方便使用B[-1];第二步:判断p[1:0],因为已经将乘数B填入到P[4:1],所以p[1:0]即对应的B[0:-1];判断p[1:0]的值于上表对应,进行相应的操作。
表中提到的加减被乘数,是要在p[2n:n+1]位进行,这个需要注意。
所谓的p空间右移一位,高位需要补充一位。
补充的这一位,要由进行加减被乘数以后的p[8](p[2n])决定,p[8]是1补充1,是0补充0;此步骤循环n次,最后结果取p[8:1];相应核心代码(8位)case(i)0:begin a<=A;s<=(~A+1’b1);p<={8’d0,B,1’b0};i<=i+1’b1;end//a寄存被乘数,s寄存被乘数的补码,对p空间装填乘数B1:If(X==8) begin X<=4’d0;i<=i+1’b2;endelse if(p[1:0]==2’b01)begin p<={p[16:9]+a,p[8:0]};i<=i+1’b1;endelse if(p[1:0]==2’b10)begin p<={p[16:9]+s,p[8:0]};i<=i+1’b1;endelsei<=i+1’b1;在八次循环前对p[1:0]进行判断,然后进行相应的操作(加减被乘数)。
八位二进制乘法器booth
八位二进制乘法器booth八位二进制乘法器Booth是一种快速计算二进制乘法的方法,其原理是将被乘数与乘数一起转化为二进制补码形式,然后进行位移和相加运算,最终得出乘积。
下面我们就来详细了解Booth乘法器的实现流程。
1. 将被乘数和乘数转化为二进制补码形式Booth乘法器的第一步是将被乘数和乘数转化为8位二进制补码形式。
具体来说,要将它们分别转化为8位带符号的二进制数,如果是正数则其二进制与原数相同,如果是负数则其二进制为其绝对值的原码取反加1。
2. 初始化Booth乘法器Booth乘法器的第二步是对其进行初始化。
具体来说,要先在最左侧添加一个0,然后添加8个辅助位,辅助位一般初始化为0。
3. 进行循环,执行移位和加减运算Booth乘法器的第三步是进行循环,每次循环都要进行移位和加减运算。
具体来说,在每一次循环中,都将乘数向右移动一位,并将最后一位的值赋给辅助位。
然后,根据当前乘数的最后一位和辅助位的值,选择加上或者减去被乘数。
4. 得出结果Booth乘法器的最后一步是得出结果。
具体来说,将得到的答案转化为二进制补码形式,然后去掉最左侧辅助位即可得到最终的八位乘积。
除了上述四个步骤外,还有一些细节需要注意。
例如,在进行加减运算时,要先将乘数和被乘数进行符号扩展,将它们分别扩展为一个9位数,扩展时要将第8位的符号复制到第9位。
此外,在进行移位时,要注意移位后最左侧位的值是否为1,如果是1,要进行2次减法。
综上所述,Booth乘法器可以大大加快二进制乘法的运算速度,是一种十分实用的计算方法。
《乘法器设计报告》word版
有符号乘法器设计报告——VLSI课程设计2010年12月复旦大学专用集成电路与国家重点实验室第一章 设计要求完成16*16有符号乘法器的设计。
具体设计方案选择要求如下:1、 编码方式:non-booth 编码,Booth 编码,Booth2编码(任选一种)2、 拓扑结构:简单阵列,双阵列,二进制树,Wallace 树(任选一种)3、 加法器:Ripple Carry Adder ,Carry bypass ,Carry select ,Carrylook ahead (任选一种或采用混合方法)设计报告必须包含设计方案说明及选择该方案的理由、仿真和设计结构等。
第二章 设计分析在微控制器(MCU )、微处理器(MPU )、数字信号处理器(DSP )、滤波器(FIR/IIR )等各种电路中都会用到乘法器,乘法器是最基本、最重要的运算模块之一。
并且乘法器往往还是处在关键路径上,所以乘法器的性能就显得更加重要。
伴随着现在工艺水平的提高,模块的面积也随着减小,在一定程度下以面积为代价来追求性能的提升,这也是允许的。
本设计是以追求性能为设计目标的,采用全并行的乘法器电路,设计指标设为传播延时为5ns 。
第三章 乘法器原理分析乘法器通常有三种结构形式,全串行乘法器、串并行乘法器以及全并行乘法器。
全串行乘法器都可以是串行的,需要多个时钟周期,速度很慢;串并行乘法器的一个输入是并行的,另一输入是串行的,乘积串行输出;全并行乘法器,输入和输出都是并行的,电路较为复杂,但是速度极快。
本设计追求的就是速度,所以采用全并行乘法器机构。
16位有符号乘法器可以分为三个部分:根据输入的被乘数和乘数产生部分积、部分积压缩产生和和进位、将产生的和和进位相加。
这三个部分分别对应着编码方式、拓扑结构以及加法器。
3.1 编码方式本设计采用booth2编码。
Booth 算法的提出主要是为了解决有符号数乘法运算中的复杂的符号修正的问题,所以采用booth2编码对于补码表示的两数就不需要考虑符号的问题。
Booth乘法器
Booth乘法器设计1. 实验目的要求掌握Booth算法原理,并根据算法设计Booth乘法器模块以及设计test_bench,最后在Robei可视化仿真软件经行功能实现和仿真验证。
2.实验原理1951年,A.D Booth在其论文“A Signed binary multiplication technique”中提出一种快速乘法算法,即Booth算法,是为了解决有符号乘法运算中复杂的符号修正问题而提出一种乘法算法。
乘法器中若乘数为有符号数,扩展其最高位;若是无符号数,则做一位0扩展。
Booth算法的基础基于二进制数加法的特性,其基本思想为当x乘以一个二进制数时可以将乘数中连续的1序列变换为(2i-2j),其中i>j,然后利用二进制数乘法的特性等于将2i 乘以x向左移i位,只需一个加法器和一个移位寄存器便可实现该段数据的(2i-2j)乘以x 乘法运算,i>j,从而有效减少总体需要的加法运算次数。
假设乘数和被乘数均为n位,那么Booth算法的具体执行过程以下六个步骤:(1)设置一个2n+1位的p空间,并将初始化为0;(2)将乘数填入p[n:1]中;(3)从p空间的最低位依次开始向左扫描,每次扫描两位,并判断所扫描的两位二进制数为表1中的何种情况;表1. Booth算法的加码操作B[i] B[i-1] 加码操作0 0 0(无操作)0 1 1(加被乘数)1 0 1(减被乘数,即加被乘数的补码)1 1 0(无操作)(4) 判断p[2n]位,如果是逻辑0右移一位补0,如果是逻辑1就右移一位补1; (5) 重复步骤(3)(4),循环n 次;(6) 最终p 空间的p[2n:1]就是乘数和被乘数的乘积。
下图1显示Booth 乘法器模块的设计:start_sig done_sig a[7:0] SI b[7:0] product[15:0]图1. Booth 乘法器模块的设计3.实验内容3.1 Booth_multiplier 模型设计1) 新建一个模型命名为 Booth_multiplier ,类型为 module ,同时具备 5 输入 2 输出,每个引脚的属性和名称参照下图2经行对应的修改。
booth乘法器报告
booth乘法器报告基于Booth编码和Wallace树的15*15⽆符号乘法器设计1.设计要求:设计15x15⽆符号数乘法器电路,采⽤改进booth编码和Wallace树部分积压缩算法,⽤给定的0.25um CMOS spice模型,⽤Hspice仿真器验证所设计的乘法器电路的正确性,并测量其最坏的延时时间。
假设乘法器的输⼊数据由⼩尺⼨的反相器构成的缓冲器输⼊(WP=0.5um, WN=0.25um, L都为0.25um),产⽣的积的输出要能够驱动相当于64个标准反相器尺⼨的外部负载。
延时的测量从输⼊缓冲器的输出信号的Vdd/2(Vdd=2.5V)电压处开始,到乘积的输出的信号Vdd/2电压,请优化乘法器的组合逻辑路径的延时。
如果要进⼀步减⼩乘法器电路的延迟,还可以有什么改进⽅法。
2.实验原理:在微处理器芯⽚中,乘法器是进⾏数字信号处理的核⼼,同时也是微处理器中进⾏数据处理的关键部件。
乘法器完成⼀次操作的周期基本上决定了微处理器的主频。
乘法器的速度和⾯积优化对于整个CPU的性能来说是⾮常重要的。
为了加快乘法器的执⾏速度,减少乘法器的⾯积,有必要对乘法器的算法、结构及电路的具体实现做深⼊的研究。
乘法器⼯作的基本原理是⾸先⽣成部分积,再将这些部分积相加得到乘积。
(1)Booth编码原理:Booth算法就是对乘数从低位开始判断,根据两个数据位的情况决定进⾏加法、减法还是仅仅移位操作。
判断的两个数据位位当前位及其右边的位(初始化需要增加⼀个辅助位0),移位操作是向右移动。
当⼆进制数第⼀次遇到1时,可以⽤减法取代⼀串的1,⽽当遇到最后⼀个1后⾯的0时,再加上被乘数。
假设X、Y都是⽤补码形式表⽰的机器数,[X]补和[Y]补=Ys.Y1Y2…Yn,都是任意符号表⽰的数。
⽐较法求新的部分积,取决于两个⽐较位的数位,即Yi+1Yi的状态。
Booth乘法规则归纳如下:⾸先设置附加位Yn+1=0,部分积初值[Z0]补=0。
八位“Booth二位乘算法”乘法器
⼋位“Booth⼆位乘算法”乘法器⽬录⼋位“Booth⼆位乘算法”乘法器原理补码乘法器之前介绍了⼏篇⽆符号乘法器或加法器的写法,当然,稍作修改也就可以改成符合有符号数的乘法器或加法器。
但是呢,我们之前写的乘法器或加法器,其实都是默认是正数来写的,⽽且是以正数的原码来写的,所以上⾯说稍作修改也就可以成为有符号数的乘法器或加法器,其实就是对我们以为的原码进⾏取补码,再进⾏乘法或加法的运算。
随着计算机硬件部件的升级,处理器技术的发展,现代处理器中的定点数(⼩数点位置固定)都是按照补码形式来存储的。
所以在之前写的⽆符号加法器中,只要利⽤:X_补+Y_补=[X+Y]_补就可以轻易将原先的加法器改写成有符号加法器——只要对结果再取⼀次补码即可。
但是乘法器呢?稍作学习可以知道,补码的乘法是这样的:X*Y_补=[X*Y]_补我们再考虑⼀下之前所说的:在现代处理器中的定点数都是按照补码形式来存储的。
所以我们要想得到两个数的乘法结果,⾸先应该知道被乘数的原码和补码,再对最终结果取补码,即可得到我们期望的乘法结果。
那么如何求“X*Y补”呢?在处理器中,⼀个⼆进制数Y补形如y7y6y5y4y3y2y1y0,也就是表⽰⼀个数的补码,那么它的原码是多少呢?补码的计算⽅法,除了“⾸位不变,余位取反再加⼀”的⽅式,还有⼀种就是“⽤溢出条件来减这个数”,在我们之前第⼀节课说⼆进制的时候,以钟表为例——“⼗⼆进制”,得到结论——“4是-8的补码”。
我们⽤第⼆种取补码的⽅式:-8的补码=12-8=4(这⾥没有考虑符号问题,只是求了补码的值)所以考虑⼀下符号的话,-8的补码=8-12=-4同理:⼗进制下,-4的补码=4-10=-6⼆进制下,-101补码=1101补码=101-1000=-011=1011这样解决求补码的⽅式在接下来的计算⽅⾯就更⽅便了,⾄于正数嘛,不变就好了。
回到上⾯的问题,⼀个⼆进制数Y补形如y7y6y5y4y3y2y1y0,它的原码是多少呢?根据:[X_补]_补=XY补的原码Y应该为:Y=(y_7*2^7+y_6*2^6+y_5*2^5+……+y_0*2^0)-1*2^8稍微化简⼀下:Y=-y_7*2^7+(y_6*2^6+y_5*2^5+……+y_0*2^0)所以我们如果想求X*Y,可以先求其补码:[X*Y]_补=[X*(-y_7*2^7)+X*(y_6*2^6+y_5*2^5+……+y_0*2^0)]_补根据补码加法“X补+Y补=[X+Y]补”再稍微化简⼀下:[X*Y]_补=-y_7*[X*2^7]_补+y_6*[X*2^6]_补+y_5*[X*2^5]_补+……+y_0*[X*2^0]_补再引⼊⼀个定理:[X*2^n]_补=X_补*2^n所以上式⼜可以换⼀种写法:[X*Y]_补=X_补*(-y_7*2^7+(y_6*2^6+y_5*2^5+……+y_0*2^0))=Y*X_补哦这不就是上⾯介绍过的补码乘法嘛:[X*Y]_补=Y*X_补=X*Y_补如果令⼀个数Y1补=y6y6y5y4y3y2y1y0,去掉了⾸位,那么上式是不是可以理解为:[X*Y]_补=X_补*Y1_补-y_7*X_补*2^7其中的Y1补不就刚好是Y补的后7位嘛?也就是说⼀个乘法可以分为两部分理解:⾸位的乘法和其他位的乘法。
乘法器实验报告
实验报告实验题目:乘法器姓名:闫盼蛟学号:2009432017一.实验目的理解并掌握乘法器的原理二.实验原理1.有符号数乘法——Booth乘法器Booth算法是一个更有效的计算有符号数乘法的算法,算法的新颖之处在于减法也可以用于计算乘积。
假定2(10)×6(10),或者说0010B×0110B:Booth发现加法和减法可以得到同样的结果。
Booth算法的关键在于把1分类为开始、中间、结束3种。
如图:1的结束1的中间1的开始当然一串0的时候加法减法都不做。
因此,总结1的分类情况有4种。
如下表:Booth算法是根据乘数的相邻2位来决定操作,第一步根据相邻2为的4中情况来进行加或减操作,第二步仍然是将积寄存器右移。
算法描述如下:(1)根据当前位和其右边的位,做如下操作。
00:0的中间,无任何操作01:1的结束,将被乘数加到积的左半部分10:1的开始,积的左半部分减去被乘数11:1的中间,无任何操作(2)将积寄存器右移一位。
需要注意的是,因为Booth乘法器实有符号数的乘法,因此积寄存器移位的时候,为了保留符号位,进行算术右移,不像前面的算法逻辑右移就可以了。
三.实验代码LIBRARY IEEE;USE IEEE.Std_logic_1164.ALL;ENTITY booth_multiplier ISGENERIC(k : POSITIVE := 3); --input number word length less onePORT( multiplicand : IN BIT_VECTOR(k DOWNTO 0);multiplier : IN BIT_VECTOR(k DOWNTO 0);clock : IN BIT;product : INOUT BIT_VECTOR((2*k + 2) DOWNTO 0);final : OUT BIT);END booth_multiplier;ARCHITECTURE structural OF booth_multiplier ISSIGNAL mdreg : BIT_VECTOR(k DOWNTO 0);SIGNAL adderout : BIT_VECTOR(k DOWNTO 0);SIGNAL carries : BIT_VECTOR(k DOWNTO 0);SIGNAL augend : BIT_VECTOR(k DOWNTO 0);SIGNAL tcbuffout : BIT_VECTOR(k DOWNTO 0);SIGNAL adder_ovfl : BIT;SIGNAL comp : BIT;SIGNAL clr_md : BIT;SIGNAL load_md : BIT;SIGNAL clr_pp : BIT;SIGNAL load_pp : BIT;SIGNAL shift_pp : BIT;SIGNAL boostate : NATURAL RANGE 0 TO 2*(k + 1) :=0;BEGINPROCESS --main clocked process containing all sequential elementsBEGINW AIT UNTIL (clock'EVENT AND clock = '1');--register to hold multiplicand during multiplicationIF clr_md = '1' THENmdreg <= (OTHERS => '0');ELSIF load_md = '1' THENmdreg <= multiplicand;ELSEmdreg <= mdreg;END IF;--register/shifter accumulates partial product valuesIF clr_pp = '1' THENproduct <= (OTHERS => '0');product((k+1) downto 1) <= multiplier;ELSIF load_pp = '1' THENproduct((2*k + 2) DOWNTO (k + 2)) <= adderout; --add to top halfproduct((k+1) DOWNTO 0) <= product((k+1) DOWNTO 0); --refresh bootm halfELSIF shift_pp = '1' THENproduct <= product SRA 1; --shift right with sign extendELSEproduct <= product;END IF;END PROCESS;--adder adds/subtracts partial product to multiplicandaugend <= product((2*k+2) DOWNTO (k+2));addgen : FOR i IN adderout'RANGEGENERATElsadder : IF i = 0 GENERATEadderout(i) <= tcbuffout(i) XOR augend(i) XOR product(1);carries(i) <= (tcbuffout(i) AND augend(i)) OR(tcbuffout(i) AND product(1)) OR(product(1) AND augend(i));END GENERATE;otheradder : IF i /= 0 GENERATEadderout(i) <= tcbuffout(i) XOR augend(i) XOR carries(i-1);carries(i) <= (tcbuffout(i) AND augend(i)) OR(tcbuffout(i) AND carries(i-1)) OR(carries(i-1) AND augend(i));END GENERATE;END GENERA TE;--twos comp overflow bitadder_ovfl <= carries(k-1) XOR carries(k);--true/complement buffer to generate two's comp of mdregtcbuffout <= NOT mdreg WHEN (product(1)='1') ELSE mdreg;--booth multiplier state counterPROCESS BEGINW AIT UNTIL (clock'EVENT AND clock = '1');IF boostate < 2*(k + 1) THENboostate <= boostate + 1;final <='0';ELSEfinal <='1';boostate <= 0;END IF;END PROCESS;--assign control signal values based on statePROCESS(boostate)BEGIN--assign defaults, all registers refreshclr_md <= '0';load_md <= '0';clr_pp <= '0';load_pp <= '0';shift_pp <= '0';--boostate <=0;IF boostate = 0 THENload_md <= '1';clr_pp <= '1';ELSIF boostate MOD 2 = 0 THEN --boostate = 2,4,6,8 ....shift_pp <= '1';ELSE --boostate = 1,3,5,7......IF product(1) = product(0) THENNULL; --refresh ppELSEload_pp <= '1'; --update productEND IF;END IF;END PROCESS;END structural;四.实验步骤(1)打开Quartus Ⅱ。
基于booth算法的4位乘法器
基于booth算法的4位乘法器详细设计姓名:魏可望(23)班级:微电子1102指导老师:***日期:2014年4月29日1设计目标 (3)1.1功能定义 (3)1.2引脚描述 (3)1.2.1 4位乘法器的单元系统级信号 (3)1.2.2 4位乘法器的输入接口定义 (3)1.2.3 4位乘法器的器输出接口定义 (3)2 模块设计 (3)3测试 (4)4设计开发环境 (4)5设计开发计划 (4)1设计目标1.1功能定义本文描述4位乘法器的详细设计方案。
其功能是求出4位2进制数的乘积功能,并在FPGA开发板上验证设计的正确性。
1.2引脚描述1.2.1 4位乘法器单元系统级信号1.2.2 4位乘法器输入接口定义1.2.3 4位乘法器输出接口定义2 模块设计本设计按要求,用异步复位的方式实现基于booth算法的4位乘法器。
3测试本单元电路控制逻辑采用systemverilog断言描述状态信息测试,数据通路部分用采用sysetemverilog随机验证的方法,并结合覆盖率检测,做到100%验证。
为了减少测试时间,在测试时将24位计数值修改为2位计数值,并测试8位计数器从0到255各种变化情况。
将本设计下载到Sparten 3E开发板上,将计数器的输出连接到LED灯上,以验证设计的正确性。
4设计开发环境语言级设计:Verilog综合工具:xilinx 14.7rFPGA设计和仿真工具:ISE13.2,synopsys VCS布局和布线工具:appllo ,模拟设计和仿真工具: modelsim寄生参数提取和仿真工具: star_sim RC5设计开发计划附录1:基于booth算法的4位乘法器module datapath(clk, res_n, mul1, mul2, load, shift_1, shift_2, add, sub, Yi,product);parameter width=3'd4;input clk,res_n;input [width-1:0]mul1,mul2;input load,shift_1,shift_2,add,sub;output [2:0]Yi;output [2*width-1:0]product;reg [width-1:0]multiplier;reg [2*width-1:0]multiplicant,product;reg Q;//the additon bit ;assign Yi={multiplier[1:0],Q};always@(posedge clk or negedge res_n)beginif(!res_n)beginmultiplier<=0;multiplicant<=0;Q<=0;product<=0;endelse if(load)begincase(mul1[width-1])1:multiplicant<={4'b1111,mul1};0:multiplicant<={4'b0000,mul1};endcasemultiplier<=mul2;Q<=0;product<=0;endelse if(shift_2)beginmultiplier<=multiplier>>2;multiplicant<=multiplicant<<2;endelse if(shift_1)beginmultiplier<=multiplier>>1;multiplicant<=multiplicant<<1;endelse if(add)beginproduct<=multiplicant+product;endelse if(sub)beginproduct<=product-multiplicant;endendendmodule。
Booth算法_乘法器实验报告
Booth 乘法器实验报告一、实验目的1、理解并掌握乘法器的原理。
2、理解并掌握Booth 算法,及其实现方式。
二、实验原理1、乘法规律假定是十进制数的各位要么为0要么为1,例如1000*1001从上面可以得出乘法的基本规律:(1)从右到左用乘数的每一位乘以被乘数,每一次乘得的中间结果比上一次的结果往左移一位。
(2)积的位数比被乘数和乘数的位数要多得多。
(3)若十进制各位限制为0或1,则乘法变成①若乘数位为1,则简单的复制被乘数到合适的位置; ②若乘数位是0,则在合适的位置置0。
2、有符号数乘法—Booth 乘法器 (1)1的分类Booth 算法的关键在于把1分类为开始、中间、结束3种,如下图Booth 算法1的分类示意图 (2)算法描述以前乘法器的第一步是根据乘数的最低位来决定是否将被乘数加到中间结果积,而Booth 算法则是根据乘数的相邻两位来决定操作,第一步根据相邻2位的4种情况来进行加或减操作,第二步仍然是将积寄存器右移。
算法描述如下: ①根据当前位和其右边的位,作如下操作 00:0的中间,无任何操作;01:1的结束,将被乘数加到积的左半部分;1的结束被乘数 1 0 0 010 乘数 × 1 0 0 110 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0积 1 0 0 1 0 0 0101的中间 1的开始10:1的开始,积的左半部分减去被乘数; 11:1的中间,无任何操作。
②将积寄存器算术右移一位。
对于Booth算法,举例如下:210*-310=-610,或者说是00102*11012=1111 10102。
运算过程见下表。
Booth算法运算过程1 1:10->积=积-被乘数2:积右移一位 0010 1110 1101 01111 0110 12 1:01->积=积+被乘数2:积右移一位 0010 0001 0110 10000 1011 03 1:10->积=积-被乘数2:积右移一位 0010 1110 1011 01111 0101 14 1:11->nop2:积右移一位 0010 1111 0101 11111 1010 1三、实验步骤1、在PC机上完成ISE的安装。
booth算法实验报告
booth算法实验报告Booth算法的实现一、目的和要求采用BOOTH算法,编程实现二进制数的乘法运算,进而了解计算机中定点运算的过程二、BOOTH算法的算法思想Booth算法是比较好的带符号数乘法的方法。
它采用相加和相减的操作计算补码数据的乘积。
Booth算法对乘数从低位开始判断,根据两个数据位的情况决定进行加法、减法还是仅仅移位操作。
判断的两个数据位为当前位及其右边的位(初始时需要增加一个辅助位0),移位操作是向右移动。
BOOTH算法的算法思想是让乘数近似于某个较大的整值,然后用这个数值与被乘数的乘积减去其对应这个整值数的补数与被乘数的乘积来进行计算,从而提高了乘法的运算效率。
三、BOOTH算法原理Booth算法为补码一位乘,其具体实现过程为:给末位添加一个附加位x,与乘数的最后一位组成判断条件来决定部分积作何操作。
其中,乘数最后一位与x一共有四种组合情况分别为:00,01,10,11。
四种情况的具体操作分别为:00,部分积右移一位,01 部分积加被乘数的补码再右移一位形成新的部分积,10部分积加[-x]的补码后右移一位形成新的部分积,11部分积右移一位。
四、程序实现过程此算法由主函数和一个求补函数,一个booth算法构成。
1.主函数在主函数中,首先需要输入x的绝对值,x的符号以及y的绝对值,y的符号,其次,需要根据输入的值去调用求补函数求出x,y和(-x)的补码,最后再根据对booth函数的调用求得由booth算法实现的乘法的结果2.求补函数在求补函数中,在执行过程中需要先判断其符号位,根据其符号位求补,如果这个需要求补的数为正数则其补码就是这个正数,如果这个数是负数,则需要对其除符号位按位取反,再在末位加一。
末位加一时需注意,若最后一位为零,则置末位为1,进位标志为零,反之,若最后一位为一,置末位为0,进位标志为1,向前进位。
3.Booth算法在Booth算法的实现中,包括加法和移位两种操作。
FPGA课程设计实验报告
合肥工业大学大学实验报告课程名称: FPGA设计实验名称:移位乘法器设计 & 8位Booth乘法器设计*名:**学号: ********班级:电子科学与技术11-1班指导教师:**合肥工业大学电子科学与应用物理学院制移位乘法器一、实验原理移位和相加乘法原理,乘法通过逐项移位相加原理来实现,从被乘数的最低位开始,若为1,则乘数右移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。
移位乘法器工作流程图二、实验步骤算法主程序module MUL(A,B,data);input [7:0] A;input [7:0] B;output [15:0] data;wire [15:0] data;reg [7:0] D;reg [7:0] A1;reg [7:0] B1;reg C;always @(A or B)beginA1 = A;B1 = B;D = 0;C = 0;repeat(8)beginif(A1[0]==1){C,D} = D + B1;else{C,D} = D + 0;{C,D,A1} = {C,D,A1} >> 1;endendassign data = {D,A1};endmodule移位乘法器测试文件module test;reg [7:0] A;reg [7:0] B;// Outputswire [15:0] data;// Instantiate the Unit Under Test (UUT) MUL uut (.A(A),.B(B),.data(data));initial begin// Initialize InputsA = 0;B = 0;// Wait 100 ns for global reset to finish#20;A = 8'b0000_0010;B = 8'b0000_1101;// Add stimulus hereendendmodule三、实验结果及分析2进制输入输出结果10进制输入输出结果四、体会通过移位乘法器的设计,简单的了解了ISE软件的基本功能,主要菜单选项,以及如何建立一个工程,如何在工程里面写程序和进行编译和综合等。
定点数乘除运算booth法
定点数乘除运算booth法Booth法是一种高效的双精度定点数乘除运算方法,适用于计算机科学和工程领域中的数值计算。
Booth法的核心思想是将定点数转化为浮点数进行计算,然后再将结果转化为定点数。
在Booth法中,定点数的表示方式为a = b *2^(s-m),其中a 为定点数,b为浮点数,s为整数部分,m为小数部分。
在进行乘法运算时,Booth法首先将两个定点数转化为对应的浮点数,然后进行普通的乘法运算,最后将结果转化为定点数。
具体步骤如下:1. 将两个定点数a和b转化为对应的浮点数A和B,其中A =a *2^(s1-m1),B =b *2^(s2-m2)。
2.进行普通的乘法运算,得到结果C。
3. 将结果C转化为定点数,即C = C *2^(-(s1+s2)-1)。
4. 将结果C与定点数1进行比较,如果C大于1,则将结果右移一位,即C = C /2。
5. 将结果C转化为定点数,即C = C *2^(s1+s2)。
在Booth法中,除法运算的步骤与乘法相似。
具体步骤如下:1. 将两个定点数a和b转化为对应的浮点数A和B,其中A =a *2^(s1-m1),B =b *2^(s2-m2)。
2.进行普通的除法运算,得到结果D。
3. 将结果D与定点数1进行比较,如果D小于1,则将结果右移一位,即D = D *2。
4. 将结果D转化为定点数,即D = D *2^(s1-s2)。
Booth法的优点在于其高效性和稳定性。
相比于传统的定点数乘除法,Booth法能够减少运算过程中的舍入误差,提高计算精度。
同时,Booth法还能够避免溢出的发生,使得定点数运算更加安全可靠。
在实际应用中,Booth法已经被广泛应用于计算机科学、工程、金融等领域。
例如,在计算机科学中,Booth法可以用于实现高效的浮点数运算;在工程领域中,Booth法可以用于精确计算物理量;在金融领域中,Booth法可以用于计算货币汇率等。
总之,Booth法是一种高效、稳定、精确的定点数乘除运算方法,其在计算机科学和工程领域具有广泛的应用价值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Booth 乘法器实验报告一、实验目的1、理解并掌握乘法器的原理。
2、理解并掌握Booth 算法,及其实现方式。
二、实验原理1、乘法规律假定是十进制数的各位要么为0要么为1,例如1000*1001从上面可以得出乘法的基本规律:(1)从右到左用乘数的每一位乘以被乘数,每一次乘得的中间结果比上一次的结果往左移一位。
(2)积的位数比被乘数和乘数的位数要多得多。
(3)若十进制各位限制为0或1,则乘法变成①若乘数位为1,则简单的复制被乘数到合适的位置; ②若乘数位是0,则在合适的位置置0。
2、有符号数乘法—Booth 乘法器 (1)1的分类Booth 算法的关键在于把1分类为开始、中间、结束3种,如下图Booth 算法1的分类示意图 (2)算法描述以前乘法器的第一步是根据乘数的最低位来决定是否将被乘数加到中间结果积,而Booth 算法则是根据乘数的相邻两位来决定操作,第一步根据相邻2位的4种情况来进行加或减操作,第二步仍然是将积寄存器右移。
算法描述如下: ①根据当前位和其右边的位,作如下操作 00:0的中间,无任何操作;01:1的结束,将被乘数加到积的左半部分;1的结束被乘数 1 0 0 010 乘数 × 1 0 0 110 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0积 1 0 0 1 0 0 0101的中间 1的开始10:1的开始,积的左半部分减去被乘数; 11:1的中间,无任何操作。
②将积寄存器算术右移一位。
对于Booth算法,举例如下:210*-310=-610,或者说是00102*11012=1111 10102。
运算过程见下表。
Booth算法运算过程1 1:10->积=积-被乘数2:积右移一位 0010 1110 1101 01111 0110 12 1:01->积=积+被乘数2:积右移一位 0010 0001 0110 10000 1011 03 1:10->积=积-被乘数2:积右移一位 0010 1110 1011 01111 0101 14 1:11->nop2:积右移一位 0010 1111 0101 11111 1010 1三、实验步骤1、在PC机上完成ISE的安装。
2、完成工程设计。
3、下载。
四、实验现象1、Modelsim按照实例给出仿真结果2、输入输出规则(1)输入的4位被乘数md3~md0对应四个开关。
(2)输入的4为乘数mr3~mr0对应四个按键。
(3)乘积product的后两位对应LED点。
3、操作细节Booth算法实验重复步骤被乘数(md)积(p)被乘数(-7)10乘数是(6)100 初始值1001 0000 0110 01 1:10->积=积-被乘数2:积右移一位1001 0000 0110 00000 0011 02 1:01->积=积+被乘数2:积右移一位 1001 0111 0011 00011 1001 13 1:10->积=积-被乘数 1001 0011 1001 12:积右移一位0001 1100 14 1:11->nop2:积右移一位 1001 1010 1100 11101 0110 0重复步骤被乘数(md)积(p)被乘数(-4)10乘数是(-5)100 初始值 1100 0000 1011 01 1:10->积=积-被乘数2:积右移一位 1100 0100 1011 00010 0101 12 1:01->积=积+被乘数2:积右移一位 1100 0010 0101 10001 0010 13 1:10->积=积-被乘数2:积右移一位 1100 1101 0010 11110 1001 04 1:11->nop2:积右移一位 1100 0010 1001 00001 0100 1五、心得体会通过这次实验,真正领悟到所谓的“软件思想”与“硬件理念”的不同。
脱开VHDL,我们用学过的任意高级语言编程,我们可以对变量循环赋值、可以随赋值随利用,但这些是纯的软件思想,硬件无法立即反应与实现,信号量在赋值方面尤其体现了这一点。
实验中,由于积寄存器在一步操作中既要做加减运算,又要右移,反复操作了很多次,却始终无法完成一个信号量在一个进程中完成两个操作,也试验了在两个进程中分别完成,但结果又成了多驱动问题。
追究了半天原因,想到了用能“即赋值即使用”的变量来作为“媒介”,用变量来完成加减运算,而积寄存器只需要从“媒介”中右移一位取值,这样可以既运算又完成右移。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity Booth isport( md:in std_logic_vector(3 downto 0);mr:in std_logic_vector(3 downto 0);p: buffer std_logic_vector(8 downto 0);clk:in std_logic;final:buffer std_logic);end entity;architecture rtl of Booth issignal count:std_logic_vector(2 downto 0);signal t:std_logic_vector(3 downto 0);shared variable c:std_logic_vector(4 downto 0);shared variable b:std_logic_vector(8 downto 0);beginprocess(clk)beginc(0):='0';if(clk'event and clk='1')thenb(8 downto 0):=p(8 downto 0);if(count="000")thenp(8 downto 5)<="0000";p(4 downto 1)<=mr(3 downto 0);p(0)<='0';b(8 downto 5):="0000";b(4 downto 1):=mr(3 downto 0);b(0):='0';t(3 downto 0)<=not md(3 downto 0)+'1';final<='0';elseif(p(1 downto 0)="01")thenb(8 downto 5):=b(8 downto 5)+md(3 downto 0);elsif(p(1 downto 0)="10")thenb(8 downto 5):=b(8 downto 5)+t(3 downto 0);end if;p(8)<=b(8);p(7 downto 0)<=b(8 downto 1);end if;count<=count+'1';if(count="100")thencount<="000";final<='1';end if;end if;end process;--process(clk) /it is also can do the same function-- begin-- c(0):='0';-- if(clk'event and clk='1')then-- b(8 downto 0):=p(8 downto 0);-- case count is-- when "000"=>-- p(8 downto 5)<="0000";p(4 downto 1)<=mr(3 downto 0);p(0)<='0';---- b(8 downto 5):="0000";b(4 downto 1):=mr(3 downto0);b(0):='0';-- t(3 downto 0)<=not md(3 downto 0)+'1';-- count<="001";-- final<='0';-- when "001"=>---- if(p(1 downto 0)="01")then-- b(8 downto 5):=b(8 downto 5)+md(3 downto 0);-- elsif(p(1 downto 0)="10")then-- b(8 downto 5):=b(8 downto 5)+t(3 downto 0);-- end if;-- count<="010";-- p(8)<=b(8);p(7 downto 0)<=b(8 downto 1);-- when "010"=>-- if(p(1 downto 0)="01")then-- b(8 downto 5):=b(8 downto 5)+md(3 downto 0);-- elsif(p(1 downto 0)="10")then-- b(8 downto 5):=b(8 downto 5)+t(3 downto 0);-- end if;-- p(8)<=b(8);p(7 downto 0)<=b(8 downto 1);-- count<="011";-- when "011"=>-- if(p(1 downto 0)="01")then-- b(8 downto 5):=b(8 downto 5)+md(3 downto 0);-- elsif(p(1 downto 0)="10")then-- b(8 downto 5):=b(8 downto 5)+t(3 downto 0);-- end if;-- p(8)<=b(8);p(7 downto 0)<=b(8 downto 1);-- count<="100";-- when "100"=>-- if(p(1 downto 0)="01")then-- b(8 downto 5):=b(8 downto 5)+md(3 downto 0);-- elsif(p(1 downto 0)="10")then-- b(8 downto 5):=b(8 downto 5)+t(3 downto 0);-- end if;-- count<="000";-- final<='1';-- p(8)<=b(8);p(7 downto 0)<=b(8 downto 1);-- when others=>count<="000" ;-- end case;-- end if;-- end process;end rtl;。