FIR滤波器可能无法使用DSP模块输入寄存器-Altera-Intel社区-FPGA CPLD-ChipDebug

FIR滤波器可能无法使用DSP模块输入寄存器

FIR编译器II生成的一些FIR滤波器无法使用所有适当的DSP模块输入寄存器。 TimeQuest没有正确分析这些FIR滤波器,它们似乎符合时序。实际上,未分析未注册路径上的时序,并且这些FIR滤波器在硬件中实现时可能会导致与时序相关的错误。问题影响Stratix V,Arria V(GX和GZ)以及Cyclone V器件。该问题会影响FIR滤波器:使用收缩模式需要奇数个乘法器这个问题不会影响需要偶数个乘法器的FIR滤波器。甚至可以参考实现FIR滤波器的物理乘法器的数量,而不是抽头的数量你最初指定的。具有偶数抽头的FIR滤波器可能需要奇数个物理乘法器,反之亦然。要确定我的FIR滤波器是否受到影响,请执行以下步骤:检查生成的VHDL代码以确定它是否包含虚拟乘法器。收缩FIR滤波器包含许多CHAINMULTADD注释。如果FIR滤波器不包含任何类似于以下注释的注释,则FIR滤波器不是收缩FIR滤波器且不受影响: – u0_m0_wo0_cma0(CHAINMULTADD,33)@ 13

如果您的FIR包含一个或多个CHAINMULTADD注释,请检查每个此类注释后面的VHDL代码。在CHAINMULTADD注释之后的几行,找到类似于以下代码的chainmultadd进程:u0_m0_wo0_cma0_chainmultadd:PROCESS(clk,areset)BEGIN IF(areset =’1’)然后u0_m0_wo0_cma0_a <=(其他=>(其他=>’0’) )); u0_m0_wo0_cma0_b <=(其他=>(其他=>’0’)); u0_m0_wo0_cma0_c <=(其他=>(其他=>’0’)); u0_m0_wo0_cma0_anl <=’0′; u0_m0_wo0_cma0_s <=(其他=>(其他=>’0’)); ELSIF(clk’EVENT和clk =’1’)然后(d_u0_m0_wo0_compute_q_13_q =“1”)然后u0_m0_wo0_cma0_a(0)<=签名(调整(签名(u0_m0_wo0_wi0_delayr0_q),17)); u0_m0_wo0_cma0_a(1)<= SIGNED(RESIZE(SIGNED(u0_m0_wo0_wi0_split1_b),17)); u0_m0_wo0_cma0_a(2)<= SIGNED(RESIZE(SIGNED(u0_m0_wo0_wi0_split1_c),17)); u0_m0_wo0_cma0_a(3)<=(其他=>’0’); u0_m0_wo0_cma0_b(0)<= SIGNED(RESIZE(SIGNED(u0_m0_wo0_wi0_split4_c),17)); u0_m0_wo0_cma0_b(1)<= SIGNED(RESIZE(SIGNED(u0_m0_wo0_wi0_split4_b),17)); u0_m0_wo0_cma0_b(2)<= SIGNED(RESIZE(SIGNED(u0_m0_wo0_cma0_mux_2_q),17)); u0_m0_wo0_cma0_b(3)<=(其他=>’0’); u0_m0_wo0_cma0_c(0)<= UNSIGNED(RESIZE(UNSIGNED(u0_m0_wo0_ca2_q),3)); u0_m0_wo0_cma0_c(1)<= UNSIGNED(RESIZE(UNSIGNED(u0_m0_wo0_ca2_q),3)); u0_m0_wo0_cma0_c(2)<= UNSIGNED(RESIZE(UNSIGNED(u0_m0_wo0_ca2_q),3)); u0_m0_wo0_cma0_c(3)<=(其他=>’0’); u0_m0_wo0_cma0_anl <= not(u0_m0_wo0_aseq_q(0));万一; IF(d_u0_m0_wo0_compute_q_14_q =“1”)那么u0_m0_wo0_cma0_s(0)<= u0_m0_wo0_cma0_z(0)+ u0_m0_wo0_cma0_y(0); u0_m0_wo0_cma0_s(1)<= u0_m0_wo0_cma0_y(1); u0_m0_wo0_cma0_s(2)<= u0_m0_wo0_cma0_y(2); u0_m0_wo0_cma0_s(3)<= u0_m0_wo0_cma0_y(3);万一;万一; END PROCESS;以粗体显示的行将同一乘数的两个输入都设置为零,这是一个虚拟乘法器,并且您的FIR滤波器会受到影响。如果chainmultadd进程中没有一个包含虚拟乘法器,则FIR不受影响。

解决/修复方法

要解决此问题,请增加为FIR过滤器指定的长度。如果选择正确的长度,则实现不需要任何虚拟乘法器。或者,手动编辑FIR编译器II生成的VHDL,将Quartus II保留属性添加到DSP输入寄存器。 Quartus II综合不会删除虚拟乘法器输入寄存器,而Quartus II fitter正确地封装了所有DSP模块输入寄存器。要手动编辑VHDL,请执行以下步骤:查找输入寄存器的声明,类似于以下代码:type u0_m0_wo0_cma0_a_type是SIGNED的数组(0到3)(16 downto 0);信号u0_m0_wo0_cma0_a:u0_m0_wo0_cma0_a_type; type u0_m0_wo0_cma0_b_type是SIGNED(16 downto 0)的数组(0到3);信号u0_m0_wo0_cma0_b:u0_m0_wo0_cma0_b_type; type u0_m0_wo0_cma0_c_type是UNSIGNED(2 downto 0)的数组(0到3); signal u0_m0_wo0_cma0_c:u0_m0_wo0_cma0_c_type;如果FIR滤波器不使用DSP模块的预加载器,则不存在\’b \’信号。添加以下代码:attribute preserve:boolean;属性保留u0_m0_wo0_cma0_a:信号为真;属性保留u0_m0_wo0_cma0_b:信号为真;属性保留u0_m0_wo0_cma0_c:signal为true;只添加preserve属性应该只声明一次。

DSP Builder v13.1中修复了此问题。

请登录后发表评论

    没有回复内容