数字电路基础知识——乘法器的设计(一)—— 并行、移位相加、加法树、查找表

乘法器的设计主要应用在数字信号处理和数字通信,本节主要介绍乘法器的四种实现方法。使用并行乘法器、移位相加乘法器、查找表乘法器、加法数乘法器。部分会涉及到寄存器时序逻辑电路。

乘法运算是由与、或、非等基本逻辑组合而成的,如下图所示是乘法器内部结构图:

乘法器这种组合逻辑可以加流水线(pipeline),自己设计时就可以根据系统需要设置最优的流水线级数,让吞吐量,延时与cost平衡。在这篇博客中会提到流水线乘法器的实现。

一、并行乘法器

采用并行乘法设计的乘法器,在Verilog中直接采用 * 设计,这种方法设计出来的乘法器需要根据综合工具得到乘法结果,往往这种算法都是比较差的算法。
特点:
由乘法运算符描述、由EDA软件综合
运算速度快、耗用资源多
例:用Verilog实现八位并行乘法器

module multi(a,b,c);
parameter size = 8;
input [size-1:0] a,b;
output [2*size-1:0] c;  //输出位宽assign c = a*b;
endmodule
二、移位相加乘法器
  1. 移位相加的原理
    从被乘数的最低位开始判断,若为1,则乘数左移i(i=0,1(width-1))位后,与上一次和进行相加,若为0,则乘数左移i位后,以0相加。直到被乘数的最高位。

    实际是由移位运算加法运算构成。比较高速。

  2. 优点:
    占用资源较少,主要在低速信号处理中

  3. 缺点:
    串行乘法器的速度比较慢,一个结果输出需要更多的时钟周期。在高位宽的乘法运算中非常明显。

关键算法:

module multi_shift(a,b,c);  //不可综合提供算法
parameter size = 8;
input [size-1:0] a,b;
output [2*size-1:0] c;  //输出位宽reg[2*size-1:0] c;integer i;
always@(a or b)
beginc=0;for (i=1; 1<=size;i=i+1) beginc = c + ((b[i] == 1)? (a<<[i-1]):0);   //移位相加end
end
endmodule
三、查找表乘法器
  1. 查找表乘法器原理:
    先将乘法的所有可能结果存储起来,然后将两个相乘的数据组合起来作为“地址”找到相应的结果。
    例如:
    设A,B为两个2位二进制数,则A,B各有4种取值可能,乘积有4*4=16种可能(排除重复的其实只有8种可能),我们先将{A,B}对应的16种可能结果存储起来,然后对于每一特点的输入组合{A,B},找到对应的输出即可。

  2. 查找表乘法器特点:
    该方式速度很快,只取决于读取存储器的速度,但是预存结果要占用较多资源,因此是面积换取速度思想的体现。

    随着乘数位宽的增加,需要存储的结果迅速增加,不利于实现,因此该方式适用于位宽很小的情况。但是我们可以将高位宽的数据分解成低位宽的数据再调用查找表乘法器。

    适用情况:适合位数较小的乘法,特别适合有一个乘数为固定的乘法。

  3. 设计思路
    对于四位查找表:
    A1 高两位, A2低两位

    对于八位查找表:
    A1 高四位, A2低四位

  4. 下面一段代码是2位查找表乘法器:

module lookup22(dina,dinb,dout,clk);
input [1:0] dina,dinb;
input clk;
output [3:0] dout;
reg [3:0] dout;always @ ( posedge clk )
begincase({dina,dinb})4'b0000:dout<=0;4'b0001:dout<=0;4'b0010:dout<=0;4'b0011:dout<=0;4'b0100:dout<=0;4'b0101:dout<=1;4'b0110:dout<=2;4'b0111:dout<=3;4'b1000:dout<=0;4'b1001:dout<=2;4'b1010:dout<=4;4'b1011:dout<=6;4'b1100:dout<=0;4'b1101:dout<=3;4'b1110:dout<=6;4'b1111:dout<=9;default: dout<=4'dx;endcase
end
endmodule

该乘法器计算两个2位数相乘只需要一个时钟周期。通过他们的组合,可以构成4位乘法器,代码如下:

  1. 下面一段代码是通过上面的组合 4位查找表乘法器:
module lookup44(dina,dinb,dout,clk);
input [3:0] dina,dinb;
input clk;
output [7:0] dout;
reg [7:0] dout;reg [1:0] a1,a2;     //操作数高2位
reg [1:0] b1,b2;    //操作数低2位
wire [3:0] dout1,dout2,dout3,dout4;     //乘积每两位一组//输入数据拆为高2位和低2位分别缓存
always @ ( posedge clk )
begina1<=dina[3:2]; a2<=dina[1:0];b1<=dinb[3:2]; b2<=dinb[1:0];
end    //调用2位查找表乘法器
lookup22 mul1(a1,b1,dout1,clk),mul2(a2,b1,dout2,clk),mul3(a1,b2,dout3,clk),mul4(a2,b2,dout4,clk);//将4个乘法运算的结果相加输出
always @ ( posedge clk )
begindout<=(dout1<<4)+(dout2<<2)+(dout3<<2)+dout4;
end
endmodule

该乘法器计算两个数相乘需要2个时钟周期,在第1个上升沿装载一个数据,第2个上升沿调用查找表乘法器完成2位数相乘,第3个上升沿输出第一个结果,因此从输入到输出延迟2个时钟周期。同时在第2个上升沿会装载第二个数据,第3个上升沿会调用查找表乘法器完成2位数相乘,第4个上升沿输出第二个结果。

移位乘法器计算一个结果需要4个周期,该乘法器只需要2个周期,总时间还是少的多。

四、加法树乘法器
  1. 加法树乘法器

    能在一个时钟周期即可完成乘法运算。
  2. 用Verilog实现8位加法树乘法器
module multi_add_tree(a,b,clk,out);
output [15:0] out;
input [7:0] a,b;
input clk;
wire [15:0] out;wire [15:0] out1,c1;
wire [13:0] out2;
wire [11:0] out3.c2;
wire [9:0] out4;reg [14:0] temp0;
reg [13:0] temp1;
reg [12:0] temp2;
reg [11:0] temp3;
reg [10:0] temp4;
reg [9:0] temp5;
reg [8:0] temp6;
reg [7:0] temp7;// 8*1乘法器function [7:0] mut8_1;
input [7:0] operand;
input sel;beginmut8_1 = sel ? operand : 8'b0000_0000;
end
endfunction //操作数b各位与操作数a相乘
always @(posedge clk)
begintemp7 = mut8_1(a,b[0]);temp6 = (mut8_1(a,b[1]))<<1;temp5 = (mut8_1(a,b[2]))<<2;temp4 = (mut8_1(a,b[3]))<<3;temp3 = (mut8_1(a,b[4]))<<4;temp2 = (mut8_1(a,b[5]))<<5;temp1 = (mut8_1(a,b[6]))<<6;temp0 = (mut8_1(a,b[7]))<<7;
end//加法树运算
assign out1 = temp0 + temp1;
assign out2 = temp2 + temp3;
assign out3 = temp4 + temp5;
assign out4 = temp6 + temp7;
assign c1 = out1 + out2;
assign c1 = out3 + out4;
assign out = c1 + c2;endmodule
五、四种乘法器比较

四种乘法器资源好用和运行速度的比较:

六、乘累加器

八位乘累加器的实现:即一个时钟实现一次乘法运算,然第二个时钟在实现一次乘法运算,最后将结果累加构成乘累加器。

module MAC(a, b, out, clk, clr);
output [15:0] out;
input [7:0] a, b;
input clk, clr;
wire [15:0] sum;
reg [15:0] out;function [15:0] mult;
input [7:0] a,b;
reg [15:0] result;
integer i;
beginresult = a[0]? b :0;for (i=1; i<= 7;i=i+1)beginresult = result + ((a[i] == 1)?  (b<<(i-1)): 0);  //移位相加endmult = result;
end
endfunctionassign sum = mult(a,b) + out;always@(posedge clk or posedge clr)
beginif(clr) out <= 0;else out <= sum;
endendmodule

数字电路基础知识——组合逻辑电路之乘法器的设计(一)—— 并行、移位相加、加法树、查找表乘法器相关推荐

  1. 数字电路基础知识——组合逻辑电路(奇偶校验电路、数据比较器的设计)

    数字电路基础知识--组合逻辑电路(奇偶校验器.比较器的Verilog设计) 本次主要介绍组合逻辑电路中的奇偶校验电路以及比较器的设计,以及相干的实例来熟悉这两种电路. 一.奇偶校验电路 奇偶校验码 奇 ...

  2. 数字电路基础知识——组合逻辑电路实现一些简单逻辑电路 (一)(用Verilog实现:绝对值函数运算(补码问题),取对数函数(移位寄存器),取整函数)

    数字电路基础知识--组合逻辑电路实现一些简单逻辑电路 (一)(用Verilog实现:绝对值函数运算(补码问题),取对数函数(移位寄存器),取整函数) 在数字逻辑设计中,本节介绍绝对值运算函数如何用Ve ...

  3. 数字电路基础知识—— 组合逻辑电路中的竞争与冒险(竞争与冒险、检验方法、及消除方法)

    在数字逻辑设计中,并不是说最简的逻辑表达式在设计组合逻辑时一定是最优的,可能就会出现本次介绍的竞争与冒险问题,所以需要了解竞争与冒险的检验以及竞争与冒险的避免消除方法. 一.竞争与冒险现象及其形成原因 ...

  4. 数字电路基础知识——乘法器的设计(二)( 串行、流水线、有符号数八位乘法器)

    数字电路基础知识--乘法器的设计(二)( 串行.流水线.有符号数八位乘法器) 前面一节关于乘法器的具体实现方式有很多种方法,均有各自的优缺点. 本节将再介绍一下两种乘法器的设计,分别用Verilog语 ...

  5. 数字电路基础知识——格雷码和二进制码的转换的算法和Verilog实现

    数字电路基础知识--格雷码和二进制码的转换的算法和Verilog实现 关于数字电路中的码制问题在这篇博客中已经做了详细分析, 数字电路基础知识--数字IC中的进制问题(原码,反码,补码以及各进制的转换 ...

  6. 数字电路基础知识|时钟和时序

    时钟的概念 时钟对数字电路而言非常重要,没有时钟数字电路就没法工作,其全称是时钟频率,一般由晶振来提供时钟频率. 在数字电路中,所有数据.逻辑单元等状态的更新都是以时钟为基础的,时钟频率在数字电路中起 ...

  7. 数字电路实验一 组合逻辑电路的设计预实验报告

    数字电路实验一 组合逻辑电路的设计 ---用与非门74LS00,74LS20设计制作一个三人表决电路 (验证性实验) 预习要求: 1.查资料画出74ls00和74ls20芯片引脚图排列图,画出逻辑符号 ...

  8. 【数电】(组合逻辑电路)组合逻辑电路的分析和设计方法

    [数电专栏] 文章目录 1 组合逻辑电路的分析和设计方法 1.1 组合逻辑电路的特点及描述 1.2 组合逻辑电路的分析(电路>>功能) 1.3 组合逻辑电路的门级电路设计(功能>&g ...

  9. IC验证必备的数字电路基础知识(二):组合逻辑电路

    参考教材:数字电路与逻辑设计(第2版)邬春明 目录 1. 组合逻辑电路分析 2. 组合逻辑电路设计( 重点,设计视角,以练题为主) 3. 竞争冒险 4. 组合逻辑电路 4.1. 编码器 4.2. 译码 ...

最新文章

  1. 因缺失log4j.properties 配置文件导致flume无法正常启动。
  2. 无法为新的Android ActionBar支持找到Theme.AppCompat.Light
  3. mysql distinct 慢_MySQL 5.5“select distinct”真的很慢
  4. 容器生态系统 (续) - 每天5分钟玩转容器技术(3)
  5. http和https的区别和联系
  6. linux mount挂载大小,Linux中mount挂载问题小结
  7. Ubuntu源码安装Nginx
  8. Web前端开发神器-WebStorm
  9. 未来科技计算机作文600字,未来科技作文600字
  10. KeyError: 'labels [189] not contained in axis' Python DataFrame 合并后使用loc进行索引的时候出错问题分析以及解决方案
  11. vue中当图片地址无效的时候,显示默认图片
  12. Survey of Aspect-based Sentiment Analysis Datasets
  13. 算法设计——基姆拉尔森计算公式:计算几月几号是星期几
  14. Java实现咖啡馆选餐系统
  15. ava.io.IOException: Downloaded file /var/lib/jenkins/plugins/credentials.jpi.tmp does not match expe
  16. opencl学习(四)
  17. CedarX中代码技术的应用借鉴 (二)多态的方式创建格式解析器
  18. 2023美赛思路 | 2023美赛C题Matlab代码
  19. 百度指数和Google趋势对比
  20. Ubuntu下利用Opencv进行点阵汉字的字模读取与显示

热门文章

  1. 直接继承CompoundButton接收不到ACTION_UP的原因
  2. php文本编辑器fck,HTML文本编辑器:FCKeditor 2.6.3下载
  3. 树莓派/linux/Ubuntu取消鼠标指针光标,类似于平板模式。实测有效。
  4. 水滴递交IPO申请:拟纽交所上市,募资1亿美元
  5. Linuxwindows时间服务器搭建定时同步设置详细讲解
  6. OFFICE365 开启开发工具选项
  7. 计算机作文我的职业理想300字,我理想的职业小学生作文范文(精选3篇)
  8. airtest连接不上手机,如何处理
  9. css3 keyframes zoom,CSS3 @keyframes 规则 | w3cschool菜鸟教程
  10. “军工四证”申报指南,最新解读来啦!