此示例说明了如何为第五阶Butterworth滤波器生成HDL代码。该滤波器的截止频率相对于采样率非常低,导致难以做出的过滤器。此外,小输入(8位)和输出(9位)字大小会导致量化过滤器需要缩放可实现。
使用44.1 kHz的CD采样率和500 Hz的截止频率。首先,创建筛选器设计对象,然后创建DF1 Biquad过滤系统对象。最后,使用FVTool检查日志频率的响应。
Fs = 44100;F3db = 500;filtdes = fdesign.lowpass (“n, f3db”,5,f3db,fs);Butterfilter = Design(Filtdes,'牛油'那......'systemobject',真的,'filterstructure'那“df1sos”);FVTool(Butterfilter,'FS',fs,'验证'那'日志');
将固定点设置应用于过滤器对象。假设具有12位系数,20位状态,全精密产品和32位加法器的9位固定点输出数据。下载188bet金宝搏使用FVTool检查响应。
Butterfilter.numeratorCoefficientsDatatype =.'风俗';butterFilter。CustomNumeratorCoefficientsDataType = numerictype ([], 12);butterFilter。CustomDenominatorCoefficientsDataType = numerictype ([], 12);butterFilter。CustomScaleValuesDataType = numerictype ([], 12);butterFilter。SectionInputDataType ='风俗';ButterFilter.CustomsectionInputdatatype = Numerictype([],20,15);Butterfilter.sectionOutputDatatype ='风俗';ButterFilter.CustomsectionOutputdatatype = Numerictype([],20,15);ButterFilter.numeratorProductDataType =“充分精确”;ButterFilter.DenominatorProductDataType =“充分精确”;Butterfilter.numeratorAccumulatorDataType =.'风俗';ButterFilter.CustomnumeratorAccumulatorDataType = Numerictype([],32,24);ButterFilter.DenominatorAccumulatordataType ='风俗';Butterfilter.CustomdenominatorAccumulatordataType = Numerictype([],32,25);butterfilter.outputdatatype ='风俗';butterFilter。CustomOutputDataType = numerictype ([] 9 7);butterFilter。RoundingMethod ='最近';butterFilter。OverflowAction ='裹';FVTool(Butterfilter,'FS',fs,'验证'那'日志'那'算术'那'固定的');
在上面的绘图中,FVTool表明量化通带比所需响应低大约2dB。将系数字长度从12到16调整为使量化响应更接近参考双精度响应并放大通带响应。量化过滤器现在刚刚超过0.1 dB,低于参考滤波器。
ButterFilter.CustomnumeratorCoeffientsDatatype = Numerictype([],16);ButterFilter.CustomdenominatorCoeffiersDatatype = Numerictype([],16);ButterFilter.CustomScalevaluesDatatype = Numerictype([],16);FVTool(Butterfilter,'FS',fs,'验证'那'日志'那'算术'那'固定的');轴([0 1.0 -1 1]);
过滤器设计的硬件实现的关键步骤是检查刻度值是否合理并在需要时调整比例值。首先,检测相对于输入规范的量化尺度值 - 一个分数为7位的8位值。由于前两个刻度值小于输入设置,因此大多数输入值都被量化。要纠正此功能,需要缩放过滤器。
缩减= Butterfilter.Scalevalues。* 2 ^ 7;DISP(缩减);
0.1588 0.1535 4.4042 128.0000
现在使用频域Infinity常值缩放过滤器。在缩放之后,在这种情况下,刻度值都是一个。
尺度(Butterfilter,'linf');缩减= butterfilter.scalevalues;DISP(缩减);
1.0000 1.0000 1.0000 1.0000
从正确量化的过滤器开始,生成VHDL或Verilog代码。您可以选择生成VHDL或Verilog测试台,以验证HDL设计与MATLAB®过滤器匹配。
要生成Verilog,请将属性“targetlanguage”的值从“VHDL”更改为“Verilog”。
由于该滤波器的通带相对于采样率很低,因此自定义输入刺激是测试过滤器实现的更好方法。在50 Hz步骤中构建具有50至300 Hz中的一个周期的测试输入。
假设具有7位分数的8位符号定点输入。
生成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',练习呢,......'generatehdltestbench'那'上'那......'testbenchusertumulus',userstim,......'inputDatatype',numerictype(1,8,7));
###启动过滤器的VHDL代码生成过程:HDLButter ###生成:/tmp/bdoc21a_1606923_129538/tpd5a129538/tpd5a129538/tpd5a129538/tpd5a129538/tpd5a1_8d9c_8d4cae9eb0f3/hdlbutter.vhd ###开始生成HDlbutter VHDL实体###开始生成HDLbutter VHDL架构###首先 -订单部分,#1 ###二阶部分,#2 ###二阶部分,#3 ###成功完成筛选器的VHDL代码生成过程:HDLButter ### HDL延迟是2个样本###起始生成VHDL测试台。###生成输入刺激###完成产生输入刺激;长度为2166个样本。###生成测试台:/tmp/bdoc21a_1606923_129538/tpd5a129538/tpd5a129538/tpd5a1_8d9c_8d4cae9eb0f3/hdlbutter_tb.vhd ###创建刺激向量... ###完成生成VHDL测试台。
编辑(fullfile (workingdir,'hdlbutter.vhd'));%在编辑器中打开生成的VHDL测试台。编辑(fullfile (workingdir,'hdlbutter_tb.vhd'));
可以使用打开对话框的fdhdltool命令来生成HDL代码和测试台,该命令允许您自定义和生成Verilog或VHDL代码以及量化过滤器的测试代码。
GUI以“ButterFilter”定制为“Butterfilter”,即只有相关的小部件可以设置。要生成HDL代码和测试台,您应该先转到工作目录,然后调用fdhdltool命令。
fdhdltool(Butterfilter,Numerictype(1,8,7));
您可以修改默认设置并单击Generate来生成HDL和/或测试台。
以下显示在运行VHDL测试台后显示了模型HDL模拟器。将ModelSim结果与下面的MATLAB结果进行比较。
Xrange =(0:长度(userstim) - 1);Y = Butterfilter(Fi(Userstim',1,8,7));子图(2,1,1);情节(Xrange,Userstim);轴([0长度(userstim)-1.1 1.1]);标题('HDL Butterworth筛选刺激。);Xlabel('样本 #');子图(2,1,2);绘图(Xrange,Y);轴([0长度(userstim)-1.1 1.1]);标题('HDL Butterworth滤除响应。');Xlabel('样本 #');
您设计了一个Butterworth滤波器,以满足给定的规格。然后,您量化过滤器并发现不满足通带要求。重新调整系数并缩放过滤器修复了此问题。然后,您为过滤器和VHDL测试台生成了VHDL代码。
您可以使用Modelsim HDL模拟器,验证这些结果。您还可以对滤波器和测试台进行VHDL和Verilog进行实验。