主要内容

FIR滤波器的HDL串行架构

该实施例说明如何生成HDL代码用于与用于音频滤波应用的低通滤波器充分平行,完全串行,部分地串行和级联串行构架对称FIR滤波器。

设计滤波器

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

fs = 44.1e3;%采样频率,单位为HzFpass = 8E3;以Hz%通频带频率FSTOP = 8.8e3;以Hz%阻带频率Apass = 1;%通带纹波以dB为单位ASTOP = 90;%阻带衰减,以dBfdes = fdesign.lowpass('Fp的,的Fst,鸭,AST'......Fpass,FSTOP,Apass,ASTOP,FS);lpFilter =设计(FDES,“等波纹”'filterstructure''dfsymfir'......'systemobject', 真的);

量化筛选

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

nt_in = numerictype(1,12,11);nt_out = nt_in;lpfilter.fullprecisionoverride = false;lpfilter.coefficientsDatatypate ='风俗';lpfilter.customcoefficientsdatatype = numerictype(1,16,16);lpfilter.outputdatatype ='风俗';lpFilter.CustomOutputDataType = nt_out;%请与fvtool响应。fvtool(lpfilter,'FS',FS,'算术''固定的');

图筛选筛选器可视化工具 - 幅度响应(DB)包含UIMEnu类型uitoolbar类型的轴和其他对象。具有标题幅度响应(DB)的轴包含3个类型的类型。这些对象表示滤波器#1:量化,过滤器#1:参考。

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

与正确地量化的滤波器开始,生成VHDL或Verilog代码。创建一个临时工作目录。生成HDL代码(在这种情况下选择VHDL)后,打开在编辑器生成的VHDL文件通过点击超链接在命令行显示的消息显示。

这是默认的情况下,并产生一个完全并行架构。存在用于直接形式FIR滤波器结构,一个用于在对称FIR结构的每两个对称的抽头每个滤波器抽头的专用乘法器。这导致了大量的芯片面积(78个乘法器,在这个例子)。您可以实现过滤器中的各种串行架构,以获得所需的速度/面积权衡。这些在本实施例中的进一步的部分示出。

工作目录= tempname;%完全平行(默认)generatehdl(lpfilter,'姓名''fullyparallel'......'目标语言''VHDL'......'targetdirectory中',工作目录,......'InputDataType',nt_in);
###启动VHDL代码过滤器的生成过程过滤器的VHDL代码生成过程:完全平行### HDL延迟是2个样本

从量化过滤器生成测试台

生成VHDL测试平台,以确保结果你看到MATLAB®准确的响应相匹配。所生成的VHDL代码和VHDL测试平台可以编译和使用模拟器模拟。

生成DTMF音调用作过滤器的测试刺激。DTMF信号由两个正弦波或音调的总和组成 - 从两个相互排斥的群体中取出频率。每对音调含有低组(697Hz,770 Hz,852Hz,941 Hz)的一个频率,以及高组的一个频率(1209Hz,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 (12);为了C = 1:4为了R = 1:3 F(:,3 *(C-1)+ R)= [LFG(C);HFG(R)];结尾结尾

接下来,让我们产生DTMF音频

Fs = 8000;%采样频率8kHz的N = 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''在'......'testbenchusertumulus',userstim,......'目标语言''VHDL'......'targetdirectory中',工作目录,......'InputDataType',nt_in);
###启动VHDL代码过滤器的生成过程过滤器的VHDL代码生成过程:完全平行### HDL延迟是2个样本### Starting generation of VHDL Test Bench. ### Generating input stimulus ### Done generating input stimulus; length 800 samples.
警告:裹在溢出检测。这源于“DiscreteFir”建议采取的措施:•从这个来源诊断的这个禁止未来实例。- 禁止
###生成测试台:/tmp/bdoc21a_1606923_129767/tp1b97351c_d53e_4ac4_883e_2d66229bb3fc/flyperallel_tb.vhd ###创建刺激向量... ###完成生成VHDL测试台。

关于串行架构的信息

串行构架呈现各种不同的方式在相对于增加时钟速率的采样速率为代价来共享硬件资源。在FIR滤波器,我们将分享每个串行分区的输入之间的乘数。这将具有由被称为折叠因子的因子增加时钟速率的效果。

您可以使用hdlfilterserialinfo函数获取关于基于系数的值不同滤波器长度的信息。该功能还显示可能的选项的穷举表与相应的折叠倍数和乘法器的数目的值来指定SerialPartition属性。

hdlfilterserialinfo(lpFilter,'InputDataType',nt_in);
|总系数|零|A / SYMM |有效的-----------------------------------------------------------------  |156 |0 |78 |78 | Effective filter length for SerialPartition value is 78. Table of 'SerialPartition' values with corresponding values of folding factor and number of multipliers for the given filter. | Folding Factor | Multipliers | SerialPartition | ------------------------------------------------------ | 1 | 78 |ones(1,78) | | 2 | 39 |ones(1,39)*2 | | 3 | 26 |ones(1,26)*3 | | 4 | 20 |[ones(1,19)*4, 2] | | 5 | 16 |[ones(1,15)*5, 3] | | 6 | 13 |ones(1,13)*6 | | 7 | 12 |[ones(1,11)*7, 1] | | 8 | 10 |[ones(1,9)*8, 6] | | 9 | 9 |[9 9 9 9 9 9 9 9 6] | | 10 | 8 |[ones(1,7)*10, 8] | | 11 | 8 |[ones(1,7)*11, 1] | | 12 | 7 |[ones(1,6)*12, 6] | | 13 | 6 |[13 13 13 13 13 13] | | 14 | 6 |[14 14 14 14 14 8] | | 15 | 6 |[15 15 15 15 15 3] | | 16 | 5 |[16 16 16 16 14] | | 17 | 5 |[17 17 17 17 10] | | 18 | 5 |[18 18 18 18 6] | | 19 | 5 |[19 19 19 19 2] | | 20 | 4 |[20 20 20 18] | | 21 | 4 |[21 21 21 15] | | 22 | 4 |[22 22 22 12] | | 23 | 4 |[23 23 23 9] | | 24 | 4 |[24 24 24 6] | | 25 | 4 |[25 25 25 3] | | 26 | 3 |[26 26 26] | | 27 | 3 |[27 27 24] | | 28 | 3 |[28 28 22] | | 29 | 3 |[29 29 20] | | 30 | 3 |[30 30 18] | | 31 | 3 |[31 31 16] | | 32 | 3 |[32 32 14] | | 33 | 3 |[33 33 12] | | 34 | 3 |[34 34 10] | | 35 | 3 |[35 35 8] | | 36 | 3 |[36 36 6] | | 37 | 3 |[37 37 4] | | 38 | 3 |[38 38 2] | | 39 | 2 |[39 39] | | 40 | 2 |[40 38] | | 41 | 2 |[41 37] | | 42 | 2 |[42 36] | | 43 | 2 |[43 35] | | 44 | 2 |[44 34] | | 45 | 2 |[45 33] | | 46 | 2 |[46 32] | | 47 | 2 |[47 31] | | 48 | 2 |[48 30] | | 49 | 2 |[49 29] | | 50 | 2 |[50 28] | | 51 | 2 |[51 27] | | 52 | 2 |[52 26] | | 53 | 2 |[53 25] | | 54 | 2 |[54 24] | | 55 | 2 |[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);
串行分区:酮(1,13)* 6,折叠倍数:6,乘法器:13

全Serial架构

在完全串行架构中,代替每个抽头的专用乘法器,串联选择每个抽头的输入样本,并乘以相应的系数。对于对称(和反对称)结构,对应于每组对称抽头的输入样本是预先乘以对应系数之前的(对于对称的)或预先减去(用于反对称的)。使用寄存器顺序累计产品,并且在下一组输入样本到达之前,最终结果存储在寄存器中。此实现需要时钟速率比输入采样率快多倍,因为要计算的产品数量。下载188bet金宝搏这导致减少所需的芯片区域,因为实现涉及一个乘法器,其中包括多路复用器和寄存器等少数附加逻辑元素。对于此示例,时钟速率将是输入采样率(折叠性能仪78)等于3.4398 MHz的78倍。

要实现完全串行架构,使用hdlfilterserialinfo功能,并设置其“乘数”属性设置为1,您还可以设置其值“SerialPartition”属性等于有效滤波器长度,在这种情况下是78.函数也返回折叠倍数和用于该串行分区设置乘法器的数目。

[spart,foldingfact,nmults] = hdlfilterserialinfo(lpfilter,“乘”,1,......'InputDataType',nt_in);%#确定generatehdl(lpfilter,'姓名''fullyserial'......'SerialPartition',SPART,......'目标语言''VHDL'......'targetdirectory中',工作目录,......'InputDataType',nt_in);
###启动vhdl代码生成过程for filter:完全单独的###生成:/tmp/bdoc21a_1606923_129767/tp1b97351c_d53e_4ac4_883_2d66229bb3fc/flulyserial.vhd ###开始生成全体vhdl实体###开始生成全体vhdl架构###时钟速率该架构的输入采样率为78倍。###成功完成筛选器的VHDL代码生成过程:完全单体### HDL延迟是3个样本

生成的测试平台以同样的方式,在完全平行的情况下。重要的是要再次对每个架构实现生成一个测试平台。

天色Serial架构

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

输入抽头被划分成组。每一组并行通过由乘法累加和多路复用器的一个串行分区处理。在这里,一组串行分区处理一组给定的抽头。这些串行分区并行操作相对于彼此而是顺序处理每个抽头积累对应于所服务的抽头的结果。最后,每个串行分区的结果加到一起使用加法器。

天色Serial架构的资源约束

让我们假设您希望在FPGA上实现此过滤器,该过滤器仅为过滤器提供4个乘法器。您可以使用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',SPART,......'目标语言''VHDL'......'targetdirectory中',工作目录,......'InputDataType',nt_in);
###启动vhdl代码生成过程for filter:partlyserial1 ###生成:/tmp/bdoc21a_1606923_129767/tp1b97351c_d53e_4ac4_883_2d66229bb3fc/2d66229bb3fc/2d66229bb3fc/partlyserial1.vhd ###开始生成Partlyserial1 VHDL实体###开始生成PartySerial1 VHDL架构###时钟速率是此架构的输入采样率的20倍。###成功完成筛选器的VHDL代码生成过程:PartlySerial1 ### HDL延迟是3个样本

天色Serial架构的速度限制

假设你有时钟速率为滤波器的实现,最大时钟频率的约束是2兆赫。这意味着时钟速率不能超过45倍输入采样率。对于这样的设计约束,则“SerialPartition”应与[45 33]来指定。注意,这导致一个附加的串行分区硬件,这意味着附加电路以乘法 - 累积33个抽头。您可以使用hdlfilterserialinfo及其财产“Foldingfactor”如下指定SerialPartition。

SPART = hdlfilterserialinfo(lpFilter,'Foldingfactor'45,......'InputDataType',nt_in);generatehdl(lpfilter,'姓名''partlyserial2'......'SerialPartition',SPART,......'目标语言''VHDL'......'targetdirectory中',工作目录,......'InputDataType',nt_in);
###启动vhdl码生成过程for filter:partlyserial2 ###生成:/tmp/bdoc21a_1606923_129767/tp1b97351c_d53e_4ac4_883_2d66229bb3fc/2d66229bb3fc/2d66229bb3fc/2d66229bb3fc/partlyserial2.vhd ###开始生成PartlySerial2 VHDL实体###开始生成PartySerial2 VHDL架构###时钟速率该架构的输入采样率为45倍。###成功完成过滤器的VHDL代码生成过程:PartlySerial2 ### HDL延迟是3个样本

在一般情况下,你可以指定水龙头取决于其他约束的串行分区的任意分解。唯一的要求是,所述向量的元素的总和应等于有效过滤长度。

级联Serial架构

在串行分区累加器可以被重新用于添加下一个串行分区的结果。这是可能的,如果通过一个串行分区正在处理抽头的数量必须至少为1。该技术的优点是,组加法器的需要添加所有串行分区的结果超过由串行分区旁边被删除。然而,这增加1时钟速率,因为需要附加的时钟周期,以完成额外的累积步骤。

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

“ReuseAccum”添加到generatehdl方法并将其指定为“开”。请注意,关于“SerialPartition”属性指定的值必须是使得蓄能器再利用是可行的。该向量的元素必须在除了最后两个可相同降序排列。

如果未指定的属性“SerialPartition”和“ReuseAccum”被指定为“开”,抽头用于串行分区分解是内部确定。这样做是为了尽量减少时钟速率和重用累加器。对于该音频滤波器,它是[12 11 10 9 8 7 6 5 4 3 3]。注意,它使用11周系列的分区,这意味着11条乘法累加电路。时钟速率将是输入抽样率,573.3千赫13倍。

generatehdl(lpfilter,'姓名''cascadeserial1'......'SerialPartition'[45 33],......'ReuseAccum''在'......'目标语言''VHDL'......'targetdirectory中',工作目录,......'InputDataType',nt_in);
###开始VHDL代码生成过程为过滤器:cascadeserial1 ###生成:/tmp/Bdoc21a_1606923_129767/tp1b97351c_d53e_4ac4_883e_2d66229bb3fc/cascadeserial1.vhd ###开始生成cascadeserial1 VHDL实体###开始生成cascadeserial1 VHDL架构的###时钟速率是46倍于这个架构的输入采样率。VHDL码生成过程的过滤器###成功完成:cascadeserial1 ### HDL等待时间为3个样品

最佳分解成作为所需的最小时钟速率可能用于重用累加器许多串行分区。

generatehdl(lpfilter,'姓名''cascadeserial2'......'ReuseAccum''在'......'目标语言''VHDL'......'targetdirectory中',工作目录,......'InputDataType',nt_in);
### /tmp/Bdoc21a_1606923_129767/tp1b97351c_d53e_4ac4_883e_2d66229bb3fc/cascadeserial2. /tmp/Bdoc21a_1606923_129767/tp1b97351c_d53e_4ac4_883e_2d66229bb3fc开始生成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代码和测试台。