数字IC前端学习笔记:数字乘法器的优化设计(Wallace Tree乘法器)

news2024/11/23 20:09:33

相关阅读

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


        进位保留乘法器依旧保留着阵列的排列规则,只是进位是沿斜下角,如果能使用树形结构来规划这些进位保留加法器,就能获得更短的关键路径延迟和更小的器件开销,这种结构的乘法器被称为华莱士树(Wallace)乘法器。图1所示为使用四位华莱士树乘法器的例子,图中总共有十六个部分积,分别通过被乘数和乘数的各位相与(通过与门)得到,图中的斜杠/代表一个全加器,连接的分别是右上角的本位和以及左下角给高位的进位,带反斜杠\的/表示是半加器。

图1 华莱士树乘法器的覆盖过程

        第一阶段华莱士将所有的部分积按行,每三行分组,在组内使用保留进位加法器(有全加器和半加器两种)压缩,当组内某一列含有三个部分积,则使用全加器压缩;若含有两个部分积,则使用半加器压缩,含有一个部分积,则不压缩。分组时的多余行不进行压缩,直接传递到下一阶段(在这里指的是第四行)。       

        下一阶段中,继续三行分一组,进行压缩,直到最后得到两行部分积,此时使用一个普通的多位传播进位加法器或者超前进位加法器等进行(两数相加)向量合并。可以看到只需要两个阶段,十六个部分积就可被压缩至两行。这个结构使用了五个全加器和三个半加器(不包括最后的向量合并器)。 

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

图2 华莱士树乘法器仿真结果

图3 华莱士树乘法器综合结果

        在Design Compiler中使用report_timing命令,可以得到关键路径的延迟,如图4所示,可以看出延迟仅有1.39ns。性能优于进位保留乘法器,远由于普通的阵列乘法器,这是由于此时将部分分组并分别处理,结果大约能在三级加法器的延迟后得到。

图4 华莱士树乘法器关键路径报告

        在Design Compiler中使用report_area命令,报告所设计电路的面积占用情况,如图5所示,可以看到这个面积略大于阵列乘法器,这是由最后的向量合并加法器贡献的,所以这个面积随着数据位宽的增加不会迅速变大。如果不考虑向量合并加法器的影响,阵列乘法器使用了八个全加器和四个半加器,进位保留乘法器使用了六个全加器和六个半加器,而华莱士树乘法器仅仅用了五个全加器和三个半加器,该实现减少了位宽较大乘法器的硬件开销,同时对传播延时的优化也很显著。

 图5 华莱士树乘法器面积报告

        进位保留乘法器的Verilog代码如下所示。

module Wallace_Multiplier (
    input      [3:0]    A      ,
    input      [3:0]    B      ,
    output  [7:0]    Sum
);

    wire [3:0] partial_product [3:0];  

    wire [3:0] W_level1_c,W_level1_carry;
    wire [3:0] W_level2_c,W_level2_carry;


    assign partial_product[0]=B[0]?A:0;
    assign partial_product[1]=B[1]?A:0;
    assign partial_product[2]=B[2]?A:0;
    assign partial_product[3]=B[3]?A:0;

    // level1
    Adder_half adder_half_u1 (
        .Mult1    (partial_product[0][1]),
        .Mult2    (partial_product[1][0]),
        .Res    (Sum[1]),
        .Carry(W_level1_carry[0])
    ); 

    Adder adder_u1 (
        .Mult1     (partial_product[0][2]),
        .Mult2     (partial_product[1][1]),
        .I_carry (partial_product[2][0]),
        .Res     (W_level1_c[1]),
        .Carry (W_level1_carry[1])
    );

    Adder adder_u2 (
        .Mult1     (partial_product[0][3]),
        .Mult2     (partial_product[1][2]),
        .I_carry (partial_product[2][1]),
        .Res     (W_level1_c[2]),
        .Carry (W_level1_carry[2])
    );

    Adder_half adder_half_u2 (
        .Mult1    (partial_product[1][3]),
        .Mult2    (partial_product[2][2]),
        .Res    (W_level1_c[3]),
        .Carry(W_level1_carry[3])
    ); 

    // level2
    Adder_half adder_half_u3 (
        .Mult1    (W_level1_c[1]),
        .Mult2    (W_level1_carry[0]),
        .Res    (Sum[2]),
        .Carry(W_level2_carry[0])
    ); 

    Adder adder_u3 (
        .Mult1     (W_level1_c[2]),
        .Mult2     (W_level1_carry[1]),
        .I_carry (partial_product[3][0]),
        .Res     (W_level2_c[1]),
        .Carry (W_level2_carry[1])
    );

    Adder adder_u4 (
        .Mult1     (W_level1_c[3]),
        .Mult2     (W_level1_carry[2]),
        .I_carry (partial_product[3][1]),
        .Res     (W_level2_c[2]),
        .Carry (W_level2_carry[2])
    );

    Adder adder_u5 (
        .Mult1     (W_level1_carry[3]),
        .Mult2     (partial_product[2][3]),
        .I_carry (partial_product[3][2]),
        .Res     (W_level2_c[3]),
        .Carry (W_level2_carry[3])
    );
    assign Sum[7:3]={partial_product[3][3],W_level2_c[3:1]}+{W_level2_carry[3:0]};
    assign Sum[0]=partial_product[0][0];
endmodule

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

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

相关文章

ToBeWritten之让响应团队参与并做好沟通

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…

网页动画科普LLM原理;淘宝推出AI试衣间;爆火的AI极简人像;100天创业日程表;Llama 2详解 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🔥 Meta Connect 2023,发布基于 LLama 2 的AI聊天助手和虚拟角色 9月27日-28日,Meta 举办了年度重要会议 Meta Co…

vue3 + vite项目使用SVG图标

我们在开发一个项目时常会用到一些图标,有些图标在有限的图标库中却是没有,因此少数的图标需要我们去网上查找,或是自定义一些专用的图标。一般很少有图标库满足现实的项目开发,这时将推荐使用 iconify 这个图标库,几乎…

Zabbix 监控系统安装和部署

Zabbix 监控系统安装和部署 一、zabbix 是什么?1.1、zabbix 监控原理(重点)1.2、Zabbix 6.0 新特性1.3、Zabbix 6.0 功能组件1.4、数据库1.5、Web 界面1.6、Zabbix Agent1.7、Zabbix Proxy1.8、Java Gateway 二、部署Zabbix 6.02.1、 解决 za…

通达信指标预警信号,自动发送给微信好友1.0

1.功能介绍:十一节假日期间写了一个,可将股票指标预警信号,自动发送给微信好友/微信群(即电脑端的消息,通过模拟微信操作可在手机上显示)。本工具按通达信写的,如果大智慧,同花顺也能…

Flutter环境搭建及新建项目

一、下载安装压缩包 https://storage.flutter-io.cn/flutter_infra_release/releases/stable/windows/flutter_windows_3.10.6-stable.zip 二、解压缩 解压之后,将里面的flutter整体拿出来 三、配置环境变量 将flutter/bin全路径配置到系统环境变量里面 四、运行…

12.2 实现键盘模拟按键

本节将向读者介绍如何使用键盘鼠标操控模拟技术,键盘鼠标操控模拟技术是一种非常实用的技术,可以自动化执行一些重复性的任务,提高工作效率,在Windows系统下,通过使用各种键盘鼠标控制函数实现动态捕捉和模拟特定功能的…

用vscode进行远程主机开发

文章目录 插件操作步骤FQA 插件 Remote - SSH - 通过使用 SSH 打开远程计算机或者VM上的文件夹,来连接到任何位置。 操作步骤 使用Vscode利用Remote进行远端开发必须现在Vscode内安装插件 安装完成后,底部工具栏会出现一个绿色按钮,如下…

Vue中如何进行图像处理与图像滤镜

在Vue中进行图像处理与图像滤镜 图像处理和滤镜效果是现代Web应用程序中常见的功能之一。Vue.js作为一个流行的JavaScript框架,为实现这些功能提供了许多工具和库。本文将介绍如何使用Vue来进行图像处理与图像滤镜,包括使用HTML5 Canvas和CSS滤镜。 准备…

《有了这些可视化应用,再来一场亚运会也不怕!》

亚运会遇上中秋国庆千万大流量涌入城市,旅游、交通、应急消防等部门指挥中心人员,会如何运筹帷幄呢? 还记得刘涛在《开端》里,每次出场都在指挥中心,看着一堆大屏找线索。在早些年《人民的名义》里,汉东省的…

cap分布式理论

cap 理论 cap是实现分布式系统的思想。 由3个元素组成。 Consistency(一致性) 在任何对等 server 上读取的数据都是最新版,不会读取出旧数据。比如 zookeeper 集群,从任何一台节点读取出来的数据是一致的。 Availability&…

UG\NX二次开发 重命名特征对象 UF_OBJ_set_name

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 林闹 订阅本专栏,非常感谢。 简介 UG\NX二次开发 重命名特征 UF_OBJ_set_name 效果 代码 #include "me.hpp" #include <vector> #include

RT-Thread 中断管理(学习一)

中断管理 什么是中断&#xff1f;简单的解释就是系统正在处理某一个正常事件&#xff0c;忽然被另一个需要马上处理的紧急事件打断&#xff0c;系统转而处理这个紧急事件&#xff0c;待处理完毕&#xff0c;再恢复运行刚才被打断的事件。生活中&#xff0c;我们经常会遇到这样…

Ultra-Fast-Lane-Detection-v2 {后处理优化}//参考

采用三次多项式拟合生成的anchor特征点&#xff0c;在给定的polyfit_draw函数中&#xff0c;degree参数代表了拟合多项式的度数。 具体来说&#xff0c;当我们使用np.polyfit函数进行数据点的多项式拟合时&#xff0c;我们需要指定一个度数。这个度数决定了多项式的复杂度。例…

buuctf-[GYCTF2020]Blacklist sql堆叠注入

这题我一开始还以为是rce&#xff0c;但是看到注入框内写了1&#xff0c;那就肯定是sql 提交1 1 报错&#xff0c;更加确定是sql 1 order by 2 -- 说明是两列 1 union select 1,# 发现select被过滤了 这里我想起了之前做的强网杯的随便住&#xff0c;也是被过滤了&#x…

unocss+vite+vue3初使unocss

一、什么是UnoCss&#xff1f; UnoCSS 是一个即时的原子CSS引擎&#xff0c;而非一款框架&#xff0c;因为它并未提供核心工具类&#xff0c;所有功能可以通过预设和内联配置提供。它可以让你用简短的类名来控制元素的样式 原子样式也有很多选择&#xff0c;最著名的就是 Tail…

Sonar代码审查

概念 Sonar 下载地址 是一款功能强大的代码审核工具&#xff0c;可以帮助开发团队更好的维护项目代码。同时&#xff0c;Sonar只是一个统称&#xff0c;这款工具不是单纯一个应用&#xff0c;一般来说我们会使用Sonar Qube和Sonar scanner这两个组件来搭配使用。Sonar Scanner…

面试算法21:删除倒数第k个节点

题目 如果给定一个链表&#xff0c;请问如何删除链表中的倒数第k个节点&#xff1f;假设链表中节点的总数为n&#xff0c;那么1≤k≤n。要求只能遍历链表一次。 例如&#xff0c;输入图4.1&#xff08;a&#xff09;中的链表&#xff0c;删除倒数第2个节点之后的链表如图4.1&a…

LabVIEW应用开发——控件的使用(一)

LabVIEW与其他开发语言相比&#xff0c;最大的优点就是可用控件非常多&#xff0c;涵盖了各种数值、数组、波形、图表、图形等控件&#xff0c;在前面板右键调出控件面板选择。 1、数值型控件 按左上角的图钉&#xff0c;可以使相同控件类别的固定显示&#xff0c;始终处于打开…

模板中的依赖类型使用 --- typename

依赖类型&#xff0c;顾名思义就是依赖于模板参数的类型&#xff0c;在使用这种类型时&#xff0c;必须使用 typename&#xff0c;否则编译器是无法知道是在使用类型&#xff0c;还是类的成员&#xff08;因为类的静态成员的使用方法也是T::xxx&#xff0c;这跟某个类中的类型的…