主要内容

HDL可编程FIR筛选器

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

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

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

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

设计过滤器

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

成就= 0.45;%通带频率fstop = 0.55;%阻带频率Apass = 1;%通带衰减(DB)astop = 60;%停滞衰减(DB)f = fdesign.lowpass('FP,FST,AP,AST',馈送,Fstop,Apass,Astop);lpfilter = design(f,'平静''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(归一化频率)Passband Edge: 0.45 3-dB Point: 0.46957 6-dB Point: 0.48314 Stopband Edge: 0.55 Passband Ripple: 0.89243 dB Stopband Atten。: 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.numerator = hpfilter.numerator;%加载高通滤波系数y2 = lpfilter(fi(x,1,14,13)。');%过滤信号Y = [Y1;y2];%Contenate输出信号lpfilter.numerator = lpcoeffs;%恢复原始低通系数子图(2,1,1);图([x,x]);Xlabel('时间[样本]'); ylabel('振幅');标题('输入刺激');子图(2,1,2);情节(y);Xlabel('时间[样本]'); ylabel('振幅');标题('过滤输出');

图包含2个轴。带有标题输入刺激的轴1包含类型线的对象。带有标题过滤器输出的轴2包含类型线的对象。

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

对于量化的低通滤波器,我们将通过将属性“CofficientSource”设置为“processOrinterface”来生成带有处理器接口的VHDL代码。这将导致生成的代码具有Write_address,Write_enable,Coeffs_in和Write_done信号的附加端口。该接口可用于将来自主处理器的系数加载到内部寄存器文件中。HDL有一个额外的阴影寄存器,当“Write_done”信号很高时,从寄存器文件更新。这使得能够通过滤波器实体同时加载和处理数据。

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

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

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

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

选择对称结构的%,该字段'testbenchcoeffstimulus'%必须是过滤器长度的一半。WorkingDir = TempName;generatehdl(lpfilter,'名称''过滤可编程'......'inputdatatype',numerictype(1,14,13),......'目标语言''vhdl'......'targetdirectory',练习呢,......'cofficientsource'“ProcessorInterface”......'generatehdltestbench''上'......'testbenchusertumulus', x,......'testbenchcoeffstimulus',hpfilter.numerator(1 :(长度(hpfilter.numerator)+1)/ 2));
###启动VHDL代码过滤器的生成过程:filterprogrammable ###生成:/tmp/bdoc21a_1606923_129767/tp4098d2e1_0946_4438_aa2f_9673_129767/tp403_129767/tp4098d2e1_0946_4438_AA2F_9673C31E6137/FILterProgrammable.VHD ###开始生成过滤器可编程VHDL实体###开始生成筛选可筛选的VHDL架构###成功完成过滤器的VHDL代码生成过程:Filterprogrammable ### HDL延迟是2个样本###开始生成VHDL测试台。###生成输入刺激###完成产生输入刺激;长度200个样本。###生成测试台:/tmp/bdoc21a_1606923_129767/tp4098d2e1_0946_4438_0946_4438_AA2F_9673C31E6137/FILTERPRAGMMABLE_TB.VHD ###创建刺激向量... ###完成生成VHDL测试台。

Modelsim®仿真结果

以下显示显示了在运行生成的.Do文件脚本以进行测试台的Modelim HDL模拟器。将ModelIM结果与如之前绘制的MATLAB结果进行比较。

结论

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