1. 串行乘法器
两个N位二进制数x、y的乘积用简单的方法计算就是利用移位操作来实现。
对应的HDL代码为:
module multi_CX(clk, x, y, result);
input clk;
input [7:0] x, y;
output [15:0] result;
reg [15:0] result;
parameter s0 = 0, s1 = 1, s2 = 2;
reg [2:0] count = 0;
reg [1:0] state = 0;
reg [15:0] P, T;
reg [7:0] y_reg;
always @(posedge clk) begin
case (state)
s0: begin
count <= 0;
P <= 0;
y_reg <= y;
T <= {{8{1'b0}}, x};
state <= s1;
end
s1: begin
if(count == 3'b111)
state <= s2;
else begin
if(y_reg[0] == 1'b1)
P <= P + T;
else
P <= P;
y_reg <= y_reg >> 1;
T <= T << 1;
count <= count + 1;
state <= s1;
end
end
s2: begin
result <= P;
state <= s0;
end
default: ;
endcase
end
endmodule
对应的功能仿真图为:
乘法功能是正确的,但计算一次乘法需要8个周期。因此可以看出串行乘法器速度比较慢、时延大,但这种乘法器的优点是所占用的资源是所有类型乘法器中最少的,在低速的信号处理中有着广泛的应用。
疑问:功能仿真图显示延迟不止8个时钟周期,不知道是为什么?。。。
2.流水线乘法器
一般的快速乘法器通常采用逐位并行的迭代阵列结构,将每个操作数的N位都并行地提交给乘法器。但是一般对于FPGA来讲,进位的速度快于加法的速度,这种阵列结构并不是最优的。所以可以采用多级流水线的形式,将相邻的两个部分乘积结果再加到最终的输出乘积上,即排成一个二叉树形式的结构,这样对于N位乘法器需要lb(N)级来实现。
下面是用Verilog HDL实现一个4位的流水线乘法器:
module multi_4bits_pipelining(mul_a, mul_b, clk, rst_n, mul_out);
input [3:0] mul_a, mul_b;
input clk;
input rst_n;
output [7:0] mul_out;
reg [7:0] mul_out;
reg [7:0] stored0;
reg [7:0] stored1;
reg [7:0] stored2;
reg [7:0] stored3;
reg [7:0] add01;
reg [7:0] add23;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
mul_out <= 0;
stored0 <= 0;
stored1 <= 0;
stored2 <= 0;
stored3 <= 0;
add01 <= 0;
add23 <= 0;
end
else begin
stored0 <= mul_b[0]? {4'b0, mul_a} : 8'b0;
stored1 <= mul_b[1]? {3'b0, mul_a, 1'b0} : 8'b0;
stored2 <= mul_b[2]? {2'b0, mul_a, 2'b0} : 8'b0;
stored3 <= mul_b[3]? {1'b0, mul_a, 3'b0} : 8'b0;
add01 <= stored1 + stored0;
add23 <= stored3 + stored2;
mul_out <= add01 + add23;
end
end
endmodule
功能仿真图为:
从图中可以看出,流水线乘法器比串行乘法器的速度快很多很多,在非高速的信号处理中有广泛的应用。至于高速信号的乘法一般需要利用FPGA芯片中内嵌的硬核DSP单元来实现。
- 大小: 6 KB
- 大小: 5.9 KB
分享到:
相关推荐
16位乘法器VerilogHDL源代码,适合于初学者
fpga 8位乘法器 verilog HDL 源代码;带有tstbench文件
基于booth算法的乘法器的verilog HDL实现。
booth乘法器verilog HDL代码,希望和我一样的初学借鉴,更希望高手指点一下
Based on verilog HDL language 4-bit binary multiplier design, its function is fast and reliable to achieve binary multiplication operation.
移位相加法乘法器设计原理是从被乘数的最低位开始判断,若为1,则乘数左移i(i=0,1...(WIDTH-1))位后,与上一次和相加;若为0,则乘数左移i位后,以0相加,直至被乘数的最高位。
计算机加、减、乘、除及开方的各种算法(包括Wallace Tree快速乘法器和Newton-Raphson及Goldschmidt除法和开方算法)及其VerilogHDL实现;指令系统结构和ALU及多端口寄存器堆的 Verilog HDL 设计;单周期、多周期和...
复数乘法器本身十分很简单,这里复数乘法器的乘积项的计算调用了wallace树乘法器,故本乘法器的verilog HDL代码中包括了wallace树乘法器模块。仔细内容请浏览我的博客。
用Verilog实现阵列乘法器,采用的是流水线的做法
本压缩文件包括向量乘法器以及其测试文件,向量乘法器本身原理简单,但其乘积项运用到了Wallace树乘法器,所以本代码是在Wallace树乘法器的基础上的向量乘法器。
多级流水线结构,是一种并行的方式,将相邻的两个部分的结果再加到最终的输出乘积上,即排列成一个二叉树形式的结构。
舍入过程中可以使用直接choping和就近舍入,考虑可就近舍入过程中引起尾码加一导致阶码增加的情况。已通过Quartus_ii\Modelsim的联合仿真。
在乘法器的设计中采用树形乘法器,可以减少关键路径和所需的加法器单元数目,Wallace树乘法器就是其中的一种。下面以一个4*4位乘法器为例介绍Wallace树乘法器及其Verilog HDL实现。
本压缩文件包括复数乘法器以及其测试文件,复数乘法器本身原理简单,但其乘积项运用到了Wallace树乘法器,所以本代码是在Wallace树乘法器的基础上的复数乘法器。
查找表乘法器就是将乘积放在存储器中,将操作数作为地址访问存储器,得到的输出结果就是乘法器的运算结果。这种乘法器的运算速度就等于所使用的存储器的速度,一般用于较小规模的乘法器。
1.用VerilogHDL设计实现64bit二进制整数乘法器,底层乘法器使用16*16\8*8\8*32\8*16小位宽乘法器来实现,底层乘法器可以使用FPGA内部IP实现; 2.基于modelsim仿真软件对电路进行功能验证; 3.基于Quartus平台对代码...
从做实验遇到Wallace树乘法器开始,对乘法器的理解受到了阻碍,于是接下来的一个星期,专门研究汇总乘法器的verilog HDL设计,最终算是大概完成。这里给出了7种乘法器的设计。希望遇到问题而无助的你能够找到方向。
利用verilog语言实现了逐次进位乘法器,延时达到3.549ns,资源使用了24个LUT
Verilog_HDL的故事_之_整数除法器 之后还会为大家上传其他部分 感觉本资源在描述编程思想方面上挺不错的。
基于verilog HDL的恒定系数乘法器的设计 一个不错的设计方案