主要内容

HDL可编程FIR筛选器

此示例说明了如何使用用于加载系数的处理器接口生成FIR滤波器的HDL代码。通过使用处理器接口将系数加载到内部系数存储器中,可以将滤波器编程为任何期望的响应。

假设我们需要在一个芯片上实现一组具有不同响应的滤波器。如果所有滤波器都具有直接形式的FIR结构,并且长度相同,那么我们可以在需要时使用处理器接口从RAM或寄存器文件加载每个响应的系数。

这种设计将增加几个周期的延迟,输入样本可以处理与负载系数。然而,它的优点是,相同的滤波器硬件可以用新的系数编程,以获得不同的滤波器响应。这节省了芯片面积,否则每个过滤器将在芯片上单独实现。

在这个例子中,我们将考虑两个FIR滤波器,一个具有高通响应,另一个具有低通响应。我们将展示如何通过加载相应的系数集来为每个响应编写相同的滤波器硬件。我们将为过滤器生成VHDL代码,并使用生成的VHDL测试台显示两个响应。

设计过滤器

创建低通滤波器设计对象,然后创建FIR滤波器系统对象(Hlp)。然后,将其转换为具有高通响应(Hhp)的FIR滤波器系统对象。

Fpass=0.45;%通带频率Fstop = 0.55;%阻带频率apas = 1;通带衰减百分比(dB)Astop = 60;%停滞衰减(DB)f = fdesign.lowpass('FP,FST,AP,AST',馈送,Fstop,Apass,Astop);lpfilter = design(f,“equiripple”“FilterStructure”'dfsymfir'“SystemObject”,真正的);%低通hpcoeffs = firlp2hp (lpFilter.Numerator);hpFilter = dsp。FIRFilter (“分子”,hpcoeffs);%高通

数字转换过滤器

假设系数需要存储在比特宽度14的存储器中。使用此信息,将固定点设置应用于系统对象过滤器。

lpfilter.fullprecisionoverride = false;lpfilter.coefficientsDatatypate ='风俗';lpfilter.customcoefficientsdatatype = numerictype(1,14,13);lpfilter.outputdatatype ='与累加器相同';lpFilter。ProductDataType =“全精度”;lpfilter.accumulatordataType =“全精度”;hpfilter.fullprecisionoverride = false;hpfilter.coefficientsdatatype ='风俗';hpfilter.customcoefficientsdatatype = numerictype(1,14,13);hpfilter.outputdatatype ='与累加器相同';hpfilter.productDatatype =“全精度”;hpfilter.accumulatordataType =“全精度”

应用固定点设置后,重要的是验证系统对象过滤器是否仍然符合规范。我们将使用功能“测量”检查是否为真。

测量(lpFilter“算术”'固定的'
ans=采样率:N/A(归一化频率)通带边缘:0.45 3-dB点:0.46957 6-dB点:0.48314阻带边缘:0.55通带纹波:0.89243 dB阻带衰减:55.3452 dB过渡宽度:0.1

验证过滤器输出

使用Chirp生成线性扫描频率刺激信号。使用此输入刺激首先通过低通FIR滤波器过滤。然后更改滤波器的系数以获得高通响应并使用相同的输入样本再次过滤。

对于上述两级滤波操作,我们的目标是将MATLAB®输出的滤波器与生成的HDL代码输出的滤波器进行比较。

绘制输入样本和滤波后的输出显示低通和高通行为。

X = Chirp(0:199,0,199,0.4);lpcoeffs = lpfilter.numerator;%存储原始低通系数y1 = lpfilter(fi(x,1,14,13)。');%过滤信号lpFilter。分子= hpFilter.Numerator;%加载高通滤波器系数y2 = lpFilter (fi (x, 1, 14日,13)。');%过滤信号Y = [Y1;y2];%Contenate输出信号lpFilter。分子= lpcoeffs;%恢复原始低通系数次要情节(2,1,1);情节([x, x]);包含(的时间(样本)); ylabel('振幅'); 头衔(输入刺激的);次要情节(2,1,2);情节(y);包含(的时间(样本)); ylabel('振幅'); 头衔('过滤输出');

图中包含2个轴对象。标题为Input Stimulus的轴对象1包含一个类型为line的对象。标题为Filtered Output的axis对象2包含一个类型为line的对象。

用处理器接口和测试平台生成VHDL代码

对于量化低通滤波器,我们将通过设置属性‘coefficients source’为‘ProcessorInterface’来生成带有处理器接口的VHDL代码。这将导致生成的代码具有用于write_address、write_enable、coeffs_in和write_done信号的额外端口。该接口可用于将系数从主机处理器加载到内部寄存器文件中。HDL有一个额外的阴影寄存器,当'write_done'信号高时,从寄存器文件更新它。这使得过滤器实体能够同时加载和处理数据。

为了验证滤波器实体可以连续加载两组不同的滤波器系数,我们将生成VHDL测试台。首先,测试台面负载低通系数并处理输入样本。然后,测试台加载与高通滤波器响应相对应的系数,并再次处理输入样本。

生成的VHDL代码和VHDL测试平台可以使用ModelSim®等HDL模拟器进行编译和模拟。注意,第二组系数的加载和最后几个输入样本的处理是同时执行的。

为了生成所需的测试台,我们将属性“GenerateHDLTestBench”设置为“ON”并将“TestBenchCoeffStimulus”传递给GenerateHDL命令。传入的“testbenchcoefftumulus”的值是用于随后处理输入样本的系数的矢量。该示例在与高通滤波器相对应的系数的向量中传递。

假设由于输入ADC的固定数据路径要求,需要具有13位分数精度的14位带符号定点输入。

选择对称结构的%,该字段'testbenchcoeffstimulus'%必须是过滤器长度的一半。WorkingDir = TempName;generatehdl(lpfilter,“名字”“FilterProgrammable”...'inputdatatype',numerictype(1,14,13),...“开发”'vhdl'...“TargetDirectory”workingdir,...'cofficientsource'“ProcessorInterface”...“GenerateHDLTestbench”“上”...'testbenchusertumulus',x,...'testbenchcoeffstimulus'hpFilter.Numerator(1:(长度(hpFilter.Numerator) + 1) / 2));
### /tmp/Bdoc21b_1757077_255821/tpea7830ba_2df6_4e92_b62c_5700fd8c1a8f/ filter可编程的VHDL代码生成过程###开始生成FilterProgrammable VHDL实体###开始生成FilterProgrammable VHDL架构### #成功完成VHDL filter代码生成过程:FilterProgrammable ### # HDL latency是2个样本### #开始生成VHDL测试台。###生成输入刺激200个样本长度。###生成测试台:/tmp/Bdoc21b_1757077_255821/tpea7830ba_2df6_4e92_b62c_5700fd8c1a8f/ filterprogramable_tb。vhd ###创建刺激向量…###完成VHDL测试平台的生成

ModelSim®仿真结果

下面的显示显示了运行为测试平台生成的.do文件脚本后的ModelSim HDL模拟器。将ModelSim结果与之前绘制的MATLAB结果进行比较。

结论

我们设计高通和低通FIR过滤器,以满足给定的规格。然后,我们向滤波器量化过滤器并为过滤器生成VHDL代码,其中接口从处理器加载系数。然后,我们生成了VHDL测试台,其在加载低通系数后显示输入样本的处理,以高通系数重复操作。我们展示了如何生成VHDL代码,该代码实现滤波器硬件,该滤波器硬件可重复使用,当通过来自主机处理器的端口接口加载不同的系数组时,该滤波器硬件可重复使用。