主要内容

高密度脂蛋白巴特沃斯滤波器

这个例子演示了如何为5阶Butterworth过滤器生成HDL代码。该滤波器的截止频率相对于采样率非常低,导致该滤波器难以实现。此外,较小的输入(8位)和输出(9位)字大小导致量化滤波器需要缩放才能实现。

设计滤波器

使用CD采样率44.1 kHz和截止频率500hz。首先,创建滤波器设计对象,然后创建DF1 Biquad filter System对象。最后,使用fvtool检查对数频率下的响应。

Fs=44100;F3db=500;filtedes=fdesign.lowpass(‘n,f3db’, 5, F3db, Fs);butterFilter =设计(filtdes,“黄油”...“SystemObject”,真的,“FilterStructure”“df1sos”);fvtool(巴特过滤器,“Fs”Fs,“FrequencyScale”“日志”);

图过滤器可视化工具-幅度响应(dB)包含一个轴和其他类型的uitoolbar, uimenu对象。标题为“大小响应(dB)”的轴包含两个类型为line的对象。

创建量化过滤器

将固定点设置应用到过滤器对象。假设9位定点输出数据带有12位系数、20位状态、全精度产品和32位加法器。下载188bet金宝搏用fvtool检查响应。

butterFilter。NumeratorCoefficientsDataType =“自定义”;butterFilter.CustomNumeratorCoefficientsDataType=numerictype([],12);butterFilter.CustomDenominatorCoefficientsDataType=numerictype([],12);butterFilter.CustomScaleValuesDataType=numerictype([],12);butterFilter.SectionInputDataType=“自定义”;butterFilter。CustomSectionInputDataType = numerictype(15)[], 20日;butterFilter。SectionOutputDataType =“自定义”;butterFilter。CustomSectionOutputDataType = numerictype(15)[], 20日;butterFilter。NumeratorProductDataType =“全精度”;butterFilter。DenominatorProductDataType =“全精度”;butterFilter。NumeratorAccumulatorDataType =“自定义”;butterFilter。32岁的CustomNumeratorAccumulatorDataType = numerictype ([] 24);butterFilter。DenominatorAccumulatorDataType =“自定义”;butterFilter.CustomDenominatorAccumulatorDataType=numerictype([],32,25);butterFilter.OutputDataType=“自定义”;butterFilter.CustomOutputDataType=numerictype([],9,7);butterFilter.RoundingMethod=“最近的”;butterFilter.overflow动作=“包装”;fvtool (butterFilter“Fs”Fs,“FrequencyScale”“日志”“算术”“固定”);

图过滤器可视化工具-幅度响应(dB)包含一个轴和其他类型的uitoolbar, uimenu对象。标题为“大小响应(dB)”的轴包含3个类型为line的对象。这些对象代表过滤器1:量化,过滤器1:引用。

Requantize过滤器

在上面的图中,fvtool显示量化的通带大约比期望的响应低2 dB。将系数字长从12调整到16,使量化响应更接近参考双精度响应,并放大通带响应。量化滤波器现在仅仅比参考滤波器低0.1分贝。

butterFilter。CustomNumeratorCoefficientsDataType = numerictype ([], 16);butterFilter。CustomDenominatorCoefficientsDataType = numerictype ([], 16);butterFilter。CustomScaleValuesDataType = numerictype ([], 16);fvtool (butterFilter“Fs”Fs,“FrequencyScale”“日志”“算术”“固定”); 轴([01.0-11]);

图过滤器可视化工具-幅度响应(dB)包含一个轴和其他类型的uitoolbar, uimenu对象。标题为“大小响应(dB)”的轴包含3个类型为line的对象。这些对象代表过滤器1:量化,过滤器1:引用。

检查量表值

硬件实现滤波器设计的关键步骤是检查标度值是否合理,并根据需要对标度值进行调整。首先,检查相对于输入规范的量化比例值——分数长度为7位的8位值。由于前两个比例值小于输入设置,大多数输入值都被量化了。为了纠正这一点,过滤器需要缩放。

尺度= butterFilter。ScaleValues。* 2 ^ 7;disp(尺度);
0.1588 0.1535 4.4042 128.0000

现在用频域无穷大范数来缩放滤波器。在这种情况下,缩放后的缩放值都是1。

规模(butterFilter“Linf”);尺度= butterFilter.ScaleValues;disp(尺度);
1.0000 1.0000 1.0000 1.0000 1.0000

从量化滤波器生成HDL代码和测试平台

从正确的量化过滤器开始,生成VHDL或Verilog代码。您可以选择生成VHDL或Verilog测试台,以验证HDL设计与MATLAB®滤波器匹配。

要生成Verilog,改变属性'TargetLanguage'的值,从'VHDL'到'Verilog'。

由于这个滤波器的通带相对于采样率是如此的低,一个自定义的输入刺激是一个更好的方法来测试滤波器的实现。构建一个周期的测试输入,每个周期在50赫兹的步骤中为50到300赫兹。

假设8位带符号的定点输入带有7位分数。

生成VHDL测试平台,验证结果与MATLAB结果的准确匹配。

创建临时工作目录。生成滤波器的VHDL代码,并搭建VHDL测试平台,验证结果与MATLAB结果的准确匹配。

在编辑器中打开为过滤器生成的VHDL文件。

workingdir = tempname;userstim = [];n = [50, 100, 150, 200, 250, 300] userstim = [userstim,sin(2*pi*n/Fs*(0:Fs/n))];% #好吧结束generatehdl(butterFilter,“名字”“hdlbutter”...“开发”硬件描述语言(VHDL)的...“TargetDirectory”workingdir,...“GenerateHDLTestbench”“上”...“TestBenchUserStimulus”userstim,...“InputDataType”7) numerictype(8日);
### /tmp/Bdoc21a_1606923_129538/tpd5a1e732_faa9_4353_8d9c_8d4cae9eb0f3/hdlbutter. ### /tmp/Bdoc21a_1606923_129538/tpd5a1e732_faa9_4353_8d9c_8d4cae9eb0f3vhd # # # # # #开始代hdlbutter VHDL的实体开始代hdlbutter硬件描述语言(VHDL)架构# # #一阶部分,# 1 # # #二阶节# 2 # # #二阶节# 3 # # #成功完成硬件描述语言(VHDL)过滤器的代码生成过程:hdlbutter # # # HDL延迟是2 # # #样品开始一代的硬件描述语言(VHDL)试验台。###生成输入刺激2166个样本长度。###生成测试台:/tmp/Bdoc21a_1606923_129538/tpd5a1e732_faa9_4353_8d9c_8d4cae9eb0f3/hdlbutter_tb。vhd ###创建刺激向量…###完成VHDL测试平台的生成
编辑(完整文件(工作目录,“hdlbutter.vhd”));%在编辑器中打开生成的VHDL测试台。编辑(完整文件(工作目录,“hdlbutter_tb.vhd”));

使用FDHDLTool生成HDL代码和测试平台

可以选择使用FDHDLTOOL命令生成HDL代码和测试平台,该命令打开对话框,让您定制和生成Verilog或VHDL代码和量化过滤器的测试平台。

GUI被定制为“butterFilter”,只有相关的小部件可用来设置。要生成HDL代码和测试台,您应该首先转到工作目录,然后调用FDHDLTOOL命令。

fdhdltool (butterFilter numerictype(1、8、7));

您可以修改默认设置,然后单击生成以生成HDL和/或测试台。

ModelSim®仿真结果

下面的显示显示了运行VHDL测试台后的ModelSim HDL模拟器。将ModelSim结果与下面的MATLAB结果进行比较。

Xrange = (0:length(userstim) - 1);y = butterFilter (fi (userstim。',1,8日7));次要情节(2,1,1);情节(xrange userstim);轴([0 length(userstim) -1.1 1.1]);标题(《刺激中的HDL巴特沃斯过滤器》);包含(示例#的);次要情节(2,1,2);情节(xrange y);轴([0 length(userstim) -1.1 1.1]);标题(“HDL Butterworth过滤掉响应。”);包含(示例#的);

图中包含2个轴。轴1带有标题HDL Butterworth Filter In Stimulus。包含类型为line的对象。轴2带有标题HDL Butterworth Filter Out Response。包含类型为line的对象。

结论

你设计了一个巴特沃斯滤波器来满足给定的规格。然后对滤波器进行量化,发现通带要求没有满足。重新计算系数和缩放过滤器修复了这个问题。然后为过滤器和VHDL测试台生成VHDL代码。

您可以使用ModelSim HDL Simulator来验证这些结果。您还可以使用VHDL和Verilog对过滤器和测试台进行实验。