首页->【亚军:Vivado入门与提高】

969 9

高老师,您好:

         请教一个加法树的问题!最近在做直接型结构FIR滤波器,里面有乘加操作,如果pn表示系数与输入相乘结果,如果有11个抽头,输出应该是y=p0+p1+p2+p3+p4+p5+p6+p7+p8+p9+p10,在Verilog代码中直接这样实现加法,在ISE中综合,XST会直接优化成加法树结构吗?

         谢谢!

 

8808453715076.rar

楼主可见

  1. meic266 9#

    请问高老师,在你的书:FPGA的数字信号处理中,你提到:如果输入相加的个数很多的情况下,使用加法树,会导致末级的加法树会消耗很大的功耗。请问这句话怎么理解?如何会消耗很大的功耗呢?谢谢!

  2. Hoki 8#
    回复:laurengao

    补充一下:如果不用DSP48E1中的乘法器,在SysGen中如上述操作,如果是用Primitive的方式,Attribute“USE_MULT”设置为NONE即可。

    感谢高老师的指导!

  3. laurengao 7#

    补充一下:如果不用DSP48E1中的乘法器,在SysGen中如上述操作,如果是用Primitive的方式,Attribute“USE_MULT”设置为NONE即可。

  4. laurengao 6#

    DSP48E1支持级联,你可以看看它的架构,不难发现,它更胜任于加法链结构,有专门的级联端口PCIN/PCOUT。当然,用它构造加法树也是没问题的。此时,你可以把其中的乘法器关闭以降低功耗(选中Do not use multiplier)。两个加数的端口分别来自于A:B和C,其中A:B表示A、B端口数据位拼接构成新数据(48-bit)。在用作加法时,DSP48E1中的ALU可实现4个12-bit加法器或两个24-bit加法器。更多内容可参考ug369.

  5. Hoki 5#
    回复:laurengao

    这么写是没问题的。综合后你看看RTL View和Technologh View,就可以看到是不是加法树了,进而分析它的logic level和logic delay,也就能评估初两者的性能了。

    高老师,这几天我琢磨了一下,如果在乘法器和加法器之间不寄存数据的话,乘法器后接的加法器就会用DSP48E1的累加器实现,但是采用DSP48E1实现后综合得到结果加法器始终是级联形式了;如果我将乘法器和加法器之间加一级流水线的话,后面的加法器综合后是用逻辑实现的,而且能够综合得到加法树结构。

    这边就有疑问了,难道用DSP48E1就搭不出加法树结构吗?

  6. Hoki 4#
    回复:laurengao

    这么写是没问题的。综合后你看看RTL View和Technologh View,就可以看到是不是加法树了,进而分析它的logic level和logic delay,也就能评估初两者的性能了。

     Maximum Data Path at Slow Process Corner: Mmult_n0563[27:0] to Maddsub_n0573[27:0]

        Location             Delay type         Delay(ns)  Physical Resource                                                        Logical Resource(s)     -------------------------------------------------  -------------------     DSP48_X0Y129.PCOUT0  Tdspcko_PCOUT_AREG_MULT  3.001   Mmult_n0563[27:0]                                                        Mmult_n0563[27:0]     DSP48_X0Y130.PCIN0   net (fanout=1)        0.050   Mmult_n0563[27:0]_PCOUT_to_Maddsub_n0564[26:0]_PCIN_0     DSP48_X0Y130.PCOUT9  Tdspdo_PCIN_PCOUT     1.219   Maddsub_n0564[26:0]                                                        Maddsub_n0564[26:0]     DSP48_X0Y131.PCIN9   net (fanout=1)        0.000   Maddsub_n0564[26:0]_PCOUT_to_Maddsub_n0565[27:0]_PCIN_9     DSP48_X0Y131.PCOUT9  Tdspdo_PCIN_PCOUT     1.219   Maddsub_n0565[27:0]                                                        Maddsub_n0565[27:0]     DSP48_X0Y132.PCIN9   net (fanout=1)        0.000   Maddsub_n0565[27:0]_PCOUT_to_Maddsub_n0566[29:0]_PCIN_9     DSP48_X0Y132.PCOUT9  Tdspdo_PCIN_PCOUT     1.219   Maddsub_n0566[29:0]                                                        Maddsub_n0566[29:0]     DSP48_X0Y133.PCIN9   net (fanout=1)        0.000   Maddsub_n0566[29:0]_PCOUT_to_Maddsub_n0567[29:0]_PCIN_9     DSP48_X0Y133.PCOUT9  Tdspdo_PCIN_PCOUT     1.219   Maddsub_n0567[29:0]                                                        Maddsub_n0567[29:0]     DSP48_X0Y134.PCIN9   net (fanout=1)        0.000   Maddsub_n0567[29:0]_PCOUT_to_Maddsub_n0568[30:0]_PCIN_9     DSP48_X0Y134.PCOUT9  Tdspdo_PCIN_PCOUT     1.219   Maddsub_n0568[30:0]                                                        Maddsub_n0568[30:0]     DSP48_X0Y135.PCIN9   net (fanout=1)        0.000   Maddsub_n0568[30:0]_PCOUT_to_Maddsub_n0569[29:0]_PCIN_9     DSP48_X0Y135.PCOUT9  Tdspdo_PCIN_PCOUT     1.219   Maddsub_n0569[29:0]                                                        Maddsub_n0569[29:0]     DSP48_X0Y136.PCIN9   net (fanout=1)        0.000   Maddsub_n0569[29:0]_PCOUT_to_Maddsub_n0570[29:0]_PCIN_9     DSP48_X0Y136.PCOUT9  Tdspdo_PCIN_PCOUT     1.219   Maddsub_n0570[29:0]                                                        Maddsub_n0570[29:0]     DSP48_X0Y137.PCIN9   net (fanout=1)        0.000   Maddsub_n0570[29:0]_PCOUT_to_Maddsub_n0571[27:0]_PCIN_9     DSP48_X0Y137.PCOUT9  Tdspdo_PCIN_PCOUT     1.219   Maddsub_n0571[27:0]                                                        Maddsub_n0571[27:0]     DSP48_X0Y138.PCIN9   net (fanout=1)        0.000   Maddsub_n0571[27:0]_PCOUT_to_Maddsub_n0572[26:0]_PCIN_9     DSP48_X0Y138.PCOUT0  Tdspdo_PCIN_PCOUT     1.219   Maddsub_n0572[26:0]                                                        Maddsub_n0572[26:0]     DSP48_X0Y139.PCIN0   net (fanout=1)        0.000   Maddsub_n0572[26:0]_PCOUT_to_Maddsub_n0573[27:0]_PCIN_0     DSP48_X0Y139.CLK     Tdspdck_PCIN_PREG     0.995   Maddsub_n0573[27:0]                                                        Maddsub_n0573[27:0]     -------------------------------------------------  ---------------------------     Total                                     15.017ns (14.967ns logic, 0.050ns route)                                                        (99.7% logic, 0.3% route) 代码按照加法树的结构写了,可是综合出来关键路径还是乘法加上11级的加法,高老师能看看是什么问题吗?代码在上面帖子上已经上传了,谢谢!
  7. laurengao 3#

    这么写是没问题的。综合后你看看RTL View和Technologh View,就可以看到是不是加法树了,进而分析它的logic level和logic delay,也就能评估初两者的性能了。

  8. Hoki 2#
    回复:laurengao

    这么写是不会综合成加法树的。加法树的结构还是需要自己去搭建出来,这里不能完全依靠开发工具。而且你这么写,没有pipeline,导致logic level很大,进而导致logic delay会很大,最终会影响timing。

    感谢回复,现在还不想pipeline,就想验证一下加入加法树后的时序,那加法树应该怎么搭呢?

    我自己试了一下:

    assign y0=p0 + p1;

    assign y1=p2 + p3;

    assign y2=p4 + p5;

    assign y3=p6 + p7;

    assign y4=p8 + p9;

    assign y5=p10;

    assign y0_1=y0 + y1;

    assign y1_1=y2 + y3;

    assign y2_1=y4 + y5;


    然后y=y0_1+y1_1+y2_1打拍输出,这样综合出来fmax只有60多M,原来直接加起来写也能到70多M,是不是我的加法树理解有问题啊?

  9. laurengao 1#

    这么写是不会综合成加法树的。加法树的结构还是需要自己去搭建出来,这里不能完全依靠开发工具。而且你这么写,没有pipeline,导致logic level很大,进而导致logic delay会很大,最终会影响timing。