乘法器,也不过如此!

本文详细介绍了乘法器的工作原理和不同类型的乘法器设计,包括逐位进位并行乘法器、进位节省乘法器、基本时序乘法器、查找表乘法器以及Booth算法的乘法器。乘法器在微处理器中的重要性不言而喻,其速度和面积优化直接影响微处理器性能。文章通过具体的例子和电路设计说明了各种乘法器的优化策略,如Wallace树和Booth编码,以提高运算速度和效率。
摘要由CSDN通过智能技术生成

乘法器,也不过如此!

乘法器要点:

逐位进位并行乘法器:常规乘法计算一样
进位节省乘法器:含有超前进位加法器电路
基本时序乘法器:循环复用,左移,加法利用状态机
查找表乘法器:面积换速度典型
Wallace树:3:2压缩
Booth2乘法器:减少连1情况,每位可以是-1,0,1,减少加法次数
Booth4乘法器:三连位变一位,该位可以是±2,±1,0,减少乘法次数

写在前面:
在微处理器芯片中,乘法器是进行数字信号处理的核心,同时也是微处理器中进行数据处理的关键部件。乘法器完成一次操作的周期基本上决定了微处理器的主频。乘法器的速度和面积优化对于整个CPU的性能来说是非常重要的。为了加快乘法器的执行速度,减少乘法器的面积,有必要对乘法器的算法、结构及电路的具体实现做深入的研究。

逐位进位并行乘法器:
设两个 n 位二进制正数 X 和 Y:
X : X n-1···X1 X0
Y : Y n-1··· Y1Y0
则 X和 Y的乘积 Z有 2n位: 并且 式中YiX称为部分积,记为Pi,显然,两个一位二进制数相乘遵循如下规则:
0×0=0; 0×1=0; 1×0=0; 1×1=1
因此YiXj可用一个与门实现,记Pi.j = Yi Xj
例:两个四位二进制数X和Y相乘。
在这里插入图片描述
快速乘法器常采用网格形式的迭带阵列结构,图 5.3示出两个四位二进制数相乘的结构图,图 中每一个乘法单元 MU的逻辑图如图 5.4 所示,即每一个 MU由一个与门和一个全加器构成。 事实上,图 5.3中第一行的每个 MU可用一个与门实现,每一行最右边一个 MU中的全加器可 用半加器实现。图 5.3实现乘法的最长延时为 1个与门的传输延时加上八个全加器的传输延 时。假设每个全加器产生和与产生进位的传输延时相同,并且均相当 4个与门的传输延时(解释:粗略认为半加器延时为一个与门的延迟;全加器可由两个半加器和一个或门组成,全加器延时为三个与门的延迟;乘法器单元MU在全加器的基础上增加了一个与门,故一个乘法器单元的延时为四个与门的延迟,若理解不了这句话回头看夏文宇书第144页笔记),则 图 5.3逐位进位并行乘法器的最长延时为 1+8×4=33个门的传输延时。
在这里插入图片描述
在这里插入图片描述

进位节省乘法器
为了提高乘法运算速度可以改为图 5.5 所示的进位节省乘法器(Carry-Save Multiplier)。图中 用了一个三位的超前进位加法器,九个图 5.4所示的乘法单元,七个与门。显然,图 5.5中第二 行的乘法单元中全加器可改为半加器。图 5.5 执行一次乘法运算的最长延时为 1 个与门的传输 延时加上 3个全加器的传输延时,再加上三位超前进位加法器的传输延时。设三位超前进位加 法器的传输延时为 5个门的传输延时,则最长延时为 1+3×4+1×5=18的传输延时。少于前面的逐位进位并行乘法器的33个门传输延迟,节省乘法 运算时间的关键在于每个乘法单元的进位输出向下斜送到下一行,故有进位节省乘法器之称。
在这里插入图片描述
根据加法器类似的道理,八位的二进制超前进位乘法电路可用两个四位二进制超前进位乘法电 路再加上超前进位形成逻辑来构成。同理,依次类推可以设计出 16位、32位和 64位的乘法电路。

基本时序乘法器
若要使消耗资源最少,最自然的想法是,不再将组合电路内的每个部分积都分配全加器,而是不断复用唯一的一行,将下一行的部分积移位后累加即可。这样将空间复杂度从O(N^2)降到了O(N),但时间复杂度从O(1)增加到了O(N)。
按照常规乘法规则,每次判断乘数的一位,若为1则将被乘数加到积上,否则跳过。将积左移一位,相当于跳到下一行。重复该操作直到判断完乘数的所有位。由于加法和移位在两个状态中,所以效率不高,8位数要16个周期。
61个LUT,2个FF

module Multiplier#(parameter L_word = 8)(
output reg [2*L_word-1:0] product,
output reg                Ready,
input       [L_word-1:0]  word1,word2,
input                     Start,CLK,RST      
);

reg [2*L_word-1:0]        multiplicand,P;
reg [1:0]                 state,next_state;
integer                   Pointer;

parameter Idle = 0, Load = 1, Add = 2, Shift = 3;

always@(posedge CLK or posedge RST)
    if (RST) state <= Idle;
    else state <= next_state; 

always@(state or Start)
    case (state) 
       Idle:     if (Start) begin 
                         Ready = 0;</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值