Wallace树乘法器专题研究

绪论:在乘法器的设计中采用树形乘法器,可以减少关键路径和所需的加法器单元数目,Wallace树乘法器就是其中的一种。下面以一个4*4位乘法器为例介绍Wallace树乘法器及其Verilog HDL实现。

原理:Wallace树乘法器的运算原理如下:

从数据最密集的地方开始,不断的反复使用全加器、半加器来覆盖“树”。全加器是一个3输入2输出的器件,因此全加器又称作3—2压缩器。通过全加器将树的深度不断缩减,最终缩减为一个深度为2的树。最后一级则采用简单的2输入加法器组成。

部分积

被乘数

X3

X2

X1

X0

乘数

Y3

Y2

Y1

Y0

X3y0

(a[6])

X2y0

(a[3])

X1y0

(a[1])

X0y0

(a[0])

X3y1 (a[10])

X2y1

(a[7])

X1y1

(a[4])

X0y1

(a[2])

X3y2 (a[13])

X2y2 (a[11])

X1y2

(a[8])

X0y2

(a[5])

X3y3 (a[15])

X2y3 (a[14])

X1y3 (a[12])

X0y3 (a[9])

第一级

6

5

4

3

2

1

0

X3y3 (a[15])

X3y2 (a[13])

X3y1 (a[10])

X3y0

(a[6])

X2y0

(a[3])

X1y0

(a[1])

X0y0

(a[0])

X2y3 (a[14])

X2y2 (a[11])

X2y1

(a[7])

X1y1

(a[4])

X0y1

(a[2])

X1y3 (a[12])

X1y2

(a[8])

X0y2

(a[5])

X0y3 (a[9])

加法器结果

[1 : 0] b1

[1 : 0] b0

注:对第一级的绿色部分,即a[8]和a[9],以及a[11]和a[12],使用半加器进行处理,

其verilog HDL代码体现如下:

1. hadd U1(.x(a[8]), .y(a[9]), .out(b0));  //2输入半加器(第一级)

2. hadd U2(.x(a[11]), .y(a[12]), .out(b1));//第一级

输出分别为b0和 b1 。

第二级

6

5

4

3

2

1

0

X3y3 (a[15])

X3y2 (a[13])

X3y1 (a[10])

X3y0

(a[6])

X2y0

(a[3])

X1y0

(a[1])

X0y0

(a[0])

X2y3 (a[14])

b1[0]

X2y1

(a[7])

X1y1

(a[4])

X0y1

(a[2])

b1[1]

b0[1]

b0[0]

X0y2

(a[5])

加法器结果

[1 : 0] C3

[1 : 0] C2

[1 : 0] C1

[1 : 0] C0

注:半加器仍然用绿色部分表示,全加器用橙色部分表示,第二级经过半加器以及全加器的处理后,到达第三级。

其verilog HDL代码体现如下:

1.     hadd U3(.x(a[4]), .y(a[5]), .out(c0)); //第二级

2.     fadd U4(.x(a[6]), .y(a[7]), .z(b0[0]), .out(c1)); //3输入全加器(第二级)

3.     fadd U5(.x(b1[0]), .y(a[10]), .z(b0[1]), .out(c2));

4.     fadd U6(.x(a[13]), .y(a[14]), .z(b1[1]), .out(c3));

第三级

6

5

4

3

2

1

0

X3y3 (a[15])

C3[0]

C2[0]

C1[0]

X2y0

(a[3])

X1y0

(a[1])

X0y0

(a[0])

C3[1]

C2[1]

C1[1]

C0[1]

C0[0]

X0y1

(a[2])

 

注:第三级树的深度减少到2,采用简单的2输入加法器即可得到最后的结果。 

其在verilog HDL代码中的体现如下:

1.     assign add_a = {c3[1],c2[1],c1[1],c0[1],c0[0],a[2]}; //加法器(第三极)

2.     assign add_b = {a[15],c3[0],c2[0],c1[0],a[3],a[1]};

3.     assign add_out = add_a + add_b;

4.     assign out = {add_out,a[0]};

Verilog HDL 描述:

整个电路的verilog HDL 设计代码如下:

1. module wallace(x,y,out);

2.     parameter size = 4; //定义参数,乘法器的位数

3.     input [size - 1 : 0] x,y; //输入y是乘数,x是被乘数

4.     output [2*size - 1 : 0] out;

5.     wire [size*size - 1 : 0] a; //a为部分积

6.     wire [1 : 0] b0, b1; //第一级的输出,包含进位

7.     wire [1 : 0] c0, c1, c2, c3; //第二级的输出,包含进位

8.     wire [5 : 0] add_a, add_b; //第三极的输入

9.     wire [6 : 0] add_out; //第三极的输出

10.     wire [2*size - 1 : 0] out; //乘法器的输出(组合逻辑)

11.

12.     assign a = {x[3],x[2],x[3],x[1],x[2],x[3],x[0],x[1],

13.                 x[2],x[3],x[0],x[1],x[2],x[0],x[1],x[0]}

14.                 &{y[3],y[3],y[2],y[3],y[2],y[1],y[3],y[2]

15.                 ,y[1],y[0],y[2],y[1],y[0],y[1],y[0],y[0]}; //部分积

16.

17.     hadd U1(.x(a[8]), .y(a[9]), .out(b0));  //2输入半加器(第一级)

18.     hadd U2(.x(a[11]), .y(a[12]), .out(b1));//第一级

19.     hadd U3(.x(a[4]), .y(a[5]), .out(c0)); //第二级

20.

21.     fadd U4(.x(a[6]), .y(a[7]), .z(b0[0]), .out(c1)); //3输入全加器(第二级)

22.     fadd U5(.x(b1[0]), .y(a[10]), .z(b0[1]), .out(c2));

23.     fadd U6(.x(a[13]), .y(a[14]), .z(b1[1]), .out(c3));

24.

25.

26.     assign add_a = {c3[1],c2[1],c1[1],c0[1],c0[0],a[2]}; //加法器(第三极)

27.     assign add_b = {a[15],c3[0],c2[0],c1[0],a[3],a[1]};

28.     assign add_out = add_a + add_b;

29.     assign out = {add_out,a[0]};

30.

31. endmodule

32.

33. //全加器模块

34. module fadd(x, y, z, out);

35.     input x, y, z;

36.     output [1 : 0] out;

37.     assign out = x + y + z;

38. endmodule

39.

40. //半加器模块

41. module hadd(x, y, out);

42.     input x, y;

43.     output [1 : 0] out;

44.     assign out = x + y;

45. endmodule

Testbench(测试) 文件代码如下:

1. //测试文件

2.

3. `timescale 1ns/1ps

4. module wallace_tb;

5.     reg [3 : 0] x, y;

6.     wire [7 : 0] out;

7.     wallace U1(.x(x), .y(y), .out(out)); //模块实例

8.

9.     initial

10.     begin

11.         x = 3;

12.         y = 4;

13.         # 20

14.         x = 2;

15.         y = 3;

16.         # 20

17.         x = 6;

18.         y = 8;

19.     end

20.

21. endmodule

用Modelsim仿真软件仿真图波形图如下:

测试发现,结果符合预期结果。

在ISE软件中仿真,其 RTL Schematic 如下:

Wallace树专题研究相关推荐

  1. 乘法器专题研究(内含所有类型乘法器)

    乘法器的verilog HDL设计汇总 1.移位相加乘法器的设计: 其大致原理如下: 从被乘数的最低位开始判断,若为1,则乘数左移i(i=0,1...(WIDTH-1))位后,与上一次和相加:若为0, ...

  2. 线段树专题-黑白棋盘 BZOJ-1453

    线段树专题-黑白棋盘 题目来源 BZOJ−1453BZOJ-1453BZOJ−1453 题意 QQQ次操作 每次操作给出(x,y)(x,y)(x,y),将(x,y)(x,y)(x,y)个格子颜色取反 ...

  3. 线段树专题-等差子序列 BZOJ-2124

    线段树专题-等差子序列 感谢 感谢孙耀峰的线段树PPT,使我获益匪浅. 题目来源 BZOJ−2124BZOJ-2124BZOJ−2124 题意 给出长度为nnn的1−n1-n1−n的排列AAA 问是否 ...

  4. 国家开放大学2021春1087数学分析专题研究题目

    教育 教育 试卷代号:1087 2021年春季学期期末统一考试 数学分析专题研究 试题 2021年7月 一.单项选择题(每小题4分,共20分) 1.设映射f:A→B,g:B→C,且g.f:A→C是双射 ...

  5. 原码一位乘法器设计_数字IC校招基础知识点复习(七)——超前进位加法器、Wallace树、Booth乘法器...

    1.超前进位加法器 看了一些面经,提到会让你用基础的门搭加法器,因此首先得熟悉半加器,全加器等最基础的加法器才能理解之后的超前进位加法器,树型加法器等复杂的加法器. 半加器的输入为a,b,输出为结果s ...

  6. 【报告分享】巨量算数:疫情期间汽车专题研究洞察.pdf(附下载链接)

    今天给大家分享的报告是巨量算数于2020年3月发布的<巨量算数:疫情期间汽车专题研究洞察.pdf>,报告包含如下四大部分:1.疫情对汽车行业的影响:2.疫情对用户购车决策的影响:3.汽车兴 ...

  7. c#养老院老人信息管理系统源码 论文_我市“老年人关爱服务体系建设”专题研究论文荣获第五届青年学者老龄论坛特等奖_社会民生_新闻频道...

    10月31日,由省老龄委(老年学会)举办的第七届研究生老龄论坛.第五届青年学者老龄论坛暨首届长三角青年老龄论坛,在无锡江南大学举行.应邀参加论坛的我市"长寿星养老"服务中心总监陈海 ...

  8. 网格向量必须包含特征点。_【专题研究】基于SVM支持向量机模型的选股策略

    研究过集成学习中的随机森林和XGBoost后,本文将介绍一种更传统的机器学习方法:SVM支持向量机.SVM由于其较高的准确度,并且能够解决非线性分类问题,曾一度成为非常流行的机器学习算法.本文分别介绍 ...

  9. 国家开放大学2021春1079高等代数专题研究题目

    教育 教育 试卷代号:1079 2021年春季学期期末统一考试 高等代数专题研究 试题 2021年7月 一.单项选择题(本题共20分,每小题4分) 1.下列运算中,( )是有理数域Q上的代数运算. A ...

最新文章

  1. 超越Google,快手落地业界首个万亿参数推荐精排模型
  2. 用最简单的例子说明设计模式(一)之单例模式、工厂模式、装饰模式、外观模式...
  3. 每天一道LeetCode-----从右向左观察一棵二叉树,返回能看到的元素
  4. JavaScript将成为浏览器战争的主战场
  5. oracle空值判断 =,Oracle,sql server的空值(null)判断
  6. 蓝牙核心规范5.1:革新精确定位技术
  7. 【转】SharePoint 2010 用户自定义编辑Meta标签的OOB方法
  8. C++ primer 11章关联容器
  9. 有n 个长为m+1 的字符串,求前后m个字符匹配所能形成的最长字符串链:利用弗洛伊德算法求最长路径...
  10. 雨田计算机老师,你们感觉雨田最好的老师是谁?
  11. 关于路由器老毛子Padavan固件作为主副路由桥接的问题
  12. 在python中不论类的名字是什么构造方法的名字_2020年超星尔雅最新穿T恤听古典音乐答案搜题公众号...
  13. 如何让一个未知宽高的div垂直居中
  14. 【研究生本科论文】论文语言常见的五个问题
  15. 股价上涨,资金流出以及内外盘的关系
  16. 【9102年】考研还是找工作?分享看完心得体会(如果你错过了月亮,那就不要错过星星了)
  17. BZOJ 3168 [Heoi2013]钙铁锌硒维生素 ——矩阵乘法 矩阵求逆
  18. UIPinchGestureRecognizer 放大、缩小手势
  19. 将oracle数据库中的数据导入redis数据库演示
  20. linux who命令详解,Linux who命令详解

热门文章

  1. python 单元测试_聊聊 Python 的单元测试框架(一):unittest
  2. python如何调用参数配置文件_python参数设置
  3. px4驱动linux,px4开发指南——linux下qgroundcontrol地面站安装
  4. php访问父类变量,php – 如何使用parent :: method访问父类中的变量
  5. ie对java的设置字体,css3文字特效和浏览器兼容性
  6. redhad yum 安装mysql_yum安装Mysql
  7. 大一java实训报告1500字_从800字小作文,到3000字小论文你用了多久? | 校媒FM
  8. 走火入魔 | 暑期电子设计课程学生们的作品
  9. 对于STM32F103三轴机械臂控制器进行基本功能测试-上下运动功能
  10. Only Available on April 1st