|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 warming89 于 2014-9-22 19:56 编辑
为了节省DSP slice资源,将两个乘法合到一个乘法器中进行运算,代码如下:
module Mix_i_q(
input clk,
input [3:0] signal_if,
input [4:0] sin,
input [4:0] cos,
output [7:0] mix_idata,
output [7:0] mix_qdata
);
wire [14:0] mult_a;
wire [14:0] mult_b;
wire [29:0] mult_p;
assign mult_a={{{signal_if[3],signal_if}+{5{cos[4]}}},{5{cos[4]}},cos};
assign mult_b={{sin+{5{signal_if[3]}}},{6{signal_if[3]}},signal_if};
assign mix_idata=mult_p[27:20];
assign mix_qdata=mult_p[7:0];
mult_15_x_15 u0
(
.clk (clk),
.a (mult_a),
.b (mult_b),
.p (mult_p)
);
endmodule
原理很简单,在这里就相当于是:
(a*2^10+b)乘以(c*2^10+d),取低位的bd值和20位以上的ac值,感觉是没有任何问题的,但是实际仿真时发现,如果a、b、c、d都是正数时,运算结果正确,但是有一个乘数为负数(补码形式),运算结果中高位结果少1,即结果为ac-1。
如图所示,求论坛大神破我疑团。 |
|