对于FIR滤波器HDL串行架构

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

设计滤波器

使用44.1 kHz的音频采样率和8.0 kHz的通带边缘频率。将允许的峰对峰通带纹波设置为1 dB,阻带衰减设置为-90 dB。然后,使用fdesign设计滤波器。低通,并创建FIR滤波器系统对象使用'等波纹'方法与'直接形式对称'的结构。

Fs = 44.1 e3;%采样频率,单位为Hz成就= 8 e3;通带频率,单位为HzFstop = 8.8 e3;停止频带频率,单位是Hzapas = 1;dB的通带纹波Astop = 90;%阻带衰减,单位为dBFDES = fdesign.lowpass(“Fp,置,美联社,Ast”,Fpass, Fstop, Apass, Astop, Fs);lpFilter =设计(fd,“equiripple”,'FilterStructure',“dfsymfir”,'SYSTEMOBJECT',真正的);

数字转换过滤器

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

nt_in = numerictype(1,12,11);nt_out = nt_in;lpFilter.FullPrecisionOverride = FALSE;lpFilter.CoefficientsDataType =“自定义”;lpFilter。CustomCoefficientsDataType = numerictype(16) 1, 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/Bdoc20a_1326390_11805/tp5f3d67f1_9504_4109_b690_e669a601daae/fullyparallel。成功完成了过滤器的VHDL代码生成过程:完全并行的HDL延时是2个例子

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

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

产生DTMF音被用作测试刺激的过滤器。的DTMF信号由两个正弦曲线之和的 - 或音调 - 与来自两个相互排斥的基团取频率。每对音调的含有低组(697赫兹,770赫兹,852赫兹,941赫兹)和高组(1209赫兹,1336赫兹,1477Hz)的一个频率中的一个频率和代表一个唯一的符号。你会生成它们的测试激励所有的DTMF信号,但使用一个(数字1在这里)。这将让测试刺激的长度合理的限制。

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

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

Fs = 8000;%采样频率8khzN = 800;%音调100毫秒t = (0: n - 1) / Fs;% 800个样品在Fs坑= 2 *π* t;音调= 0 (N,大小(f, 2));对于toneChoice = 1:12%生成的语气音调(:,toneChoice) =总和(罪(f (:, toneChoice) *坑))';结束%以用于数字“1”的音测试刺激。userstim =音调(:1);generatehdl(lpFilter,“名字”,“fullyparallel”,“GenerateHDLTestbench”,'上',“TestBenchUserStimulus”userstim,'目标语言',硬件描述语言(VHDL)的,“TargetDirectory”workingdir,“InputDataType”,nt_in);
生成:/tmp/Bdoc20a_1326390_11805/tp5f3d67f1_9504_4109_b690_e669a601daae/fullyparallel。成功的完成了针对过滤器的VHDL代码生成过程:完全并行的HDL延时是2个样本的VHDL启动生成测试台。生成输入刺激完成生成输入刺激;800个样本长度。
警告:检测到溢出时换行。这源自于“离散化”建议的操作:•从这个来源禁用该诊断的未来实例。——抑制
###生成测试平台:/tmp/Bdoc20a_1326390_11805/tp5f3d67f1_9504_4109_b690_e669a601daae/fullyparallel_tb。创造刺激载体…完成VHDL测试台的生成。

关于串行架构的信息

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

可以使用hdlfilterserialinfo函数根据系数的值来获取关于不同过滤器长度的信息。此函数还显示一个包含可能选项的详尽表,用于指定具有相应的折叠因子值和乘数数的SerialPartition属性。

hdlfilterserialinfo (lpFilter“InputDataType”,nt_in);
| 0 | |总系数A / Symm有效| | - | 156 | 0 | 78 | 78 |有效的滤波器长度SerialPartition值是78。对于给定的滤波器,“串行分区”值与相应的折叠因子值和乘数数的表。| |折叠因素乘数| 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] |

您可以使用可选属性“乘数”和“折叠因子”来显示特定的信息。

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

完全串行架构

在充分的串行结构,而不是具有用于每个抽头的专用乘法器,对于每个抽头的输入样本串联选择并且被乘以相应的系数。对称(和非对称)结构对应于每个组对称抽头的输入样本preadded(为对称的)或与相应的系数相乘之前被预减去(用于防对称)。将产物依次积累使用寄存器和最后的结果将存储在寄存器的下一个输入样本集的到达之前。此实现需要一个时钟速率是快很多倍输入采样率进行计算的产品数量。s manbetx 845这导致减小了所需的芯片面积作为实现只涉及一个带有一些额外的逻辑元件等多路复用器和寄存器的乘数。时钟速率将是78倍输入采样率(78 foldingfactor)等于3.4398兆赫的这个例子。

要实现完整的串行架构,可以使用hdlfilterserialinfo函数并将其“乘数”属性设置为1。您还可以设置'SerialPartition'属性,使其值等于有效筛选器长度,在本例中为78。该函数还返回用于该串行分区设置的折叠因子和乘数数。

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

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

部分串行架构

完全并行和完全串行表示实现的两个极端。虽然完全串行是非常低的区域,它内在地需要一个更快的时钟率来操作。全并行占用了大量芯片面积,但性能非常好。部分串行架构涵盖了介于这两个极端之间的所有情况。

输入丝锥被分成若干组。每个集合由由多重累加和多路复用器组成的串行分区并行处理。在这里,一组串行分区处理一组给定的线程。这些串行分区相互并行操作,但按顺序处理每个tap,以积累与所服务的tap对应的结果。最后,使用加法器将每个串行分区的结果相加。

部分串行架构,资源约束

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

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

由这些串行分区处理的输入点击将是[20 20 20 18]。您将使用该向量指定SerialPartition,该向量指示连续分区的点击分解。时钟速率是由这个矢量的最大元素决定的。在本例中,时钟速率将是输入采样速率的20倍,即0.882 MHz。

[SPART,foldingfact,nMults] = hdlfilterserialinfo(lpFilter,“乘数”4“InputDataType”,nt_in);generatehdl(lpFilter,“名字”,“partlyserial1”,“SerialPartition”脱离,'目标语言',硬件描述语言(VHDL)的,“TargetDirectory”workingdir,“InputDataType”,nt_in);
生成:/tmp/Bdoc20a_1326390_11805/tp5f3d67f1_9504_4109_b690_e669a601daae/partlyserial1。部分串行VHDL实体的开始生成部分串行VHDL体系结构的开始生成时钟速率是该体系结构输入采样速率的20倍。成功完成过滤器的VHDL代码生成过程:partlyserial1 HDL延时是3个样本

部分串行架构为速度约束

假设您对滤波器实现的时钟频率有一个约束,并且最大时钟频率是2mhz。这意味着时钟速率不能超过输入采样速率的45倍。对于这样的设计约束,“SerialPartition”应该用[45 33]来指定。注意,这会导致一个额外的串行分区硬件,这意味着要增加33个插孔的额外电路。可以使用hdlfilterserialinfo及其属性'Foldingfactor'指定SerialPartition,如下所示。

脱离= hdlfilterserialinfo (lpFilter,“Foldingfactor”45岁的“InputDataType”,nt_in);generatehdl(lpFilter,“名字”,“partlyserial2”,“SerialPartition”脱离,'目标语言',硬件描述语言(VHDL)的,“TargetDirectory”workingdir,“InputDataType”,nt_in);
生成:/tmp/Bdoc20a_1326390_11805/tp5f3d67f1_9504_4109_b690_e669a601daae/partlyserial2。部分串行的VHDL实体的开始生成时钟速率是这个架构的输入采样速率的45倍。成功完成过滤器的VHDL代码生成过程:partlyserial2 HDL延时是3个样本

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

Cascade-Serial架构

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

级联-串行架构可以使用属性“ReuseAccum”来指定。这可以通过两种方式实现。

将'ReuseAccum'添加到generatehdl方法并指定为'on'。注意,为“SerialPartition”属性指定的值必须保证累加器重用是可行的。向量的元素必须按降序排列,最后两个元素可以是相同的。

如果属性“SerialPartition”未指定,而“ReuseAccum”指定为“on”,则串行分区的水龙头分解将在内部确定。这样做是为了最小化时钟速率和重用累加器。对于这个音频过滤器,它是[12 11 10 9 8 7 6 5 4 3 3]。注意,它使用了11个串行分区,这意味着11个乘法累积电路。时钟速率将是输入采样速率的13倍,573.3 kHz。

generatehdl(lpFilter,“名字”,'cascadeserial1',“SerialPartition”33 [45],“ReuseAccum”,'上','目标语言',硬件描述语言(VHDL)的,“TargetDirectory”workingdir,“InputDataType”,nt_in);
生成:/tmp/Bdoc20a_1326390_11805/tp5f3d67f1_9504_4109_b690_e669a601daae/cascadeserial1。开始生成的cascadeserial1 VHDL实体开始生成的VHDL体系结构时钟速率是这个体系结构输入采样速率的46倍。成功完成过滤器的VHDL代码生成过程:cascadeserial1 ### HDL延时是3个示例

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

generatehdl(lpFilter,“名字”,'cascadeserial2',“ReuseAccum”,'上','目标语言',硬件描述语言(VHDL)的,“TargetDirectory”workingdir,“InputDataType”,nt_in);
生成:/tmp/Bdoc20a_1326390_11805/tp5f3d67f1_9504_4109_b690_e669a601daae/cascadeserial2。开始生成的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代码和测试工作台。