原创 Quartus综合有符号数乘加运算的一个问题

2012-12-7 10:57 5060 21 22 分类: FPGA/CPLD

 

昨晚项目调试的时候遇到一个问题:

 

输入IQ交织、有符号的复信号,时序是:

iq_data           I Q I Q I Q I Q

iq_data_fsync 1 0 1 0 1 0 1 0

模块的功能是实现复信号的功率计算 Power =I*I + Q*Q

 

出现问题的语句是:

iq_power_out_error <= $signed(iq_data) * $signed(iq_data) + i_power_unsigned;

如果i_power_unsigned定义的是无符号的(reg [31:0] i_power_unsigned;),那么Quartus综合的时候会把前面的$signed(iq_data) * $signed(iq_data)中的iq_data数据当成无符号的来综合,

Synplify综合的结果跟Quartus一样,而用Xilinx-ISE综合就不会出现这样的问题。

i_power_unsigned定义成有符号(reg signed [31:0] i_power;)的时候,都能得到正确的结果。

 

下面是验证程序(本文最后)Quartus综合的RTL和ISE综合的RTL对比:Quartus综合的RTL用了两个乘法器,一个是有符号相乘一个是无符号相乘,而ISE综合的RTL只有一个有符号乘法器。

 

Quartus-RTL

20121206163035131001.gif
 

ISE-RTL

20121206163329520001.gif

 

验证程序如下:

module    iq_power_cal

       (

       /////////////时钟和复位 /////////////////

       input                            clk_61_44m                  ,       

     

       /////////////IQ输入//////////////////////    

       input                            iq_data_fsync                ,     

       input              [15:0]      iq_data                         ,  

   

       /////////////信号输出////////////////////  

       output     reg   [31:0]      iq_power_out               ,

       output     reg   [31:0]      iq_power_out_error              //错误的计算输出 

       );

      

       /////////////参数定义////////////////////

      

       reg          signed     [31:0]      i_power   ;    //定义成有符号的能得到正确的结果

 

       always @(posedge clk_61_44m)  

       begin

              if(iq_data_fsync == 1'b0)

                     i_power <= $signed(iq_data) * $signed(iq_data);

              else;

       end

      

       always @(posedge clk_61_44m)  

       begin

              if(iq_data_fsync == 1'b1)

                     iq_power_out <= $signed(iq_data) * $signed(iq_data) + i_power;

              else;

       end        

      

       reg          [31:0]      i_power_unsigned  ;    //定义成无符号的,不能得到正确的结果,会导致计算

       //$signed(iq_data) * $signed(iq_data) + i_power_unsigned;的时候把iq_data当成无符号的来计算

 

    

       always @(posedge clk_61_44m)  

       begin

              if(iq_data_fsync == 1'b0)

                     i_power_unsigned <= $signed(iq_data) * $signed(iq_data);

              else;

       end

      

       always @(posedge clk_61_44m)  

       begin

              if(iq_data_fsync == 1'b1)

                     iq_power_out_error <= $signed(iq_data) * $signed(iq_data) + i_power_unsigned;

              else;

       end        

 

endmodule    


 

 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2013-1-15 20:48

不错!牛逼!
相关推荐阅读
用户1429847 2014-06-26 03:01
FPGA创新 FPGA合作
本人住杭州,自认为是个合格的FPGA工程师。 熟悉xilinx altera系列FPGA的开发流程。带领团队量产过5-6个以FPGA为核心的产品。 如果您有好的想法,或者掌握算法,需要FP...
用户1429847 2014-06-26 02:59
PC_CFR的FPGA实现
        CFR(Crest Factor Reduction),俗称削峰,就是降低信号峰均比的一种算法。现在业界比较流行的、易于实现的CFR算法是PC-CFR。PC-CFR的核心思想是:用...
用户1429847 2013-02-17 11:30
时序分析TimeQuest之多周期约束
时序分析TimeQuest之多周期约束.         网上有很多讲ALTERA时序约束(TimeQuest)的文章,其中关于多周期约束set_multicycle_path的,有一...
用户1429847 2013-01-07 13:11
Goertzel算法解析
不能有效编辑,贴图了 呵呵           ...
我要评论
1
21
关闭 站长推荐上一条 /3 下一条