数字IC前端学习笔记:优化的基4布斯编码华莱士树乘法器

news2025/7/28 10:03:10

相关阅读

数字IC前端icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12173698.html


 

        本文是对前文设计的乘法器,即基4布斯编码华莱士树乘法器的补充和优化,具体关于基4布斯编码和华莱士树的内容可以从以往的文章中获得。

数字IC前端学习笔记:数字乘法器的优化设计(基4布斯编码华莱士树乘法器)icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/article/details/134145641
数字IC前端学习笔记:数字乘法器的优化设计(Wallace Tree乘法器)icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/article/details/133611299

        前文提到的基4布斯编码华莱士树乘法器的一部分的电路面积是由补位逻辑所带来的——为了保证求和正确,所有的部分积都会需要被符号拓展至乘积结果的位宽以保证在最差情况下都不会溢出。这对于位宽较大的乘法器而言是一笔不小的面积开销,如表1的八位数相乘产生的部分积左侧的S就是因为要补位至十六位所引入的。 

表1 补位逻辑

S

S

S

S

S

S

S

S

X

X

X

X

X

X

X

X

S

S

S

S

S

S

X

X

X

X

X

X

X

X

S

S

S

S

X

X

X

X

X

X

X

X

S

S

X

X

X

X

X

X

X

X

        可以发现,这种符号拓展要么全是0要么全是1,根据这点特性可以对它进行简化,首先考虑所有部分积都为负的情况,部分积的符号位拓展后的分布如表2所示。

表2 负部分积的累加

1

1

1

1

1

1

1

1

X

X

X

X

X

X

X

X

1

1

1

1

1

1

X

X

X

X

X

X

X

X

1

1

1

1

X

X

X

X

X

X

X

X

1

1

X

X

X

X

X

X

X

X

        如果其中某个部分积为正,那么就需要将符号位都变为0,这只需要在这些拓展的全为1的符号位的最低位再加上1即可表示正确的符号位,即全为0。换句话说,只需要在拓展符号位的最低位加上取反的符号位,如表3所示。将所有的符号位中的1相加,可以得到如表4形式的部分积。 

表3 符号位修正

1

1

1

1

1

1

1

1

X

X

X

X

X

X

X

X

!S

1

1

1

1

1

1

X

X

X

X

X

X

X

X

!S

1

1

1

1

X

X

X

X

X

X

X

X

!S

1

1

X

X

X

X

X

X

X

X

!S

表4 等效补位逻辑 

1

0

0

0

0

0

0

1

!S

X

X

X

X

X

X

X

X

0

0

0

0

1

!S

X

X

X

X

X

X

X

X

0

0

1

!S

X

X

X

X

X

X

X

X

1

!S

X

X

X

X

X

X

X

X

        可以将第一行的1与第一个部分积合并,即合并为!SSS的形式,总结出规律,所有部分积对符号位取反,并在高位补一个1,最后在第一个部分积的符号位加一个1即可完成补位逻辑的优化。注意,这里的部分积(包括符号位)为九位,因为基4布斯编码可能会出现乘2的操作,当编码没有乘2操作时,设计也需要将部分积符号拓展至9位再进行等效的转换。

        具体的Verilog代码实现见附录,Modelsim软件仿真截图如图1所示。使用Synopsis的综合工具Design Compiler综合的结果如图2所示,综合使用了0.13μm工艺库。

图1 优化的基4布斯编码华莱士树乘法器仿真结果

图2 优化的基4布斯编码华莱士树乘法器综合结果

        在Design Compiler中使用report_timing命令,可以得到关键路径的延迟,如图3所示,可以看到,改良后的逻辑延迟相比于改良前有较大的降低,这是由于部分积数量的减少和补位逻辑的简化共同决定的。 

 

图3 优化的基4布斯编码华莱士树乘法器关键路径报告

        在Design Compiler中使用report_area命令,报告所设计电路的面积占用情况,如图4所示,设计使用的面积也低于普通的基4布斯华莱士树编码乘法器器,从RTL代码中也可以看到这一点,上节的乘法器使用了22个全加器和5个半加器,而优化后只使用了14个全加器和8个半加器,使用的资源大大减少。

 

图4 优化的基4布斯编码华莱士树乘法器面积报告

         优化的基4布斯编码华莱士树乘法器的Verilog代码如下所示。

module Booth_Encoder(
input [2:0] Code,
output Neg,Zero,One,Two
);

    assign Neg = Code[2];
    assign Zero = (Code == 3'b000) || (Code == 3'b111);
    assign Two = (Code == 3'b100) || (Code == 3'b011);
    assign One = (!Zero) & (!Two);

endmodule

module Partial_Generater(
input [7:0] Multiplicand,
input Neg,Zero,One,Two,
output  [9:0] Partial_Product

);
    reg [8:0]Partial_Product_t;
    always@(*) begin
        Partial_Product_t=9'b0;
        if(Zero)
            Partial_Product_t=9'b0;
        else if(One)begin
            if(Neg)	
                Partial_Product_t=~{Multiplicand[7],Multiplicand}+1'b1;
            else
                Partial_Product_t={Multiplicand[7],Multiplicand};
        end
        else if(Two)begin
            if(Neg)	
                Partial_Product_t=~{Multiplicand,1'b0}+1;
            else
                Partial_Product_t={Multiplicand,1'b0};
        end
      
    end
    assign Partial_Product={1'b1,!Partial_Product_t[8],Partial_Product_t[7:0]};
endmodule

module Multiplier_Radix_4_Wallace_a(
    input      [7:0]    A      ,
    input      [7:0]    B      ,
    output  [15:0]    Sum
);
    //A Multiplicand 
    //B Multiplier
    wire Neg[3:0];
    wire Zero[3:0];
    wire One[3:0];
    wire Two[3:0];
    wire [9:0]Partial_Product_t;
    wire [9:0]Partial_Product[3:1];
    wire [10:0]Partial_Product_0;
    wire [9:0]Result_0;
    wire [9:0]Carry_0;
    wire [10:0]Result_1;
    wire [10:0]Carry_1;
    //Booth_Encoder
    Booth_Encoder Booth_Encoder_0({B[1:0],1'b0},Neg[0],Zero[0],One[0],Two[0]);
    Booth_Encoder Booth_Encoder_1({B[3:1]},Neg[1],Zero[1],One[1],Two[1]);
    Booth_Encoder Booth_Encoder_2({B[5:3]},Neg[2],Zero[2],One[2],Two[2]);
    Booth_Encoder Booth_Encoder_3({B[7:5]},Neg[3],Zero[3],One[3],Two[3]);

    //Partial_Generater
    Partial_Generater Partial_Generater_0(A,Neg[0],Zero[0],One[0],Two[0],Partial_Product_t);
    Partial_Generater Partial_Generater_1(A,Neg[1],Zero[1],One[1],Two[1],Partial_Product[1]);
    Partial_Generater Partial_Generater_2(A,Neg[2],Zero[2],One[2],Two[2],Partial_Product[2]);
    Partial_Generater Partial_Generater_3(A,Neg[3],Zero[3],One[3],Two[3],Partial_Product[3]);

    assign Partial_Product_0={Partial_Product_t[8],!Partial_Product_t[8],!Partial_Product_t[8],Partial_Product_t[7:0]};
    //Wallace_Tree
    //Stage1
    assign Sum[0]=Partial_Product_0[0];
    assign Sum[1]=Partial_Product_0[1];
    assign Sum[2]=Result_0[0];
    Adder_half Adder_half_0(Partial_Product_0[2],Partial_Product[1][0],Result_0[0],Carry_0[0]);
    Adder_half Adder_half_1(Partial_Product_0[3],Partial_Product[1][1],Result_0[1],Carry_0[1]);
    Adder Adder_0(Partial_Product_0[4],Partial_Product[1][2],Partial_Product[2][0],Result_0[2],Carry_0[2]);
    Adder Adder_1(Partial_Product_0[5],Partial_Product[1][3],Partial_Product[2][1],Result_0[3],Carry_0[3]);
    Adder Adder_2(Partial_Product_0[6],Partial_Product[1][4],Partial_Product[2][2],Result_0[4],Carry_0[4]);
    Adder Adder_3(Partial_Product_0[7],Partial_Product[1][5],Partial_Product[2][3],Result_0[5],Carry_0[5]);
    Adder Adder_4(Partial_Product_0[8],Partial_Product[1][6],Partial_Product[2][4],Result_0[6],Carry_0[6]);
    Adder Adder_5(Partial_Product_0[9],Partial_Product[1][7],Partial_Product[2][5],Result_0[7],Carry_0[7]);
    Adder Adder_6(Partial_Product_0[10],Partial_Product[1][8],Partial_Product[2][6],Result_0[8],Carry_0[8]);
    Adder_half Adder_half_3(Partial_Product[1][9],Partial_Product[2][7],Result_0[9],Carry_0[9]);

    //Stage2
    assign Sum[3]=Result_1[0];
    Adder_half Adder_half_4(Result_0[1],Carry_0[0],Result_1[0],Carry_1[0]);
    Adder_half Adder_half_5(Result_0[2],Carry_0[1],Result_1[1],Carry_1[1]);
    Adder_half Adder_half_6(Result_0[3],Carry_0[2],Result_1[2],Carry_1[2]);
    Adder Adder_7(Result_0[4],Carry_0[3],Partial_Product[3][0],Result_1[3],Carry_1[3]);
    Adder Adder_8(Result_0[5],Carry_0[4],Partial_Product[3][1],Result_1[4],Carry_1[4]);
    Adder Adder_9(Result_0[6],Carry_0[5],Partial_Product[3][2],Result_1[5],Carry_1[5]);
    Adder Adder_10(Result_0[7],Carry_0[6],Partial_Product[3][3],Result_1[6],Carry_1[6]);
    Adder Adder_11(Result_0[8],Carry_0[7],Partial_Product[3][4],Result_1[7],Carry_1[7]);
    Adder Adder_12(Result_0[9],Carry_0[8],Partial_Product[3][5],Result_1[8],Carry_1[8]);
    Adder Adder_13(Partial_Product[2][8],Carry_0[9],Partial_Product[3][6],Result_1[9],Carry_1[9]);
    Adder_half Adder_half_7(Partial_Product[2][9],Partial_Product[3][7],Result_1[10],Carry_1[10]);


    assign Sum[15:4]={1'b0,Partial_Product[3][8],Result_1[10:1]}+{Partial_Product[3][9],Carry_1[10:0]};
endmodule     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1156475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信息系统项目管理师教程 第四版【第11章-项目成本管理-思维导图】

信息系统项目管理师教程 第四版【第11章-项目成本管理-思维导图】 课本里章节里所有蓝色字体的思维导图

【HarmonyOS】ArkTS学习之二级菜单的实现

【关键词】 Menu、bindMenu、ArkTS 【实现方案】 方案一: 1、实现代码: Entry Component struct MenuExample {BuildermyMenu(){Menu(){MenuItem({content: 编译 Hap(s)})MenuItem({content: 编译 APP(s)})}}BuildersubMenu(){Menu(){MenuItemGroup(…

一次cs上线服务器的练习

环境:利用vm搭建的环境 仅主机为65段 测试是否能与win10ping通 配置转发 配置好iis Kali访问测试 现在就用burp抓取winser的包 开启代理 使用默认的8080抓取成功 上线

【向生活低头】win7打印机共享给win11使用,win11无法连接问题的解决

打印机是跟win7的电脑连接的,然后试了很多方法,win11都没法添加该打印机去使用。 网上的方法乱七八糟啥都有,但试了以后,发现基本没什么用。 刚刚发现知乎上的一个回答是有用的,这里做记录以备后用。 1.打开控制面板的…

cocosCreator 调用wxAPI 及后台授权设置、获取用户昵称和头像

版本: 3.8.0 语言: TypeScript 环境: Mac 官方文档: 微信官方文档 - 开放能力 微信 API 小游戏环境 在cocosCreator的3.x版本项目开发中,TypeScript最终会被转换为JavaScript语言。 JavaScript的运行时调用的API…

图解系列--L2交换机

大端,小端 网络上传输时,采用网络字节序。网络字节序为大端序。举例来说,对0x1020这样一个数值,按大端传输时,先传输0x10,再传输0x20;按小端传输时,先传输0x20,再传输0x…

Qt 中model/View 架构 详解,以及案例实现相薄功能

model/View 架构 导读 ​ 我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应用程序的界面中。早期的 Qt 要实现这个功能,需要定义一个组件,在这个组件中保存一个数据对象,比如一个列表。我们对这个列表进行查找、插入等的操作,或者把修改…

k8s---pod进阶

//资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时,调度器就使用该信息来决定将 Pod 调度到哪个节点上。当还为容器指定了 li…

super(props)与react类式组件

1 为什么super() super是对父类构造器的调用。使用了后会自动继承父类的属性。要把super()放到第一行是因为了以防在super()之前,也就是没实例化父类之前,访问父类的属性。所以js将此作为一个语法点&#x…

机器视觉能不能再火爆?大多数企业订单减少是现实,大多数企业维持现有的经营状态将会非常困难,就看人工智能和新兴产业能不能破门而入

每个人都讲机器视觉代替大量人工,可是真的吗?没有订单,人工的存在都没必要,需要什么机器视觉检测。 我们首先有一个问题,机器视觉行业之前有没有火爆过? 有,但是出现短暂之后是内卷。深度学习A…

STM32-LIN总线详解1

.硬件规范: 1.总线形式:一主多从 2.总线通常为12V电压,最高波特率20K,最多容纳16个节点。 也有24V,和其他电平需要共地。 3.总线上波形 4. 单片机STM32与LIN收发器在LIN_CAN开发板上设计。 1K电阻自动控制电路&…

自定义元素宽高比例(aspect-ratio)与@supports兼容支持和图片裁剪(object-fit)的用法

使用grid布局可以轻松实现响应式布局,子元素只需要设置最小宽度即可,如果对子元素没有设置高度,那么高度取决于内容的最大值,这样显然是不稳定的,如下图所示: 出现这种问题就造成布局混乱了,可…

利用Vue2实现印章徽章组件

需要实现的组件效果&#xff1a; 该组件有设置颜色、大小、旋转度数和文本内容功能。 一、组件实现代码 <template><divclass"first-ring"v-bind"getBindValue":class"getStampBadgeClass":style"{ transform: rotate(${rotate}…

离散数学实践-编程实现利用真值表法求主析取范式以及主合取范式

*本文为博主本人校内的离散数学专业课的实践作业。由于实验步骤已经比较详细&#xff0c;故不再对该实验额外提供详解&#xff0c;本文仅提供填写的实验报告内容与代码部分&#xff0c;以供有需要的同学学习、参考。 -------------------------------------- 编程语言&#xff…

第2篇 机器学习基础 —(4)k-means聚类算法

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。聚类算法是一种无监督学习方法&#xff0c;它将数据集中的对象分成若干个组或者簇&#xff0c;使得同一组内的对象相似度较高&#xff0c;不同组之间的对象相似度较低。聚类算法可以用于数据挖掘、图像分割、文本分类等领域…

nodejs+php+python+微信小程序-基于安卓android的北京地铁票务APP-计算机毕业设计

根据现实中在北京地铁票务方面的需求&#xff0c;并对该系统进行了仔细的研究&#xff0c;将系统权限按照管理者和用户这两种类型进行了区分。 &#xff08;1&#xff09;用户功能需求   用户进入APP可以进行系统首页、地铁线路、我的等操作&#xff0c;在我的页面可以对我的…

NLP实践——中文指代消解方案

NLP实践——中文指代消解方案 1. 参考项目2. 数据2.1 生成conll格式2.2 生成jsonline格式 3. 训练3.1 实例化模型3.2 读取数据3.3 评估方法3.4 训练方法 4. 推理5. 总结 1. 参考项目 关于指代消解任务&#xff0c;有很多开源的项目和工具可以借鉴&#xff0c;比如spacy的基础模…

【强化学习】12 —— 策略梯度(REINFORCE )

文章目录 前言策略梯度基于策略的强化学习的优缺点Example:Aliased Gridworld策略目标函数策略优化策略梯度利用有限差分计算策略梯度得分函数和似然比策略梯度定理蒙特卡洛策略梯度&#xff08;Monte-Carlo Policy Gradient&#xff09;Puck World Example Softmax随机策略 代…

力扣刷题-栈-逆波兰表达式求值

150. 逆波兰表达式求值 根据 逆波兰表示法&#xff0c;求表达式的值。 有效的运算符包括 , - , * , / 。每个运算对象可以是整数&#xff0c;也可以是另一个逆波兰表达式。 说明&#xff1a; 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说&#xff0c;表达…

YOLO算法改进3【中阶改进篇】:添加HorNet卷积模块

论文地址:https://arxiv.org/pdf/2207.14284.pdf 源码地址:https://github.com/raoyongming/HorNet. HorNet是在Swin transformer结构的基础上,结合大核思想提出的新的网络结构模块,使用该模块,作者在ImageNet-1k数据集上做分类,分割以及检测任务都在当时达到了SOTA的效果…