乘法器——基于Wallace树的4位乘法器实现
博主最近在学习加法器乘法等等相关知识,在学习乘法器booth编码加Wallace树压缩时,发现在压缩部分积的时候用到了进位保留加法器(Carry Save Adder),博主对这种加法器不是很理解,而且拖了好久,我一直认为进位保留加法器就是一般的串行加法器,今天终于有所理解,在这里给大家分享一下。
首先,我们举个例子,对于四位无符号数1011与1110相乘,我们可以得到如下式子:
1 0 1 1
x 1 1 1 0
------------------------------
0 0 0 0 PP1
1 0 1 1 PP2
1 0 1 1 PP3
1 0 1 1 PP4
------------------------------
乘积项中间结果有4个:PP1、PP2、PP3、PP4。由于进位保存加法器只能进行三个数的相加,因而可采用两个进位保存加法器实现。第一个进位保存加法器实现PP1、PP2、PP3的加法,第二个进位保存加法器将PP3和上一级的S和C相加。最终通过一个并行加法器输出积。计算过程如下:
第一个进位保存加法器
PP1: 0 0 0 0
PP2: 1 0 1 1 0
PP3: 1 0 1 1 0 0
---------------------------------------
sum1 1 1 1 0 1 0
c1 0 0 0 1 0 0
第二个进位保存加法器
carry_in: 1 0 1 1 0 0 0
sum1 0 1 1 1 0 1 0
c1 0 0 0 1 0 0 0
---------------------------------------
sum2: 1 1 0 1 0 1 0
c2: 0 0 1 1 0 0 0
并行加法器:
sum2: 1 1 0 1 0 1 0
c2: 0 1 1 0 0 0 0
---------------------------------------
result 1 0 0 1 1 0 1 0
我们注意到,在参与下一级运算的过程中,由于进位要用于高位的求和,故c1,c2均应左移一位求。算出来的结果为:10011010(154)。
所谓“进位保留”,便是进位不进上去,只在本位之间计算。
基于Wallace树的4位乘法器实现Verilog代码如下所示:
module wallace_multiplier(
input [3:0] a,
input [3:0] b,
output [7:0] result
);
wire [7:0] pp1;
wire [7:0] pp2;
wire [7:0] pp3;
wire [7:0] pp4;
wire [7:0] sum1;
wire [7:0] carry1;
wire [7:0] sum2;
wire [7:0] carry2;
assign pp1 = b[0] ? a : 'd0;
assign pp2 = b[1] ? a : 'd0;
assign pp3 = b[2] ? a : 'd0;
assign pp4 = b[3] ? a : 'd0;
assign result = sum2 + (carry2 << 1);
carry_save_adder u1_carry_save_adder(
pp1 ,
pp2 << 1'b1,
pp3 << 2'd2,
sum1 ,
carry1
);
carry_save_adder u2_carry_save_adder(
pp4 << 2'd3 ,
sum1 ,
carry1 << 1'b1,
sum2 ,
carry2
);
endmodule
module carry_save_adder
#(
parameter DATA_WIDTH = 7
)
(
input [DATA_WIDTH:0] a,
input [DATA_WIDTH:0] b,
input [DATA_WIDTH:0] cin,
output [DATA_WIDTH:0] sum,
output [DATA_WIDTH:0] cout
);
assign sum = a ^ b ^ cin;
assign cout = a & b | (a | b) & cin;
endmodule
testbench:
`timescale 1ns / 1ns
module wallace_multiplier_tb();
reg [3:0] a;
reg [3:0] b;
wire[7:0] result;
wallace_multiplier u_wallace_multiplier(
.a (a ),
.b (b ),
.result (result )
);
initial begin
a = 4'b0010;
b = 4'b0110;
#10;
a = 4'b0001;
b = 4'b1000;
#10;
a = 4'b1010;
b = 4'b0111;
#10;
a = 4'b1110;
b = 4'b0010;
#10;
a = 4'b1111;
b = 4'b1111;
#10;
a = 4'b0110;
b = 4'b1001;
end
endmodule
仿真结果如下图:

以上就是Wallace树型4位乘法器的实现了,我认为关键在于进位保留加法器(Carry Save Adder)的理解,希望能给大家带来帮助。
乘法器——基于Wallace树的4位乘法器实现的更多相关文章
- 乘法器——Wallace树型乘法器
博主最近在看乘法器相关的知识,发现现在用的比较多的是booth编码的乘法器和Wallace树型乘法器,当然两者并不是互斥的关系,他们也可以结合使用.在这里给大家介绍一下Wallace树型乘法器,希望能 ...
- 关于FPGA设计16位乘法器的两…
原文地址:关于FPGA设计16位乘法器的两种算法作者:ChrisChan 部分原代码如下: 用特权的右移算法虽复杂点,但节省不少LEs,如下图: 用左移算法尽管浅显易懂,但因每次都会从最右端移位,会占 ...
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- 查找(四)-------基于B树的查找和所谓的B树
关于B树,不想写太多了,因为花在基于树的查找上的时间已经特么有点多了,就简单写写算了,如果以后有需要,或者有时间,可以再深入写写 首先说一下,为什么要有B树,以及B树是什么,很多数据结构和算法的书上来 ...
- 基于R树索引的点面关系判断以及效率优化统计
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在之前的博客中,我分别介绍了基于网格的空间索引(http:// ...
- 基于设备树的controller学习(2)
作者 彭东林 pengdonglin137@163.com 平台 TQ2440 Linux-4.10.17 概述 上一篇大概介绍了一下demo-controller的结构,下面结合驱动分析. 正文 ...
- 基于设备树的TQ2440触摸屏驱动移植
平台 开发板:tq2440 内核:Linux-4.9 u-boot:u-boot-2015.04 概述 之前移植了LCD驱动,下面继续移植触摸屏驱动,然后将tslib也移植上去. 正文 一.移植触 ...
- 线段树(压位)luogu P1558色板游戏
题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L. 现在色板上只 ...
- 基于MPLAB X IDE配置位设置讲解
http://blog.csdn.net/superanters/article/details/8541171 在讲基于MPLAB X IDE 配置位配置前我先讲讲如何配置配置位. 比如PICLF1 ...
随机推荐
- Object.entries和Object.fromEntries
语法 Object.entries(obj) 参数 obj 可以返回其可枚举属性的键值对的对象. 返回值 给定对象自身可枚举属性的键值对数组 语法 Object.fromEntries(iterabl ...
- AHB总线协议(二)
下图是8拍回环字突发传输:地址将在 32 字节边界处回环因此地址 0x3C 之后的地址是 0x20. 下图是8增量半字突发传输,所以地址每次增加 2 个字节并且突发在递增因此地址连续增加通过了 16 ...
- vue+element下拉框样式的点击按钮
项目中点击按钮实在太多了,怎么办呢?我们就可以将它们制作成像下拉框那样的类似操作 1.HTML样式部分:关键点在于command 方法和属性 1 <el-dropdown 2 size=&quo ...
- uni-app项目配置记录
新建项目 直接使用编辑器快速新建,具体方法很简单,官方文档很详细,这里不在叙说 配置项目: 项目搭建好了之后,我们配置一些 api 和 router,这些直接在插件市场上面进行配置,非常好用 封装的r ...
- bugku秋名山老司机+写博客的第一天
bugku之秋名山老司机 题目连接:http://123.206.87.240:8002/qiumingshan/ 一点进去是这样的 请在两秒内计算这个式子...怎么可能算的出来 查看源码,无果.. ...
- my97Date如何多选日期且无重复日期
最终的效果是: 首先引用my97Date的js WdatePicker.js html代码 <textarea cols="" name="txtNoUseDate ...
- vue开发环境配置
一.开发工具 Visual Studio Code 二.环境搭建 vue推荐开发环境: Node.js: javascript运行环境(runtime),不同系统直接运行各种编程语言 npm: Nod ...
- OL8.0静默安装Oracle 19C
首先在edelivery中下载Oracle Linux 8.0 然后就默认安装系统 环境准备工具目前不支持OL8,所以需要手动安装,首先设置内核参数,在/etc/sysctl.conf追加 [root ...
- 两个概念:CCA和LDA
典型相关性分析(CCA) https://blog.csdn.net/Mbx8X9u/article/details/78824216 典型关联分析(Canonical Correlation Ana ...
- Fiddler抓包设置
介绍 Fiddler 在 PC 端和移动端,模拟器抓取数据包 Fiddler抓取PC端数据包: 这里 Fiddler 抓取网页客户端的数据包时,其原理就是在 客户端/浏览器 和 服务器端 之间,加上了 ...