主要内容

HDL巴特沃斯滤波器

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

设计过滤器

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

Fs = 44100;F3db = 500;Filtdes = fdesign.lowpass(“n, f3db”, 5, F3db, Fs);butterFilter =设计“黄油”...“SystemObject”,真的,“FilterStructure”“df1sos”);fvtool (butterFilter“Fs”Fs,“FrequencyScale”“日志”);

图形过滤可视化工具-幅度响应(dB)包含一个轴和uitoolbar, uimenu类型的其他对象。标题为Magnitude Response (dB)的轴包含2个类型为line的对象。

创建量化过滤器

将固定点设置应用于筛选器对象。假设9位定点输出数据具有12位系数、20位状态、全精度积和32位加法器。s manbetx 845使用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,“FrequencyScale”“日志”“算术”“固定”);

图形过滤可视化工具-幅度响应(dB)包含一个轴和uitoolbar, uimenu类型的其他对象。标题为Magnitude Response (dB)的轴包含3个类型为line的对象。这些对象表示筛选器#1:量化,筛选器#1:引用。

重新要求过滤器

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

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

图形过滤可视化工具-幅度响应(dB)包含一个轴和uitoolbar, uimenu类型的其他对象。标题为Magnitude Response (dB)的轴包含3个类型为line的对象。这些对象表示筛选器#1:量化,筛选器#1:引用。

检查刻度值

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

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

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

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

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

从正确量化的过滤器开始,生成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”workingdir,...“GenerateHDLTestbench”“上”...“TestBenchUserStimulus”userstim,...“InputDataType”7) numerictype(8日);
###生成:/tmp/Bdoc21a_1606923_129538/tpd5a1e732_faa9_4353_8d9c_8d4cae9eb0f3/hdlbutter。###开始生成hdlbutter VHDL实体###开始生成hdlbutter VHDL架构###一阶段,###二阶段,###二阶段,## 3 ##成功完成VHDL代码生成过程的过滤器:hdlbutter ## HDL延迟是2个样本## VHDL测试台的开始生成。###已生成输入刺激;长度为2166个样本。生成测试台:/tmp/Bdoc21a_1606923_129538/tpd5a1e732_faa9_4353_8d9c_8d4cae9eb0f3/hdlbutter_tb。创建刺激向量…###完成生成VHDL测试平台。
编辑(fullfile (workingdir,“hdlbutter.vhd”));在编辑器中打开生成的VHDL测试台。编辑(fullfile (workingdir,“hdlbutter_tb.vhd”));

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

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

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

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

您可以修改默认设置并单击Generate以生成HDL和/或测试平台。

ModelSim®仿真结果

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

Xrange =(0:长度(userstim) - 1);y = butterFilter(fi(userstim.',1,8,7));次要情节(2,1,1);情节(xrange userstim);Axis ([0 length(userstim) -1.1 1.1]);标题(“刺激中的高密度脂蛋白巴特沃斯滤波器。”);包含(示例#的);次要情节(2,1,2);情节(xrange y);Axis ([0 length(userstim) -1.1 1.1]);标题(“HDL巴特沃斯过滤响应。”);包含(示例#的);

图包含2个轴。轴1标题HDL巴特沃斯过滤器在刺激。包含line类型的对象。轴2标题HDL巴特沃斯过滤响应。包含line类型的对象。

结论

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

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