主要内容

HDL视频滤波器

本示例演示了如何为ITU-R BT.601 luma滤波器生成HDL代码,其中包含8位输入数据和10位输出数据。该滤波器是一种低通滤波器,其-3 dB点为3.2 MHz,采样频率为13.5 MHz,并具有ITU规范中所示的通带纹波和阻带衰减的指定范围。使用DSP System Toolbox™设计滤波器系数。这个示例主要关注量化效果和为System对象过滤器生成HDL代码。

设置系数

将先前设计的滤波器系数分配给变量b。这是一个半带滤波器,因此,除滤波器中点的系数恰好为1 / 2外,其他所有系数都为零。

检查双精度滤波器设计是否符合ITU-R BT.601模板,使用频率进行通带纹波和阻带衰减,并绘制通带图。红线显示了规范中允许的变化。

B = [0.00303332064210658, 0,...-0.00807786494715095, 0,...0.0157597395206364, 0,...-0.028508691397868, 0,...0.0504985344927114, 0,...-0.0977926818362618, 0,...0.315448742029959,...0.5,...0.315448742029959, 0,...-0.0977926818362618, 0,...0.0504985344927114, 0,...-0.028508691397868, 0,...0.0157597395206364, 0,...-0.00807786494715095, 0,...0.00303332064210658);F = 0:100:2.75e6;H = freqz(b,1,f,13.5e6);情节(f, 20 * log10 (abs (H)));标题(‘HDL视频滤波器双精密通带’);轴([0 2.75e6 -。8。8]);Passbandrange = {[2.75e6;1 e6;0;1 e6;2.75 e6),...(-0.5;-0.5;0;0.5;0.5)};线(passbandrange {:},“颜色”“红色”);

图中包含一个轴对象。标题为HDL Video Filter Double-Precision Passband的axis对象包含2个类型为line的对象。

绘制止水带

红线显示了阻带上的“不可超过”限制。

F = 4e6:100:6.75e6;H = freqz(b,1,f,13.5e6);情节(f, 20 * log10 (abs (H)));标题(‘HDL视频滤波器双精密阻带’);Axis ([4e6 6.75e6 -70 -35]);Stopbandrange = {[4e6;6.25 e6;6.75 e6),...(-40;-55;-55]};线(stopbandrange {:},“颜色”“红色”);

图中包含一个轴对象。标题为HDL Video Filter Double-Precision Stopband的axis对象包含2个类型为line的对象。

创建量化过滤器

用先前定义的系数创建FIR过滤器系统对象过滤器。对系数字长进行实验,以获得8位输入数据和10位输出数据所需的响应。

videoFilter = dsp.FIRFilter;videoFilter。分子= b;videoFilter。结构=“直接形式对称”尝试10位系数videoFilter。CoefficientsDataType =“自定义”;videoFilter。customcoefficients sdatatype = numerictype(1,10);

绘制量化滤波器响应图

现在检查相对于规格的量化滤波器的通带和阻带响应。首先绘制和检查量化通带。

量子化设计满足通带规格,除了在直流,它错过规格约0.035 dB。

F = 0:100:2.75e6;H = freqz(videoFilter,f,13.5e6,“算术”“固定”);情节(f, 20 * log10 (abs (H)));标题('HDL视频滤波器量化通带');轴([0 2.75e6 -。8。8]);线(passbandrange {:},“颜色”“红色”);

图中包含一个轴对象。标题为HDL Video Filter Quantized Passband的axis对象包含2个类型为line的对象。

绘制量子化止带

红线再次显示了阻带上的“不可超过”限制。

违反了阻带限制,这表明量化设置有问题。

F = 4e6:100:6.75e6;H = freqz(videoFilter,f,13.5e6,“算术”“固定”);情节(f, 20 * log10 (abs (H)));标题('HDL视频滤波器量化阻带');Axis ([4e6 6.75e6 -70 -35]);线(stopbandrange {:},“颜色”“红色”);

图中包含一个轴对象。标题为HDL Video Filter Quantized Stopband的axis对象包含2个类型为line的对象。

更改系数量化器设置

在系数字长上增加更多的位元可以使滤波器满足规范要求。将字长增加1,并重新绘制止水带。

这刚好错过了止水带末端的规格。如果您知道系统的其他部分对该信号应用了低通滤波器,那么这种与规范的小偏差可能是可以接受的。

videoFilter。customcoefficients sdatatype = numerictype(1,11);F = 4e6:100:6.75e6;H = freqz(videoFilter,f,13.5e6,“算术”“固定”);情节(f, 20 * log10 (abs (H)));标题('HDL视频滤波器量化阻带');Axis ([4e6 6.75e6 -70 -35]);线(stopbandrange {:},“颜色”“红色”);

图中包含一个轴对象。标题为HDL Video Filter Quantized Stopband的axis对象包含2个类型为line的对象。

设置最终系数量化器字长

在系数量化器字长上再加一位,并重新绘制止带。这应该符合规范。

videoFilter。customcoefficients sdatatype = numerictype(1,12);F = 4e6:100:6.75e6;H = freqz(videoFilter,f,13.5e6,“算术”“固定”);情节(f, 20 * log10 (abs (H)));标题('HDL视频滤波器最终量化止带');Axis ([4e6 6.75e6 -70 -35]);线(stopbandrange {:},“颜色”“红色”);

图中包含一个轴对象。标题为HDL Video Filter Final Quantized Stopband的axis对象包含2个类型为line的对象。

对通带响应执行最终检查

重新检查通带,以确保更改已经改善了DC附近响应中的问题。响应现在传递规范。

F = 0:100:2.75e6;H = freqz(videoFilter,f,13.5e6,“算术”“固定”);情节(f, 20 * log10 (abs (H)));标题('HDL视频滤波器最终量化通带');轴([0 2.75e6 -。8。8]);线(passbandrange {:},“颜色”“红色”);

图中包含一个轴对象。标题为HDL Video Filter Final Quantized Passband的axis对象包含2个类型为line的对象。

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

从量化滤波器开始,生成VHDL或Verilog代码。

创建临时工作目录。生成HDL之后(在本例中选择VHDL),在编辑器中打开生成的VHDL文件。

生成VHDL测试台,确保它与MATLAB中的响应完全匹配。选择默认的输入刺激,对于FIR是脉冲,阶跃,斜坡,啁啾和噪声输入。

要生成Verilog代码和Verilog测试平台,请将'TargetLanguage'属性的值从'VHDL'更改为'Verilog'。

警告表明,通过为滤波器选择对称结构并生成HDL,可能会导致更小的面积或更高的时钟速率。

假设输入8位字长,7位小数位。

Workingdir = tempname;generatehdl (videoFilter“名字”“hdlvideofilt”...“InputDataType”numerictype (7),...“开发”硬件描述语言(VHDL)的...“TargetDirectory”workingdir,...“GenerateHDLTestbench”“上”);
###生成:/tmp/Bdoc22b_2134332_443265/tp50caa2fd_972d_4221_a694_ccdde29d5d84/hdlvideofilt。##开始生成hdlvideofilt VHDL实体###开始生成hdlvideofilt VHDL架构###成功完成VHDL代码生成过程的过滤器:hdlvideofilt ## HDL延迟是2个样本## VHDL测试台开始生成。###已生成输入刺激;长度3261个样本。生成测试台:/tmp/Bdoc22b_2134332_443265/tp50caa2fd_972d_4221_a694_ccdde29d5d84/hdlvideofilt_tb。创建刺激向量…###完成生成VHDL测试平台。
编辑(fullfile (workingdir,“hdlvideofilt.vhd”));

绘制试验台刺激图

使用generatetbstimulus函数绘制上述命令使用的默认测试台架刺激。

tbstim = generatetbstimulus(视频过滤器,“InputDataType”7) numerictype(8日);情节(tbstim);标题('HDL视频滤波器测试台刺激');

图中包含一个轴对象。标题为HDL Video Filter Test Bench Stimulus的axis对象包含一个类型为line的对象。

结论

您设计了一个双精度滤波器以满足ITU-R BT.601流明滤波器规范,然后创建了一个同样满足该规范的FIR滤波器系统对象。您生成了VHDL代码和一个VHDL测试平台,用于从功能上验证过滤器。

您可以使用VHDL模拟器(例如ModelSim®)来验证这些结果。您还可以使用Verilog进行实验。通过消除生成的HDL必须完全符合MATLAB的约束,可以使用许多优化来获得更小、更快的HDL结果。当您使用这些优化时,HDL测试平台可以检查滤波器响应是否在MATLAB响应的指定误差范围内。