在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2621|回复: 8

[求助] 大家好,推荐一段乘法合并的写法,但是有问题,求助!

[复制链接]
发表于 2014-9-22 19:51:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

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。
无标题.png



如图所示,求论坛大神破我疑团。
 楼主| 发表于 2014-9-23 08:49:37 | 显示全部楼层
有没有论坛大神前来相助啊?
发表于 2014-9-23 10:49:12 | 显示全部楼层
建议把乘法器扩展到16位,同时对输入做一位的符号扩展
发表于 2014-9-23 15:50:21 | 显示全部楼层
楼上正解!!!!
 楼主| 发表于 2014-9-23 16:39:25 | 显示全部楼层
回复 3# jxk304

      不行啊,我试过了,还是小1。请问这种改法的依据是什么呢?或者说我错在哪了?
 楼主| 发表于 2014-9-23 16:41:20 | 显示全部楼层
回复 4# caojun121123

      请问这个依据是什么?我改了之后还是不对啊,而且我感觉位宽足够啊!
 楼主| 发表于 2014-9-25 10:55:53 | 显示全部楼层
强顶不要沉,继续求助!
发表于 2014-9-28 17:24:35 | 显示全部楼层
我觉得LZ应该设计的复杂了。应该还有很简单易行的方案
发表于 2014-9-28 18:48:08 | 显示全部楼层
你期望的等式是:(a*2^10+b)*(c*2^10+d) 》20 = a*c
当结果为负数 ,等式取反加一后的右移结果,和等式直接右移后再取反加一的结果是有差别的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-20 00:21 , Processed in 0.025226 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表