1.传统的乘法器 两个数相乘,无论是同号相乘还是异号相乘,其实最后结果的数值与符号无关,只取两个数的绝对值相乘,最后结果的符号为被乘数与乘数的符号异或即可。
然后乘法可以看成累加操作,累加次数为乘数的数值大小,累加值为被乘数。每累加一次,乘数减一,直到乘数减到0,则相乘结束。
该乘法器的大致操作如下:
(一)在初始化之际,取乘数和被乘数的正负关系,然后取被乘数和乘数的正值。
(二)每一次累加操作,递减一次乘数。直到乘数的值为零,表示操作结束。
(三)输出结果根据正负关系取得。
实现代码如下:
module multiplier_module
(
input CLK,
input RSTn, input Start_Sig,
input [7:0]Multiplicand,
input [7:0]Multiplier,output Done_Sig,
output [15:0]Product
);
/*************************/reg [1:0]i;
reg [7:0]Mcand;
reg [7:0]Mer;
reg [15:0]Temp;
reg isNeg;
reg isDone;
always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
i <= 2'd0;
Mcand <= 8'd0;
// Register for Multiplicand
Mer <= 8'd0;
// Register ofr Multipier
Temp <= 8'd0;
// Sum of pratocal product
isNeg <= 1'b0;
isDone <= 1'b0;
end
else if( Start_Sig )
case( i )
0:
begin
isNeg <= Multiplicand[7] ^ Multiplier[7];
Mcand <= Multiplicand[7] ? ( ~Multiplicand + 1'b1 ) : Multiplicand;
Mer <= Multiplier[7] ? ( ~Multiplier + 1'b1 ) : Multiplier;
Temp <= 16'd0;
i <= i + 1'b1;
end 1: // Multipling
if( Mer == 0 ) i <= i + 1'b1;
else begin Temp <= Temp + Mcand;
Mer <= Mer - 1'b1;
end 2:
begin isDone <= 1'b1;
i <= i + 1'b1;
end 3:
begin isDone <= 1'b0;
i <= 2'd0;
endendcase/*************************/assign Done_Sig = isDone;
assign Product = isNeg ? ( ~Temp + 1'b1 ) : Temp;
/*************************/
endmodule
但是这种方法的缺点也是显而易见的,当乘数很大时(绝对值很大时),需要累加的次数也随之增大
booth乘法器 这篇文章写的挺好的booth乘法器
但这篇并没有说到booth算法的原理
下面这篇文章说到了
booth算法原理
当相乘乘数中有连续个1时,可以减少部分积的数量
文章图片
基于查找表的乘法器 【数字ic|乘法器verilog】就是提前吧结果存在存储器中,乘法的结果以查表的方式取得。是典型的用空间换时间的方法。
推荐阅读
- FPGA|基于FPGA的VGA协议实现
- FPGA|基于FPGA的ds18b20温度传感器使用
- 硬件经验|Lightning 转 USB Type-A/Type-C 思路
- fpga开发|TDC进位链
- HDLBITS学习笔记|HDLBITS笔记37(testbench错误检测集合1)
- DDR3|FPGA-DDR总线电源硬件设计技巧-Fly-by走线阻抗
- RISC-V|带你一起看代码(11.RISC-V外设解析(UART)——终篇)
- 数字IC设计|十一、RISC-V SoC外设注解——UART接口 时序设计 代码讲解(终篇)
- 数字IC/FPGA设计|Moore型状态机和Mealy型状态机的区别以及各自Verilog的实现细节(为什么Moore型状态机需要多一个状态(怎么选择用哪一种状态机?))