数字IC前端学习笔记:数字乘法器的优化设计(Dadda Tree乘法器)
相关阅读
数字IC前端
https://blog.csdn.net/weixin_45791458/category_12173698.html?spm=1001.2014.3001.5482
华莱士树仍然是一种比较规则的结构(这使得可以方便地生成树的结构),这导致了它所使用的全加器和半加器个数不是最少的,Dadda提出了一种改良华莱士树的方式,这后来被称为Dadda Tree。他使用了最少数量的全加器以及半加器来重构了树,且能保证树的级数(深度)不变,这就在节省硬件资源的情况下保证了相似的性能。
达达树的压缩策略如下算法所示。
- 令
,
,其中中括号表示向下取整。找到最大的j,使得至少一列部分积的深度大于
。
- 使用全加器或半加器去压缩那些深度超过
的列,使得这些列的深度不大于
,这里要考虑到来自低位的压缩进位以及尽可能少地使用器件。
- 重复步骤1和2直到部分积变成只有两行或者说
。
根据这个算法,可以得到dadda的树的结构,如图1所示。图中的斜杠/代表一个全加器,连接的分别是右上角的本位和以及左下角给高位的进位,带反斜杠\的/表示是半加器。
具体的压缩过程为,首先按照规则找到最大的j为3,其中第4列(从右到左)有4列部分积,所以使用一个半加器压缩,第5列的部分积加上第4列的进位,一共有4列部分积,所以也需用一个半加器压缩。然后接着重复步骤1,找到最大的j为2,其中第3列有3列部分积,所以使用一个半加器压缩,第4列因为第3列的进位,所以有4列部分积,因此需要全加器压缩,第5、6列同理需要使用全加器压缩,得到最后2行部分积。最后使用向量合并器(可以是传播进位加法器,也可以是超前进位加法器)将部分积累加。

图1 dadda树乘法器的覆盖过程
具体的Verilog代码实现见附录,Modelsim软件仿真截图如图2所示。使用Synopsis的综合工具Design Compiler综合的结果如图3所示,综合使用了0.13μm工艺库。
图2 dadda树乘法器仿真结果
图3 dadda树乘法器综合结果
在Design Compiler中使用report_timing命令,可以得到关键路径的延迟,如图4所示,可以看出延迟有1.54ns,略差于华莱士树,这是因为达达树最后的向量合并器的数据位宽较大。
图4 dadda树乘法器关键路径报告
在Design Compiler中使用report_area命令,报告所设计电路的面积占用情况,如图5所示,可以看到这个面积优于华莱士树乘法器,不考虑最后的向量合并器,达达树仅仅使用了三个全加器和三个半加器就完成了四位数据的部分积累加,相比之下,华莱士树使用了五个全加器和三个半加器,当数据位宽增加时,华莱士树乘法器对于加法器的需求增加也比达达树快,因此达达树是华莱士树的优化版,但达达树不具有华莱士树的规则的结构,设计起来会比较消耗时间和人力。

图5 dadda树乘法器面积报告
dadda树乘法器的Verilog代码如下所示。
module Dadda_Multiplier (input [3:0] A ,input [3:0] B ,output [7:0] Sum
);wire [3:0] partial_product [3:0]; wire [1:0] W_level1_c,W_level1_carry;wire [3:0] W_level2_c,W_level2_carry;wire [6:0] W_level3[0:1];//产生部分积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;// level1Adder_half adder_half_u1 (.Mult1 (partial_product[2][1]),.Mult2 (partial_product[3][0]),.Res (W_level1_c[0]),.Carry(W_level1_carry[0])); Adder_half adder_half_u2 (.Mult1 (partial_product[3][1]),.Mult2 (partial_product[2][2]),.Res (W_level1_c[1]),.Carry(W_level1_carry[1]));// level2Adder_half adder_half_u3 (.Mult1 (partial_product[1][1]),.Mult2 (partial_product[2][0]),.Res (W_level2_c[0] ),.Carry(W_level2_carry[0]));Adder adder_u1 (.Mult1 (partial_product[0][3]),.Mult2 (partial_product[1][2]),.I_carry (W_level1_c[0] ),.Res (W_level2_c[1] ),.Carry (W_level2_carry[1] ));Adder adder_u2 (.Mult1 (partial_product[1][3]),.Mult2 (W_level1_c[1] ),.I_carry (W_level1_carry[0] ),.Res (W_level2_c[2] ),.Carry (W_level2_carry[2] ));Adder adder_u3 (.Mult1 (partial_product[2][3]),.Mult2 (partial_product[3][2]),.I_carry (W_level1_carry[1] ),.Res (W_level2_c[3] ),.Carry (W_level2_carry[3] ));assign W_level3[0] = {partial_product[3][3], W_level2_c[3:1], partial_product[0][2:0]};assign W_level3[1] = {W_level2_carry[3:0], W_level2_c[0], partial_product[1][0], 1'b0};assign Sum = W_level3[0] + W_level3[1];endmodule
相关文章:
数字IC前端学习笔记:数字乘法器的优化设计(Dadda Tree乘法器)
相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 华莱士树仍然是一种比较规则的结构(这使得可以方便地生成树的结构),这导致了它所使用的全加器和半加器个数不是最少的ÿ…...
计算机专业毕业设计项目推荐14-文档编辑平台(SpringBoot+Vue+Mysql)
文档编辑平台(SpringBootVueMysql) **介绍****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式,在编写的…...
【读书后台管理系统】—后端框架搭建(二)
【读书后台管理系统】—后端框架搭建(二) 一、 Node 简介 Node 是一个基于 V8 引擎的 Javascript 运行环境,它使得 Javascript 可以运行在服务端,直接与操作系统进行交互,与文件控制、网络交互、进程控制等 Chrome …...
【DLoopDetector(C++)】DBow2词袋模型loop close学习
0.前言 最近读了两篇论文,论文作者开源了一种基于词袋模型DBoW2库的DLoopDetector算法,自己运行demo测试一下 对应论文介绍:Bags of Binary Words for Fast Place Recognition in Image Sequences 开源项目Github地址:https://gi…...
什么是CAS机制?
CAS和Synchronized的区别是什么?适合什么样的场景?有什么样的优点和缺点? 示例程序:启动两个线程,每个线程中让静态变量count循环累加100次。 public class ThreadTest {private static int count 0;public static …...
Java多态详解
下面讲解一下Java中的多态机制,力求用最通俗易懂的语言,最精炼的话语,最生动的例子,深入浅出Java多态,帮助读者轻松掌握这个知识点。 什么是多态? 多态是指同一种行为具有多个不同表现形式的能力。 多态…...
Android中简单实现Spinner的数据绑定
Android中简单实现Spinner的数据绑定 然后声明对象实例并加入到arraylist里面,并设置spinner的适配器 Spinner Sp (Spinner).............// List<CItem > lst new ArrayList<CItem>(); CItem ct new CItem ("1","测试"); lst.Add(ct)…...
【版本控制工具二】Git 和 Gitee 建立联系
文章目录 前言一、Git 和 Gitee 建立联系1.1 任意目录下,打开 git bash 命令行,输入以下命令生成公钥1.2 配置SSH公钥1.3 进行全局配置 二、其它相关Git指令2.1 常用指令2.2 指令操作可能出现的问题 三、补充3.1 **为什么要先commit,然后pull…...
最新AI智能创作系统ChatGPT商业源码+详细图文搭建部署教程+AI绘画系统
一、AI系统介绍 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧&am…...
【算法与数据结构】--目录
第一部分:算法基础 第一章:算法入门第二章:数据结构概述第三章:算法设计与分析 3.1 贪心算法3.2 动态规划3.3 分治算法3.4 回溯算法 第二部分:常见数据结构 第四章:数组和链表 4.1 数组4.2 链表4.3 比较…...
爱普生LQ1900KIIH复位方法
爱普生EPSON 1900KIIH是一部通用针式打印机,136列(10cpi下)的打印宽度,缓冲区128KB,打印速度为270字/秒。 打印机类型 打印方式:24针击打式点阵打印、打印方向:双向逻辑查找、安全规格标准&am…...
字段位置顺序对值的影响
Unity中验证AB加载场景时报错: Cannot load scene: Invalid scene name (empty string) and invalid build index -1 报错原因是因为把字段放在了Start函数后面(图一)改成(图二)就好了。图一中协程使用的sceneBName字段值为null。 图一: 图二:…...
pytorch_神经网络构建2(数学原理)
文章目录 深层神经网络多分类深层网络反向传播算法优化算法动量算法Adam 算法 深层神经网络 分类基础理论: 交叉熵是信息论中用来衡量两个分布相似性的一种量化方式 之前讲述二分类的loss函数时我们使用公式-(y*log(y_)(1-y)*log(1-y_)进行误差计算 y表示真实值,y_表示预测值 …...
Oracle SQL Developer 中查看表的数据和字段属性、录入数据
在Oracle SQL Developer中,选中一个表时,右侧会列出表的情况;第一个tab是字段的名称、数据类型等属性; 切换到第二个tab,显示表的数据; 这和sql server management studio不一样的; 看一下部门…...
java docker图片叠加水印中文乱码
java docker图片叠加水印中文乱码 技术交流博客 http://idea.coderyj.com/ 1.由于项目需要后端需要叠加图片水印,但是中文乱码,导致叠加了之后 中文是框框 2.经过多方查找基本都说在 linux下安装字体就解决了,但是尝试了均无效 3.后来忽然想到我的项目是用docker打包部署的,不…...
string类的使用方式的介绍
目录 前言 1.什么是STL 2. STL的版本 3. STL的六大组件 4.STL的缺陷 5.string 5.1 为什么学习string类? 5.1.1 C语言中的字符串 5.2 标准库中的string类 5.3 string类的常用接口的使用 5.3.1 构造函数 5.3.2 string类对象的容量操作 5.3.3 string类对象…...
FFmpeg 命令:从入门到精通 | 命令行环境搭建
FFmpeg 命令:从入门到精通 | 命令行环境搭建 FFmpeg 命令:从入门到精通 | 命令行环境搭建安装 FFmpeg验证 FFmpeg 是否安装成功 FFmpeg 命令:从入门到精通 | 命令行环境搭建 安装 FFmpeg 进入 FFmpeg 官网: 点击 Download&#…...
《从零开始学ARM》勘误
1. 50页 2 51页 3 236页 14.2.3 mkU-Boot 修改为: mkuboot 4 56页 修改为: 位[31:24]为条件标志位域,用f表示; 位[23:16]为状态位域,用s表示; 位[15:8]为扩展位域&…...
10款录屏软分析与选择使用,只看这篇文章就轻松搞定所有,高清4K无水印录屏,博主UP主轻松选择
录屏软件整理 如下为录屏软件,通过思维导图展示分析介绍: https://www.drawon.cn/template/details/6522bd5e0dad9029a0b528e1 如下为整理的录屏软件列表 名称产地价格支持的平台下载地址说明OBS国外免费开源windows/linux/machttps://obsproject.co…...
android: android:onClick=“@{() -> listener.onItemClick(viewModel)}“
一、前言:在我使用editTest控件的时候,它的下方有一条横线。我想把它去掉然后我在布局文件中这样写 android:background"null" 导致报错,报错信息是: android:onClick"{() -> listener.onItemClick(viewModel)…...
Qt 串口编程实战:keySight 34401A 万用表数据采集与存储
1. 项目背景与硬件准备 keySight 34401A 数字万用表是实验室常见的六位半高精度测量设备,支持GPIB和RS-232两种通信接口。在实际工业测量场景中,RS-232串口连接因其布线简单、成本低廉的特点,成为许多开发者的首选方案。我最近接手的一个电池…...
一天一个开源项目(第57篇):Unsloth - 2x 更快、70% 更省显存的 LLM 微调库
引言 “Train gpt-oss, DeepSeek, Gemma, Qwen & Llama 2x faster with 70% less VRAM!” 这是「一天一个开源项目」系列的第 57 篇文章。今天介绍的项目是 Unsloth(GitHub)。 想在自己的 GPU 上微调大模型,却苦于显存不足、训练太慢&am…...
Nunchaku-FLUX.1-dev副业变现路径:AI绘画接单全流程(接单→提示词→交付)
Nunchaku-FLUX.1-dev副业变现路径:AI绘画接单全流程(接单→提示词→交付) 1. 从兴趣到收入:为什么选择Nunchaku-FLUX.1-dev做副业 如果你对AI绘画感兴趣,并且拥有一张消费级的显卡,比如RTX 3090或4090&am…...
AutoGLM-Phone-9B开箱即用:跟着这篇,快速部署你的移动端大模型
AutoGLM-Phone-9B开箱即用:跟着这篇,快速部署你的移动端大模型 1. AutoGLM-Phone-9B简介 1.1 什么是AutoGLM-Phone-9B AutoGLM-Phone-9B是一款专为移动端优化的多模态大语言模型,它能够同时处理视觉、语音和文本三种输入方式。这个模型最大…...
C++的std--ranges视图缓存
C的std::ranges视图缓存:高效数据处理的现代利器 在C20中,std::ranges库的引入彻底改变了数据处理的范式,其中视图缓存(View Caching)作为一项关键技术,显著提升了代码的性能与可读性。视图缓存允许开发者…...
跨地域公司短号互拨实战:用miniSIPServer+SIP话机打通两地分机(含完整号码变换规则)
跨地域企业短号互通实战:基于miniSIPServer的智能路由与号码变换体系 当企业分支机构分布在不同城市时,如何让员工继续沿用熟悉的短号拨号习惯,同时实现主叫号码的规范显示?这个看似简单的需求背后,隐藏着VoIP系统中号…...
DAMOYOLO-S边缘端部署指南:STM32F103C8T6嵌入式平台推理优化
DAMOYOLO-S边缘端部署指南:STM32F103C8T6嵌入式平台推理优化 1. 引言 如果你正在为一个资源极其有限的嵌入式设备寻找一个能跑起来的目标检测方案,比如用一块小小的STM32F103C8T6开发板,那么这篇文章就是为你准备的。你可能已经尝试过一些经…...
Vue.js前端项目集成AI:SmallThinker-3B-Preview实现智能表单与对话
Vue.js前端项目集成AI:SmallThinker-3B-Preview实现智能表单与对话 1. 引言:当Vue.js遇见AI 你有没有遇到过这样的场景?用户填写一个复杂的表单,面对几十个选项不知所措;或者客服系统里,用户问了一个稍微…...
矩阵LED与矩阵按键的扫描驱动原理及实现
1. 矩阵LED与矩阵按键的硬件结构解析 第一次接触矩阵LED和矩阵按键时,我完全被那些交叉的线路搞晕了。后来才发现,它们的本质就是行和列的交叉网络。想象一下围棋棋盘,横线是行,竖线是列,每个交叉点就是一颗棋子——在…...
OpenClaw跨平台控制:ollama-QwQ-32B同步操作多台设备的配置
OpenClaw跨平台控制:ollama-QwQ-32B同步操作多台设备的配置 1. 为什么需要跨设备自动化控制 上个月我家里添置了三台不同用途的设备:一台用于媒体处理的Mac mini、一台跑深度学习模型的Linux服务器,还有一台Windows主机专门处理文档。每次需…...
