第4节 乘累加结构的FIR滤波器
推荐给好友
打印
加入收藏
更新于2008-05-28 10:50:49

信号处理工程师可以采用多种方法来实现滤波器,但常见的滤波器可以采用单乘法器MAC FIR滤波器实现。本节主要用DSP48 Slice来实现有限脉冲响应(FIR)滤波器,其中,主要说明两种串行滤波器架构:单乘法器MAC FIR滤波器和双乘法器MAC FIR滤波器。

6.4.1 单乘法器MAC FIR滤波器

器MAC FIR是最简单的DSP滤波器结构之一。与全并行滤波器相比,MAC结构采用单一乘法器和累加器来顺序实现FIR滤波器。该折衷设计不仅使硬件数量减少了 倍,也使滤波器吞吐量按照同样比例下降。通用的FIR滤波器公式是乘积(也称为内积)的总和,定义如下:

                                                                                              (6-4)

在该公式中, 个系数与 个相应的数据采样相乘,然后对内积求和来产生单个结果。这里的系数值确定了滤波器的特性(如:低通滤波器、带通滤波器、高通滤波器)。该公式可以采用不同架构、利用不同方法(如,串行、半并行或并行)来实现。在采样速度慢、系数多时,采用单一的MAC FIR滤波器来实现非常合适。利用高速时钟来驱动乘加器,实现对低速数据的多倍计算,其结构如图7-15所示。

 



图6-15 乘法器MAC FIR滤波器

下面给出一个MAC FIR乘法器的实例。

例7-2 使用DSP48 Slice并基于单乘法器结构,完成一个4阶8比特的FIR乘法器,数据速率为1Mbps,其系数为[8'd87、8'd127、8'd157、8'd137]。

为了通过DSP48 Slice完成单乘法器结构,其工作频率应为数据速率的4倍,此外,滤波计算所需的输入数据缓存在分布式RAM中。

module mac_fir_tap4(clk_4MHz, reset, ce, din, dout);

input clk_4MHz;
input reset;
input ce;
input [7:0] din;
output [17:0] dout;

reg [17:0] dout;
wire [17:0] dout1;
wire [7:0] dtemp;
reg [1:0] cnt = 0;
reg we = 0;
reg [3:0] spra = 0;

reg [7:0] A_IN = 0;
reg [7:0] B_IN = 0;
reg LOAD_IN = 0;

       // 控制数据缓冲期
      always @(posedge clk_4MHz) begin 
               if(reset) begin
                       cnt <= 0;
                        we <= 0;
                        LOAD_IN <= 0;
                        dout <= 0; 
               end 
               else begin 
                  spra <= {1'b0, cnt}+ 3'b001;
                  cnt <= cnt + 1;
                  if(cnt == 2'b11) begin
                             we <= 1;
                             LOAD_IN <= 0; 
                  end
                  else begin
                            we <= 0; 
                            LOAD_IN <= 1;
                  end 
                  if(cnt == 2'b01)
                             dout <= dout1;
                  else 
                             dout <= dout; 
               end 
      end

     // 完成滤波器乘加计算 
     always @(posedge clk_4MHz) begin
          A_IN <= dtemp;
          case(cnt)
                     2'b10: B_IN <= 8'd87;
                     2'b11: B_IN <= 8'd127;
                     2'b00: B_IN <= 8'd157; 
                     2'b01: B_IN <= 8'd137;
          endcase 
    end

    //

fir_dram fir_dram(
.CLK(clk_4MHz),
.D(din),
.WE(we),
.QSPO_CE(ce),
.SPRA(spra),
.QSPO(dtemp)
);

    //

fir_mac fir_mac (
.A_IN(A_IN),
.B_IN(B_IN),
.CE_IN(ce),
.CLK_IN(clk_4MHz),
.LOAD_IN(LOAD_IN),
.RST_IN(reset),
.P_OUT(dout1)
);

endmodule

上述程序经过Synplify Pro综合后,其RTL级结构如图7-16所示,其中只使用了一个硬核乘加器完成滤波计算,数据缓冲以及移位利用Xilinx公司的SRL16LUT结构来实现,这种实现方法可节省很多硬件资源。



图6-16 MAC结构FIR滤波器的RTL结构图

在ModelSim 6.2b中完成仿真,其结果如图7-17所示。模块处理时钟是输入数据的4倍,例如当输入为14、13、12和11时,分别和系数相乘,再将结果累加,经过8个时钟周期后,输出滤波输出372。



图6-17 MAC结构FIR滤波器的仿真结果示意图

6.4.2 对称MAC FIR滤波器

上节的单乘法MAC FIR滤波器,滤波器的实现也可以采用其他方法进行。本节说明根据FIR滤波器系数的对称性如何设计滤波器,可在同样硬件资源的前提下使采样率性能翻倍(假定具有相同的工作时钟)。通过重新整理FIR滤波器公式,系数按如下方式使用: 

                                                 (7-5)

图7-18说明了对称MAC FIR滤波器的架构。



图6-18 称器MAC FIR滤波器

一般都是利用基于逻辑结构的加法器将数据相加,代表了通过滤波器的关键通道,并限制了最高时钟速度,需要额外的资源支持对称。由于数据是在一个端口上正向读出和在两一个端口上反向读出,因此控制部分提高了一定的资源消耗,但相比之下可以节省乘法器这种更宝贵的资源。

例7-3 使用DSP48 Slice并基于对称乘法器结构,完成一个4阶8比特的FIR乘法器,数据速率为20Mbps,乘加器模块工作频率为40MHz,滤波器系数为[8'd7、8'd17、8'd17、8'd7]。

module mac_fir2_tap4(clk_80MHz, reset, ce, din, dout);

input clk_80MHz;
input reset;
input ce;
input [7:0] din;
output [18:0] dout;

reg [18:0] dout;
wire [18:0] dout1;
wire [7:0] dtemp;
wire [8:0] dtemp1;
wire clk_40MHz;
reg [1:0] cnt = 0;
reg we = 0;
reg [3:0] spra = 0;
reg bypass = 0;
reg [8:0] A_IN = 0;
reg [8:0] B_IN = 0;
reg load = 0;

assign clk_40MHz = cnt[0];

// 控制数据缓冲
always @(posedge clk_80MHz) begin 
     if(reset) begin

cnt <= 0;
we <= 0;
load <= 0;
bypass <= 0;
A_IN <= 0;
B_IN <= 0;
dout <= 0; 

                  end
             else begin 
                      cnt <= cnt + 1;
                      case(cnt)
                               2'b00: begin
                                                  spra <= 3'b000;
                                                  bypass <= 0;
                                                  A_IN <= dtemp1; 
                                                  B_IN <= 9'd7;
                                                  load <= 0;
                                                  we <= 0; 
                               end
                               2'b01: begin
                                                 spra <= 3'b011; 
                                                 bypass <= 1;
                                                 dout <= dout1;
                                                 A_IN <= A_IN;
                                                 B_IN <= B_IN; 
                                                 load <= 0;
                                                 we <= 0; 
                               end
                               2'b10: begin 
                                                spra <= 3'b001; 
                                                bypass <= 0; 
                                                A_IN <= dtemp1;
                                                B_IN <= 9'd17; 
                                                load <= 1;
                                                we <= 0;
                               end 
                               2'b11: begin
                                               spra <= 3'b010;
                                               bypass <= 1;
                                               A_IN <= A_IN; 
                                               B_IN <= B_IN;
                                               load <= 1; 
                                               we <= 1;
                               end 
                          endcase
                   end
            end 

//
fir_dram fir_dram(

.CLK(clk_80MHz),
.D(din),
.WE(we),
.QSPO_CE(ce),
.SPRA(spra),
.QSPO(dtemp)

);
//
fir_adder fir_adder(

.B(dtemp),
.Q(dtemp1),
.CLK(clk_80MHz),
.BYPASS(bypass)

);
//
fir_mac2 fir_mac2 (

.A_IN(A_IN),
.B_IN(B_IN),
.CE_IN(ce),
.CLK_IN(clk_40MHz),
.LOAD_IN(load),
.RST_IN(reset),
.P_OUT(dout1)
);

endmodule

上述程序经过Synplify Pro综合后,其RTL级结构如图7-19所示。在乘加器模块前,添加了累加预处理单元。



图6-19 称MAC结构FIR滤波器的RTL结构图

在ModelSim 6.2b中完成仿真,其结果如图7-20所示。模块处理时钟是输入数据的4倍,但乘加器的工作时钟为输入数据的2倍。例如当输入为24、25、26和27时,分别和系数相乘,再将结果累加,经过9个时钟周期后,输出滤波输出1066。



6.4.3 MAC FIR滤波器IP Core的使用

Xilinx提供了MAC FIR的IP Core,位于IP core列表栏Digital Signal Processing Filter目录下,可实现单速率滤波器、多相插值滤波器以及多相抽取滤波器,且支持通道数从1到256,。其用户配置界面由5个页面组成。第1页面如图7-21所示。点击“Next”按键,进入下一页。

 



图6-21 MAC FIR滤波器配置界面(1)

第2页主要完成滤波器系数的配置,如图7-22所示。“Structure”栏的Tap文本框用于输入滤波器的抽头数,有效范围为1~1024。“Impulse Response”栏用于设定滤波器冲激响应的形状,有Symmetric(对称)、Non Synmetric(非对称)和Negative Symmetric(负对称)3种选择。一般来讲FIR滤波器的冲激响应都是对称的,可节省一半的资源。“Coefficients”栏的Coefficient Width用于输入系数位宽,“Number of Coefficient Set”文本栏用于输入系数集的个数。“Coefficient Type”用于选择系数是有符号数还是无符号数。“Coefficient Buffer Type”用于选择将系数存放在块RAM中还是分布式RAM中。



图6-22 MAC FIR滤波器配置界面(2)

第3页用于加载滤波器系数以及配置输入数据的类型。滤波器的系数要以.coe文件的形式导入IP Core。这里的COE文件格式和块RAM的COE文件格式略有不同,其格式如下所示:

radix=10;
coefdata= …… ;
在本例中,加载的COE文件为:
radix=10;
coefdata= -687, -1944, -333, 2023, -490, -3725, 3453, 15920,
15920, 3453, -3725, -490, 2023, -333, -1944, -687;

如果加载的.coe文件格式有错,或其和第2页面输入的抽头数不匹配,则.coe File Name文本框的内容会以红色显示。“Data Type”用于选择输入数据是有符号数还是无符号数。“Data Buffer Type”用于选择将滤波器的寄存数据存放在块RAM中还是分布式RAM中。



图6-23 MAC FIR滤波器配置界面(3)

加载.coe系数文件后,可点击“Show Coefficients”按键来核查已加载的系数,如图7-24所示。如果发现和设计出的系数不同,则需要修改.coe文件,重新加载并确认。



图6-24 MAC FIR滤波器系数查看器

击“Next”按键,进入速率配置界面,如图7-25所示。其中“Performance Optimization”栏设定模块的优化指标,有Auto(自动)、Minimum Area(面积最小化)、Minimal Area/High Speed(高速下的面积最小化)以及Maximum Speed(速度最大化)。“System Clock Rate”文本框用于设定滤波器工作频率;“Input Sample Rate”用于设定输入数据速率,这二个速率的比值越大,意味着可以完成更多倍数的复用,节省更多的资源。“Layout”用于设定模块版图,在高速设计中,即工作时钟超过100MHz,尽量选中Registered Output(输出寄存)和Creat RPM(Relatively Placed Macros,相对布局宏)这两项,后者对高速设计性能提高有明显的影响。配置完成后,点击“Next”按键进入下一页。



图6-25 MAC FIR滤波器配置界面(4)

最后一页是模块的配置信息、输出位宽以及延迟等信息,如图7-26所示。确认无误后,即可点击“Generate”按键,生成MAC FIR滤波器的IP Core。



图6-26 MAC FIR滤波器配置界面(5)

MAC FIR滤波器通常面向低速DSP应用,采用Xilinx FPGA芯片内部的DSP48 Slice,该功能可能在更小的面积上实现,同时获得更高的性能并消耗更少的功率。在滤波器的实现方式以及改变实现参数的能力方面,拥有更大的灵活性。

 

<<上一节    下一节>>




 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.