主要内容

高密度脂蛋白可编程滤波器

这个例子演示了如何生成一个冷杉过滤器的HDL代码与处理器接口加载系数。过滤器可以用于任何所需要的响应系数加载到一个内部系数内存使用处理器接口。

让我们假设我们需要实现一个过滤器,银行有不同的反应,在芯片上。如果所有的过滤器有一个直接形式冷杉结构,和相同的长度,然后我们可以使用一个处理器接口加载系数为每个响应从RAM或注册文件。

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

在这个例子中,我们将考虑两个FIR滤波器,一个与低通滤波器与高通滤波响应以及其他反应。我们将展示相同的滤波器硬件可以被编程为每个响应通过加载相应的系数。我们将生成VHDL代码过滤器和显示两个反应生成使用硬件描述语言(VHDL)试验台。

设计的过滤器

创建低通滤波器的设计对象,然后创建冷杉过滤系统对象(Hlp)。然后,把它创建一个冷杉过滤系统对象与高通滤波响应(水马力)。

成就= 0.45;%通带频率Fstop = 0.55;%阻带频率apas = 1;%通带衰减(dB)Astop = 60;%阻带衰减(dB)f = fdesign.lowpass (“Fp,置,美联社,Ast”、成就、Fstop apas Astop);lpFilter =设计(f,“equiripple”,“FilterStructure”,“dfsymfir”,“SystemObject”,真正的);%低通hpcoeffs = firlp2hp (lpFilter.Numerator);hpFilter = dsp.FIRFilter (“分子”,hpcoeffs);%高通滤波

数字转换过滤器

假设系数需要被存储在内存的位宽14。利用这些信息,应用不动点设置过滤器的系统对象。

lpFilter.FullPrecisionOverride = false;lpFilter.CoefficientsDataType =“自定义”;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分贝点:0.48314阻带边缘:0.55通带波纹:0.89243 dB阻带衰减器。:55.3452 dB过渡宽度:0.1

验证滤波器的输出

产生一个线性扫描使用唧唧声刺激信号。使用该输入刺激过滤首先通过低通滤波器。然后改变滤波器的系数获得高通滤波响应,并使用相同的输入样本再次过滤。

上述两级过滤操作我们的目标是比较滤波器输出从MATLAB®与HDL代码生成。

策划输入样本和过滤后的输出显示了低通和高通的行为。

x =唧唧喳喳(0199年0:199,0.4);lpcoeffs = lpFilter.Numerator;%存储原始低通滤波器系数日元= lpFilter (fi (x, 1, 14日,13)。');%滤波器的信号lpFilter。分子= hpFilter.Numerator;%加载高通滤波器系数y2 = lpFilter (fi (x, 1, 14日,13)。');%滤波器的信号y =[日元;y2);%连接输出信号lpFilter。分子= lpcoeffs;%恢复原来的低通滤波器系数次要情节(2,1,1);情节([x, x]);包含(的时间(样本));ylabel (“振幅”);标题(输入刺激的);次要情节(2,1,2);情节(y);包含(的时间(样本));ylabel (“振幅”);标题(“过滤输出”);

图包含2轴对象。坐标轴对象1标题输入刺激,包含时间(样本),ylabel振幅包含一个类型的对象。坐标轴对象2标题过滤输出,包含时间(样本),ylabel振幅包含一个类型的对象。

生成VHDL代码与处理器接口和试验台

量子化的低通滤波器,我们将生成VHDL代码与处理器接口通过设置属性“CoefficientSource”“ProcessorInterface”。这将导致生成的代码有额外的港口write_address, write_enable, coeffs_in, write_done信号。这个接口可以用来从一个主机处理器负载系数成内部寄存器文件。高密度脂蛋白有一个额外的影子寄存器的更新寄存器文件“write_done”信号时高。这使得同时加载和数据处理的过滤器的实体。

验证过滤器实体可以先后装有两组不同的滤波器系数,我们将生成一个硬件描述语言(VHDL)试验台。首先,试验台加载低通滤波器系数和流程的输入样本。然后试验台加载系数对应于高通滤波器响应,和流程的输入样本。

生成的硬件描述语言(VHDL)代码和硬件描述语言(VHDL)试验台可以使用一个高密度脂蛋白模拟器编译和仿真等ModelSim®。注意,第二组的加载系数和最后几个输入样本的处理同时执行。

为了生成所需的试验台,我们设置了属性“GenerateHDLTestbench”“上”和“TestbenchCoeffStimulus”调用传递给generatehdl命令。传入的值为“TestbenchCoeffStimulus”是一个向量的系数用于后续处理的输入样本。这个例子通过向量的系数对应于一个高通滤波器。

假设14-bit签署需要输入13位的分数精确定点固定数据路径的要求输入ADC。

%的对称结构被选中时,字段“TestbenchCoeffStimulus”%的滤波器长度的一半。workingdir = tempname;generatehdl (lpFilter“名字”,“FilterProgrammable”,“InputDataType”13)、numerictype(1、14日,“开发”,硬件描述语言(VHDL)的,“TargetDirectory”workingdir,“CoefficientSource”,“ProcessorInterface”,“GenerateHDLTestbench”,“上”,“TestBenchUserStimulus”,x,“TestbenchCoeffStimulus”hpFilter.Numerator(1:(长度(hpFilter.Numerator) + 1) / 2));
# # #开始硬件描述语言(VHDL)过滤器的代码生成过程:FilterProgrammable # # #生成:/ tmp / Bdoc23a_2213998_491196 / tp7ba015ad_7fc0_4d02_ad1c_40954296fa98 / FilterProgrammable。vhd # # # # # #开始代FilterProgrammable VHDL的实体开始代FilterProgrammable硬件描述语言(VHDL)架构# # #成功完成硬件描述语言(VHDL)过滤器的代码生成过程:FilterProgrammable # # # HDL延迟是2 # # #样品开始一代的硬件描述语言(VHDL)试验台。刺激# # # # # #生成输入生成输入刺激;200个样本长度。# # #生成试验台:/ tmp / Bdoc23a_2213998_491196 / tp7ba015ad_7fc0_4d02_ad1c_40954296fa98 / FilterProgrammable_tb。vhd # # #创造刺激向量……# # #完成生成硬件描述语言(VHDL)试验台。

ModelSim®仿真结果

下面显示了ModelSim HDL模拟器在运行生成的,文件脚本测试台上。比较ModelSim结果与MATLAB绘制结果。

结论

我们设计高通滤波和低通FIR滤波器,以满足给定的规范。然后我们量子化的过滤器,过滤和硬件描述语言(VHDL)生成代码的接口从处理器负载系数。然后生成一个硬件描述语言(VHDL)试验台加载后显示输入样本的处理低通滤波器系数,与高通滤波系数重复操作。我们展示了如何生成可重用的VHDL代码实现滤波器硬件不同反应时不同的装载系数从主机处理器通过端口界面。