信号处理工程师可以采用多种方法来实现滤波器,但常见的滤波器可以采用单乘法器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) begincnt <= 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,该功能可能在更小的面积上实现,同时获得更高的性能并消耗更少的功率。在滤波器的实现方式以及改变实现参数的能力方面,拥有更大的灵活性。


