这个例子演示了如何为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”,“日志”);
将固定点设置应用到过滤器对象。假设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”,“日志”,“算术”,“固定”);
在上面的图中,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]);
硬件实现滤波器设计的关键步骤是检查标度值是否合理,并根据需要对标度值进行调整。首先,检查相对于输入规范的量化比例值——分数长度为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
从正确的量化过滤器开始,生成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代码和测试平台,该命令打开对话框,让您定制和生成Verilog或VHDL代码和量化过滤器的测试平台。
GUI被定制为“butterFilter”,只有相关的小部件可用来设置。要生成HDL代码和测试台,您应该首先转到工作目录,然后调用FDHDLTOOL命令。
fdhdltool (butterFilter numerictype(1、8、7));
您可以修改默认设置,然后单击生成以生成HDL和/或测试台。
下面的显示显示了运行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过滤掉响应。”);包含(示例#的);
你设计了一个巴特沃斯滤波器来满足给定的规格。然后对滤波器进行量化,发现通带要求没有满足。重新计算系数和缩放过滤器修复了这个问题。然后为过滤器和VHDL测试台生成VHDL代码。
您可以使用ModelSim HDL Simulator来验证这些结果。您还可以使用VHDL和Verilog对过滤器和测试台进行实验。