复数乘法器研究
【摘要】 复数乘法器研究
在wallace乘法器的基础上设计一个复数乘法器(有关wallace树乘法器的内容,
看我的相关博客,这里只是调用了Wallace树乘法器的verilog HDL代码),
复数的乘法算法是:
设复数x = a + b i, y = c + d i, 则复数相乘的结果为:x * y = (a + b i)*(c + d i) = (ac - bd) + ...
复数乘法器研究
在wallace乘法器的基础上设计一个复数乘法器(有关wallace树乘法器的内容,
看我的相关博客,这里只是调用了Wallace树乘法器的verilog HDL代码),
复数的乘法算法是:
设复数x = a + b i, y = c + d i, 则复数相乘的结果为:x * y = (a + b i)*(c + d i) = (ac - bd) + i (ad + bc) 。
十分简单,只需要把部分积算出来然后就是加减运算了。
其verilog HDL代码如下:
-
//复数乘法器的verilog HDL代码
-
-
-
-
module complex(a, b, c, d, out_real, out_im);
-
-
input [3:0] a, b, c, d;
-
-
output [8:0] out_real,out_im;
-
-
wire [7:0] sub1, sub2, add1, add2;
-
-
-
-
wallace U1(.x(a), .y(c), .out(sub1));
-
-
wallace U2(.x(b), .y(d), .out(sub2));
-
-
wallace U3(.x(a), .y(d), .out(add1));
-
-
wallace U4(.x(b), .y(c), .out(add2));
-
-
-
-
assign out_real = sub1 - sub2;
-
-
assign out_im = add1 + add2;
-
-
-
-
endmodule
-
-
-
-
//下面是wallace树乘法器模块
-
-
module wallace(x,y,out);
-
-
parameter size = 4; //定义参数,乘法器的位数
-
-
input [size - 1 : 0] x,y; //输入y是乘数,x是被乘数
-
-
output [2*size - 1 : 0] out;
-
-
wire [size*size - 1 : 0] a; //a为部分积
-
-
wire [1 : 0] b0, b1; //第一级的输出,包含进位
-
-
wire [1 : 0] c0, c1, c2, c3; //第二级的输出,包含进位
-
-
wire [5 : 0] add_a, add_b; //第三极的输入
-
-
wire [6 : 0] add_out; //第三极的输出
-
-
wire [2*size - 1 : 0] out; //乘法器的输出(组合逻辑)
-
-
-
-
assign a = {x[3],x[2],x[3],x[1],x[2],x[3],x[0],x[1],
-
-
x[2],x[3],x[0],x[1],x[2],x[0],x[1],x[0]}
-
-
&{y[3],y[3],y[2],y[3],y[2],y[1],y[3],y[2]
-
-
,y[1],y[0],y[2],y[1],y[0],y[1],y[0],y[0]}; //部分积
-
-
hadd U1(.x(a[8]), .y(a[9]), .out(b0)); //2输入半加器(第一级)
-
-
hadd U2(.x(a[11]), .y(a[12]), .out(b1));//第一级
-
-
hadd U3(.x(a[4]), .y(a[5]), .out(c0)); //第二级
-
-
-
-
fadd U4(.x(a[6]), .y(a[7]), .z(b0[0]), .out(c1)); //3输入全加器(第二级)
-
-
fadd U5(.x(b1[0]), .y(a[10]), .z(b0[1]), .out(c2));
-
-
fadd U6(.x(a[13]), .y(a[14]), .z(b1[1]), .out(c3));
-
-
-
-
-
-
assign add_a = {c3[1],c2[1],c1[1],c0[1],c0[0],a[2]}; //加法器(第三极)
-
-
assign add_b = {a[15],c3[0],c2[0],c1[0],a[3],a[1]};
-
-
assign add_out = add_a + add_b;
-
-
assign out = {add_out,a[0]};
-
-
-
-
endmodule
-
-
-
-
//全加器模块
-
-
module fadd(x, y, z, out);
-
-
input x, y, z;
-
-
output [1 : 0] out;
-
-
assign out = x + y + z;
-
-
endmodule
-
-
-
-
//半加器模块
-
-
module hadd(x, y, out);
-
-
input x, y;
-
-
output [1 : 0] out;
-
-
assign out = x + y;
-
-
endmodule
测试文件代码如下:
-
//复数乘法器测试文件
-
-
-
-
`timescale 1ns/1ps
-
-
module complex_tb;
-
-
reg [3:0] a, b, c, d;
-
-
wire [8:0] out_real;
-
-
wire [8:0] out_im;
-
-
complex U1(.a(a), .b(b), .c(c), .d(d), .out_real(out_real),
-
-
.out_im(out_im));
-
-
-
-
initial
-
-
begin
-
-
a = 2; b = 2; c = 5; d = 4;
-
-
#10
-
-
a = 4; b = 3; c = 2; d = 1;
-
-
#10
-
-
a = 3; b = 2; c = 3; d = 4;
-
-
end
-
-
-
-
endmodule
ModelSim中仿真波形截图如下:
文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。
原文链接:reborn.blog.csdn.net/article/details/80316028
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)