主要内容

用于FIR滤波器的HDL串行体系结构

这个例子说明了如何为音频过滤应用程序的低通滤波器生成具有完全并行、完全串行、部分串行和级联串行架构的对称FIR滤波器的HDL代码。

设计过滤器

使用44.1 kHz的音频采样率和8.0 kHz的通带边缘频率。设置允许的峰到峰通带纹波为1 dB,阻带衰减为-90 dB。然后,对滤波器进行设计fdesign.lowpass,并创建FIR过滤器系统对象™“equiripple”方法。“直接形式对称”结构。

Fs = 44.11 e3;%采样频率(Hz)Fpass = 8e3;频率,单位为HzFstop = 8.8e3;%止带频率,单位为HzApass = 1;%通带波纹(以dB为单位)stop = 90;%阻带衰减(以dB为单位)Fdes = fdesign.lowpass(“Fp,置,美联社,Ast”...Fpass, Fstop, Apass, stop, Fs);lpFilter =设计(fdes,“equiripple”“FilterStructure”“dfsymfir”...“SystemObject”,真正的);

量化滤波器

假设音频滤波器的输入来自一个12位ADC,输出是一个12位DAC。

Nt_in = numerictype(1,12,11);Nt_out = nt_in;lpFilter。FullPrecisionOverride = false;lpFilter。CoefficientsDataType =“自定义”;lpFilter。customcoefficients sdatatype = numerictype(1,16,16);lpFilter。OutputDataType =“自定义”;lpFilter。CustomOutputDataType = nt_out;使用fvtool检查响应。fvtool (lpFilter“Fs”Fs,“算术”“固定”);

{

从量化滤波器生成完全并行HDL代码

从正确的量化滤波器开始,生成VHDL®或Verilog®代码。创建临时工作目录。生成HDL代码之后(在本例中选择VHDL),通过单击命令行显示消息中显示的链接,在编辑器中打开生成的VHDL文件。

默认设置生成一个完全并行的体系结构。在直接形式的FIR滤波器结构中,每个滤波器抽头都有一个专用的乘法器,在对称FIR结构中,每两个对称抽头都有一个专用的乘法器。这导致了大量的芯片面积(在本例中为78个乘法器)。您可以在各种串行体系结构中实现过滤器,以获得所需的速度/面积权衡。这些体系结构选项将在本示例的后续部分中展示。

Workingdir = tempname;%完全并行(默认)generatehdl (lpFilter“名字”“fullyparallel”...“开发”硬件描述语言(VHDL)的...“TargetDirectory”workingdir,...“InputDataType”, nt_in);
生成:/tmp/Bdoc22b_2134332_443265/tpea1dd60f_f971_4608_89de_43582dec35d3/完全并行。##开始生成完全并行的VHDL实体###开始生成完全并行的VHDL架构###成功完成VHDL代码生成过程的过滤器:完全并行## HDL延迟是2个样本

从量化滤波器生成一个测试平台

生成一个VHDL测试平台,以确保结果与您在MATLAB®中看到的响应完全匹配。生成的VHDL代码和VHDL测试台可以使用模拟器进行编译和模拟。

生成DTMF音调,用作过滤器的测试刺激。DTMF信号由两个频率来自两个互斥组的正弦波(或音调)的和组成。每对音调包含低组的一个频率(697 Hz, 770 Hz, 852 Hz, 941 Hz)和高组的一个频率(1209 Hz, 1336 Hz, 1477Hz),并代表一个唯一的符号。这段代码生成所有的DTMF信号,并仅使用其中一个(这里的数字1)作为测试刺激。这种选择使测试刺激的长度保持在合理的限度内。

符号= {' 1 '' 2 '“3”“4”“5”“6”“7”“8”“9”‘*’' 0 '“#”};LFG = [697 770 852 941];%低频组HFG = [1209 1336 1477];%高频组生成一个包含所有可能的高和低组合的矩阵%频率,其中每一列表示一个组合。F = 0 (2,12);c = 1:4R =1:3 f(: 3*(c-1)+ R) = [lfg(c);hfg (r)];结束结束

接下来,让我们生成DTMF音调

Fs = 8000;采样频率8千赫N = 800;% 100毫秒的音调t = (0:N-1)/Fs;800个样品在FsPit = 2*pi*t;tone = 0 (N,size(f,2));toneChoice = 1:12%生成音调音调(:,toneChoice) =总和(罪(f (:, toneChoice) *坑))';结束按数字“1”的音进行测试刺激。Userstim = tones(:,1);generatehdl (lpFilter“名字”“fullyparallel”...“GenerateHDLTestbench”“上”...“TestBenchUserStimulus”userstim,...“开发”硬件描述语言(VHDL)的...“TargetDirectory”workingdir,...“InputDataType”, nt_in);
生成:/tmp/Bdoc22b_2134332_443265/tpea1dd60f_f971_4608_89de_43582dec35d3/完全并行。vhd ###开始生成完全并行的VHDL实体###开始生成完全并行的VHDL架构###成功完成VHDL代码生成过程的过滤器:完全并行### HDL延迟是2个样本### VHDL测试台的开始生成。###已生成输入刺激;长度为800个样品。
警告:检测到溢出自动换行。这源于“离散fir”建议操作:•从此源抑制此诊断的未来实例。——抑制
生成测试台:/tmp/Bdoc22b_2134332_443265/tpea1dd60f_f971_4608_89de_43582dec35d3/fullyparallel_tb。创建刺激向量…###完成生成VHDL测试平台。

关于串行体系结构的信息

串行体系结构提供了多种共享硬件资源的方法,代价是相对于采样率增加时钟速率。在FIR滤波器中,我们将在每个串行分区的输入之间共享乘数。这将有一个增加时钟速率的因素称为折叠因素的影响。

您可以使用hdlfilterserialinfo函数根据系数值获取有关各种过滤器长度的信息。这个函数还显示了一个详细的选项表,其中包含了指定SerialPartition属性的可能选项,以及相应的折叠因子和乘数的值。

hdlfilterserialinfo (lpFilter“InputDataType”, nt_in);
| 0 | |总系数A / Symm |有效  | --------------------------------------------------- | 156 | 0 | 78 | 78 |有效的滤波器长度SerialPartition值是78。表的'SerialPartition'值与相应的值的折叠因子和乘数为给定的过滤器。| |折叠因素乘数| SerialPartition  | ------------------------------------------------------ | 1 | 78 |的(78)| | 2 | 39 |的(39)* 2 | | 3 | | 26日的(26)* 3 | | 4 | 20 |[(19)* 4,2]| | 5 | 16 |[(15)* 5,3]| | 6 | 13(13)* 6 | |的| 7 | 12 |[(11)* 7,1]| | 8 | 10 |((9)* 8,6]| | 9 | 9 |[9 9 9 9 9 9 9 9 6]| | 10 | 8 |((7)* 10、8)| | | 8 | 11 [(7)* 11,1]| | 12 | 7 | [(1,6)* 12,6] | | | 6 | 13(13 13 13 13 13 13) | | | 6 | 14(14 14十四14 14 8)| | 15 | 6 |[15个15个15个15个15个3]| | 16 | 5 |(16 16 16 14)| | 17 | 5 |(17 17 17 17 10)| | | 5 | 18[18 18 18 18 6]| | 19 | 5 |[19日19日19日19日2]| | 20 | 4 |(20 20 20 18)| | | 4 | 21日(21日21日21日15)| | | 4 | 22日(22 22 22 12)| | | 4 | 23日(23日23 23 9)| | | 4 | 24日(24日24 24 6)| | | 4 | 25[25 25 25 3]| | | 3 | 26日(26日26日26日)| | | 3 | 27日(27日27日24)| | | 3 | 28日(28日28日22)| | | 3 | 29日(29日29日20)| | | 3 | 30(30 30 18)| | | 3 |[31日31日31日16] | | 32 | 3 | (32 32 14) | | | 3 | 33 [33 33 12] | | 34 | 3 | 10 [34] | | 35 | 3 | 35 8 [35] | | 36 | 3 | (36 36 6) | | | 3 | 37 [37 37 4] | | 38 | 3 | [38 38 2] | | 39 | 2 | [39 39] | | 40 | 2 | 40 [38] | | 41 | 2 | (41 37) | | | 2 | 42 (42 36) | | | 2 | 43 (43 35) | | 44 | 2 | (44 34) | | 45 | 2 | 33 [45] | | 46 | 2 | (46 32) | | | 2 | 47 (47 31) | | 48 | 2 | (48 30) | | | 2 | 49 (49 29) | | 50 | 2 | 50 [28] | | 51 | 2 | 27 [51] | | | 2 | 52 [52 26] | | 53 | 2 | 25 [53] | | 54 | 2 | (54 24) | | | 2 | 55 55 (23)| | 56 | 2 |[56 22] | | 57 | 2 |[57 21] | | 58 | 2 |[58 20] | | 59 | 2 |[59 19] | | 60 | 2 |[60 18] | | 61 | 2 |[61 17] | | 62 | 2 |[62 16] | | 63 | 2 |[63 15] | | 64 | 2 |[64 14] | | 65 | 2 |[65 13] | | 66 | 2 |[66 12] | | 67 | 2 |[67 11] | | 68 | 2 |[68 10] | | 69 | 2 |[69 9] | | 70 | 2 |[70 8] | | 71 | 2 |[71 7] | | 72 | 2 |[72 6] | | 73 | 2 |[73 5] | | 74 | 2 |[74 4] | | 75 | 2 |[75 3] | | 76 | 2 |[76 2] | | 77 | 2 |[77 1] | | 78 | 1 |[78] |

您可以使用可选属性“乘数”而且“FoldingFactor”显示指定的信息。

hdlfilterserialinfo (lpFilter“乘数”4...“InputDataType”, nt_in);
串行分区:[20 20 20 18],折叠系数:20,乘数:4
hdlfilterserialinfo (lpFilter“Foldingfactor”6...“InputDataType”, nt_in);
串行分区:ones(1,13)*6,折叠因子:6,乘数:13

全串行架构

在全串行架构中,每个水龙头都没有一个专用的乘法器,而是连续选择每个水龙头的输入样本,并与相应的系数相乘。对于对称(和反对称)结构,对应于每组对称抽头的输入样本在与相应系数相乘之前被预先添加(对称)或预先减去(反对称)。产品使用寄存器按顺序累积,最终结果在下一组输入样本到达之前存储在寄存器中。这个实现需要一个时钟速率,它要比要计算的产品数量的输入采样速率快很多倍。下载188bet金宝搏这减少了所需的芯片面积,因为实现只涉及一个乘法器和一些额外的逻辑元素,如多路复用器和寄存器。时钟速率将是输入采样率(78的折叠因子)的78倍,在本例中等于3.4398 MHz。

要实现完全的串行体系结构,请使用hdlfilterserialinfo函数,并设置“乘数”属性为1。您还可以设置“SerialPartition”属性等于有效过滤器长度,在本例中为78。该函数还返回用于该串行分区设置的折叠因子和乘法器数量。

[part, foldingfact, nMults] = hdfilterserialinfo (lpFilter,“乘数”, 1...“InputDataType”, nt_in);% #好< ASGLU >generatehdl (lpFilter“名字”“fullyserial”...“SerialPartition”脱离,...“开发”硬件描述语言(VHDL)的...“TargetDirectory”workingdir,...“InputDataType”, nt_in);
###生成:/tmp/Bdoc22b_2134332_443265/tpea1dd60f_f971_4608_89de_43582dec35d3/fullyserialvhd ###开始生成全串行VHDL实体###开始生成全串行VHDL架构###时钟速率是该架构输入采样率的78倍。###成功完成VHDL代码生成过程的过滤器:完全串行的### HDL延迟是3个样本

与完全并行的情况一样,以同样的方式生成测试平台。为每个体系结构实现再次生成测试平台是很重要的。

部分串行架构

完全并行和完全串行代表了两种极端的实现。虽然完全串行是非常低的面积,它本质上需要一个更快的时钟速率来运行。全并行占用很大的芯片面积,但性能非常好。在一定程度上,串行体系结构涵盖了介于这两个极端之间的所有情况。

输入开关被分成若干组。每个集合由一个由乘法累加和多路复用器组成的串行分区并行处理。在这里,一组串行分区处理一组给定的水龙头。这些串行分区彼此并行操作,但按顺序处理每个点,以积累与所服务的点对应的结果。最后,使用加法器将每个串行分区的结果加在一起。

资源约束的部分串行架构

让我们假设您想要在FPGA上实现该滤波器,该FPGA只有4个乘数滤波器可用。您可以使用4个串行分区实现过滤器,每个串行分区使用一个乘法累加电路。

hdlfilterserialinfo (lpFilter“乘数”4...“InputDataType”, nt_in);
串行分区:[20 20 20 18],折叠系数:20,乘数:4

这些串行分区处理的输入轻敲将是[20 20 20 18]。您将用这个向量指定SerialPartition,表示串行分区的水龙头分解。时钟速率由这个向量的最大元素决定。在这种情况下,时钟速率将是输入采样率的20倍,0.882 MHz。

[part, foldingfact, nMults] = hdfilterserialinfo (lpFilter,“乘数”4...“InputDataType”, nt_in);generatehdl (lpFilter“名字”“partlyserial1”...“SerialPartition”脱离,...“开发”硬件描述语言(VHDL)的...“TargetDirectory”workingdir,...“InputDataType”, nt_in);
生成:/tmp/Bdoc22b_2134332_443265/tpea1dd60f_f971_4608_89de_43582dec35d3/partlyserial1。vhd ###开始生成partlyserial1 VHDL实体###开始生成partlyserial1 VHDL架构###时钟速率是此架构输入采样率的20倍。###成功完成VHDL代码生成过程的过滤器:partlyserial1 ## HDL延迟是3个样本

速度约束的部分串行结构

假设您对滤波器实现的时钟频率有一个限制,并且最大时钟频率是2 MHz。这意味着时钟速率不能超过输入采样速率的45倍。对于这样的设计约束,请指定“SerialPartition”作为33 [45].请注意,这将导致额外的串行分区硬件,这意味着额外的电路将增加-累加33个开关。你可以指定'SerialPartition”财产的使用hdlfilterserialinfo以及它的性质“Foldingfactor”如下。

part = hdfilterserialinfo“Foldingfactor”45岁的...“InputDataType”, nt_in);generatehdl (lpFilter“名字”“partlyserial2”...“SerialPartition”脱离,...“开发”硬件描述语言(VHDL)的...“TargetDirectory”workingdir,...“InputDataType”, nt_in);
生成:/tmp/Bdoc22b_2134332_443265/tpea1dd60f_f971_4608_89de_43582dec35d3/partlyserial2。vhd ###开始生成partlyserial2 VHDL实体###开始生成partlyserial2 VHDL架构###时钟速率是此架构输入采样率的45倍。###成功完成VHDL代码生成过程的过滤器:partlyserial2 ## HDL延迟是3个样本

通常,您可以根据其他约束为串行分区指定任意的水龙头分解。唯一的要求是向量的元素之和应该等于有效过滤器长度。

Cascade-Serial架构

串行分区中的累加器可以重复使用,以添加下一个串行分区的结果。如果一个串行分区处理的点击数必须比它旁边的串行分区至少多1,这是可能的。这种技术的优点是删除了添加所有串行分区结果所需的一组加器。然而,这会使时钟速率增加1,因为需要一个额外的时钟周期来完成额外的累积步骤。

级联-串行体系结构可以使用该属性指定“ReuseAccum”.这可以通过两种方式实现。

添加“ReuseAccum”生成hdl方法并指定为“上”.注意,为指定的值“SerialPartition”属性必须使累加器重用是可行的。向量的元素必须降序排列,只有最后两个元素可以相同。

如果财产“SerialPartition”未指定,且“ReuseAccum”指定为“上”,串行分区的水龙头分解是内部确定的。这种分解最小化了时钟速率并重用了累加器逻辑。对于这个音频过滤器,串行分区为[12 11 10 9 8 7 6 5 4 3 3].注意,它使用11个串行分区,这意味着11个乘累加电路。时钟速率将是输入采样率的13倍,即573.3 kHz。

generatehdl (lpFilter“名字”“cascadeserial1”...“SerialPartition”, [45 33],...“ReuseAccum”“上”...“开发”硬件描述语言(VHDL)的...“TargetDirectory”workingdir,...“InputDataType”, nt_in);
生成:/tmp/Bdoc22b_2134332_443265/tpea1dd60f_f971_4608_89de_43582dec35d3/cascadeserial1。vhd ###开始生成cascadeserial1 VHDL实体###开始生成cascadeserial1 VHDL架构###时钟速率是此架构输入采样率的46倍。###成功完成VHDL代码生成过程的过滤器:cascadeserial1 ## HDL延迟是3个样本

最佳分解为尽可能多的串行分区所需的最小时钟速率,以重用累加器。

generatehdl (lpFilter“名字”“cascadeserial2”...“ReuseAccum”“上”...“开发”硬件描述语言(VHDL)的...“TargetDirectory”workingdir,...“InputDataType”, nt_in);
生成:/tmp/Bdoc22b_2134332_443265/tpea1dd60f_f971_4608_89de_43582dec35d3/cascadeserial2vhd ###开始生成cascadeserial2 VHDL实体###开始生成cascadeserial2 VHDL架构###时钟速率是此架构输入采样率的13倍。串行分区# 1有12个输入。串行分区# 2有11个输入。串行分区# 3有10个输入。串行分区# 4有9个输入。串行分区# 5有8个输入。串行分区# 6有7个输入。串行分区# 7有6个输入。串行分区# 8有5个输入。 ### Serial partition # 9 has 4 inputs. ### Serial partition # 10 has 3 inputs. ### Serial partition # 11 has 3 inputs. ### Successful completion of VHDL code generation process for filter: cascadeserial2 ### HDL latency is 3 samples

结论

您设计了一个低通直接形式对称FIR滤波器,以满足给定的规格。然后量化并检查您的设计。您为完全并行、完全串行、部分串行和级联串行体系结构生成了VHDL代码。您使用DTMF音调为其中一个架构生成了一个VHDL测试平台。

您可以使用HDL模拟器来验证为不同的串行体系结构生成的HDL代码。您可以使用综合工具来比较这些体系结构的面积和速度。您还可以试验和生成Verilog代码和测试工作台。