FPGA数字下转换器的实现
本示例展示了如何为LTE等无线电通信应用程序设计数字下转换器(DDC),并生成HDL代码。
简介
ddc广泛应用于数字通信接收机中,用于将射频(RF)或中频(IF)信号转换为基带。DDC操作将信号移到较低的频率并降低其采样率以方便后续处理阶段。本例中的DDC执行复杂频率转换,然后使用四级滤波器链进行采样率转换。本例首先使用浮点形式的DSP System Toolbox™函数设计DDC。然后,每个阶段都转换为定点,并用于生成可合成HDL代码的Simulink®模型中。本例使用这两个测试信号来演示和验证DDC操作:
一种调制到32兆赫中频载波上的正弦信号。
一种带宽为1.4 MHz的LTE下行信号,调制到32 MHz中频载波上。
该示例比较了浮点DDC输出端的信号质量与定点DDC输出端的信号质量。
最后,给出了fpga滤波器链的实现实例,并给出了综合结果。
这个例子使用了DDCTestUtils
,一个助手类,它包含生成刺激和分析DDC输出的函数。有关更多信息,请参见DDCTestUtils.m
文件。
监护系统结构
DDC由一个数控振荡器(NCO)、混频器和抽取滤波器链组成。该滤波器链由一个级联积分器梳状(CIC)抽取器、CIC增益校正、CIC补偿抽取器(FIR)、半带FIR抽取器和最终FIR抽取器组成。
该滤波器链的整体响应相当于相同规格的单个抽取滤波器的响应。但是,将滤波器分割为多个抽取阶段可以产生使用更少硬件资源的更有效的设计。
CIC抽取器提供了一个较大的初始抽取因子,这使得后续过滤器能够以较低的速率工作。CIC补偿decimator通过补偿CIC下垂来改善光谱响应,同时抽取两个。半波段是一个中间十进制,最终十进制实现精确成就
而且Fstop
DDC的特性。链末端较低的采样率意味着后面的滤波器可以通过共享乘法器来优化资源使用。
该图显示了DDC的框图。
DDC的输入采样率为122.88 Msps,输出采样率为1.92 Msps。这些比率使总体的抽离率为64。LTE接收器使用1.92 Msps作为典型的采样率进行单元搜索和主信息块(MIB)恢复。DDC滤波器专为这种应用而设计。DDC优化后的时钟频率为122.88 MHz。
监护系统设计
本节解释如何在MATLAB®中使用浮点运算和滤波器设计函数设计DDC。
监护系统参数
本例设计了DDC滤波器特性,以满足给定输入采样率和载波频率的这些规格。
FsIn = 122.88e6;% DDC输入采样率FsOut = 1.92e6;% DDC输出采样率Fc = 32e6;%载频Fpass = 540e3;%通频带频率,相当于36x15kHz LTE子载波Fstop = 700e3;%阻带频率Ap = 0.1;%通带波纹Ast = 60;阻带衰减%
中投杀害多人者
第一个过滤阶段是CIC抽取器,因为它能够有效地实现较大的抽取因子。CIC过滤器的响应类似于级联移动平均过滤器,但CIC过滤器不使用乘法或除法。因此,CIC滤波器具有较大的直流增益。
cicParams。DecimationFactor = 8;cicParams。differaldelay = 1;cicParams。NumSections = 3;cicParams。FsOut = FsIn/cicParams.DecimationFactor;cicFilt = dsp.CICDecimator(cicParams.DecimationFactor,...cicParams.DifferentialDelay cicParams.NumSections)% #好< * NOPTS >cicGain = gain(cicFilt)
cicFilt = dsp。CICDecimator with properties: DecimationFactor: 8 differaldelay: 1 NumSections: 3 FixedPointDataType: 'Full precision' cicGain = 512
由于CIC增益是2的幂,硬件实现可以通过使用移位操作轻松地修正增益因子。为了分析目的,该示例代表了在MATLAB中一键校正增益dsp。FIRFilter
系统对象™。
cicGainCorr = dsp。FIRFilter (“分子”1 / cicGain)
cicGainCorr = dsp。FIRFilterwith properties: Structure: 'Direct form' NumeratorSource: 'Property' Numerator: 0.0020 InitialConditions: 0 Use get to show all properties
显示CIC滤波器的幅度响应,使用和没有增益校正fvtool
.为了进行分析,将CIC滤波器和增益校正滤波器组合成一个dsp。FilterCascade
系统对象。CIC滤波器内部使用定点算法,所以fvtool
绘制量化和非量化的响应。
ddcPlots。cicDecim = fvtool(...cicFilt,...dsp.FilterCascade (cicFilt cicGainCorr),...“Fs”,国际,国际);传奇(ddcPlots.cicDecim...“中投没有修正”,...“中投公司收益修正”);
CIC下垂补偿滤波器
由于CIC滤波器的震级响应具有显著性下垂在通带区域内,该示例使用基于fir的下垂补偿滤波器来平坦通带响应。下垂补偿器具有与CIC十进制器相同的特性。这个滤波器实现了2倍的抽取,因此还必须为滤波器指定带宽限制特性。使用设计
函数返回具有指定特征的过滤器系统对象。
compParams。R = 2;CIC薪酬抽取因子compParams。成就= Fstop;CIC补偿通带频率compParams。FsOut = cicParams.FsOut/compParams.R;新采样率compParams。Fstop= compParams.FsOut - Fstop;CIC补偿阻带频率compParams。Ap = Ap;%与整体滤波器相同的通带纹波compParams。Ast = Ast;%阻带衰减与整体滤波器相同compSpec = fdesign.decimator(compParams.R,“ciccomp”,...cicParams。DifferentialDelay,...cicParams。NumSections,...cicParams。DecimationFactor,...“Fp,置,美联社,Ast”,...compParams.Fpass、compParams.Fstop compParams.Ap compParams.Ast,...cicParams.FsOut);compFilt =设计(compSpec,“SystemObject”,真正的)
compFilt = dsp。FIRDecimator与属性:主要DecimationFactor: 2分子来源:'Property'分子:[-0.0398 -0.0126 0.2901 0.5258 0.2901 -0.0126 -0.0398]结构:'直接形式'使用get显示所有属性
绘制CIC滤波器(带增益校正)和下垂补偿的组合响应。
ddcPlots。cicComp = fvtool(...dsp.FilterCascade (cicFilt cicGainCorr compFilt),...“Fs”傅氏国际,“传奇”,“关闭”);
Halfband杀害多人者
半带滤波器提供了有效的抽取。半带滤波器是有效的,因为大约一半的系数等于零,这些乘法器被排除在硬件实现之外。
hbParams。FsOut = compParams.FsOut/2;hbParams。TransitionWidth = hbParams。FsOut - 2*Fstop;hbParams。StopbandAttenuation = Ast;hbSpec = fdesign.decimator(2,“halfband”,...“Tw, Ast”,...hbParams。TransitionWidth,...hbParams。StopbandAttenuation,...compParams.FsOut);hbFilt =设计(hbSpec“SystemObject”,真正的)
hbFilt = dsp。FIRDecimator与属性:主要DecimationFactor: 2 NumeratorSource: 'Property'分子:[0.0089 0 -0.0565 0 0.2977 0.5000 0.2977 0 -0.0565…结构:“直接形式”使用get显示所有属性
绘制DDC到半带滤波器输出的响应图。
ddcPlots。halfbandFIR = fvtool(...dsp.FilterCascade (cicFilt cicGainCorr、compFilt hbFilt),...“Fs”傅氏国际,“传奇”,“关闭”);
最终FIR抽取器
最后的FIR实现了DDC详细的通带和阻带特性。该滤波器比早期的FIR滤波器有更多的系数,但由于它以较低的采样率工作,它可以使用资源共享来实现高效的硬件实现。
在阻带衰减中增加3db的净空,使定点量化后的DDC仍然满足规范。这个价值是在实践中发现的fvtool
.
finalSpec = fdesign.decimator(低通滤波器的,...“Fp,置,美联社,Ast”成就,Fstop,美联社,Ast + 3, hbParams.FsOut);finalFilt =设计“equiripple”,“SystemObject”,真正的)
finalFilt = dsp。FIRDecimator与属性:主要DecimationFactor: 2 NumeratorSource: 'Property'分子:[9.3365e-04 0.0013 9.3466e-04 -5.3189e-04 -0.0022…结构:“直接形式”使用get显示所有属性
可视化DDC的总体震级响应。
ddcFilterChain = dsp.FilterCascade(cicFilt,cicGainCorr,compFilt,hbFilt,finalFilt);ddcPlots。overallResponse = fvtool(ddcFilterChain,“Fs”傅氏国际,“传奇”,“关闭”);
定点转换
浮点DDC滤波器链的频率响应现在满足规范。接下来,量化每个过滤阶段,使用定点类型,并分析它们,以确认过滤器链仍然满足规范。
过滤器量子化
本例使用16位系数,足以满足规范要求。使用小于18位的系数可以最大限度地减少FPGA实现所需的DSP块的数量。DDC过滤器链的输入是16位数据,其中有15个小数位。滤波器输出为18位值,在中间信号中提供额外的净空和精度。
对于CIC十进制数,选择“最小节字长度”
定点数据类型选项根据输出字长和其他CIC参数自动优化内部字长。
cicFilt。FixedPointDataType =“最小节字长度”;cicFilt。OutputWordLength = 18;
配置增益校正和基于fir的系统对象的定点属性。对象使用默认值RoundingMethod
而且OverflowAction
物业价值(“地板”
而且“包装”
分别)。
% CIC增益修正cicGainCorr。FullPrecisionOverride = false;cicGainCorr。CoefficientsDataType =“自定义”;cicGainCorr。customcoefficients sdatatype = numerictype(fi(cicGainCorr.Numerator,1,16));cicGainCorr。OutputDataType =“自定义”;cicGainCorr。CustomOutputDataType = numerictype(1,18,16);% CIC下垂补偿compFilt。FullPrecisionOverride = false;compFilt。CoefficientsDataType =“自定义”;compFilt。customcoefficients sdatatype = numerictype([],16,15);compFilt。ProductDataType =“充分精确”;compFilt。AccumulatorDataType =“充分精确”;compFilt。OutputDataType =“自定义”;compFilt。CustomOutputDataType = numerictype([],18,16);% HalfbandhbFilt。FullPrecisionOverride = false;hbFilt。CoefficientsDataType =“自定义”;hbFilt。customcoefficients sdatatype = numerictype([],16,15);hbFilt。ProductDataType =“充分精确”;hbFilt。AccumulatorDataType =“充分精确”;hbFilt。OutputDataType =“自定义”;hbFilt。CustomOutputDataType = numerictype([],18,16);%冷杉finalFilt。FullPrecisionOverride = false;finalFilt。CoefficientsDataType =“自定义”;finalFilt。customcoefficients sdatatype = numerictype([],16,15);finalFilt。ProductDataType =“充分精确”;finalFilt。AccumulatorDataType =“充分精确”;finalFilt。OutputDataType =“自定义”;finalFilt。CustomOutputDataType = numerictype([],18,16);
定点分析
检查量子化效果fvtool
.可以单独分析过滤器,也可以级联分析过滤器。fvtool
显示叠加的量化和非量化(参考)响应。例如,该图显示了量化最终FIR滤波阶段的效果。
ddcPlots。quantizedFIR = fvtool(finalFilt,...“Fs”, hbParams。FsOut,“算术”,“固定”);
重新定义ddcFilterChain
级联对象以包括各个筛选器的定点属性。然后,用fvtool
对整个滤波器链进行分析,确认量化后的DDC仍然满足规范要求。
ddcFilterChain = dsp。FilterCascade(cicFilt,...cicGainCorr、compFilt hbFilt finalFilt);ddcPlots。quantizedDDCResponse = fvtool(ddcFilterChain,...“Fs”傅氏国际,“算术”,“固定”);传奇(ddcPlots.quantizedDDCResponse...“DDC过滤链”);
hdl优化的Simulink模型
设计流程的下一步是使用支持HDL代码生成的块在Simulink中实现DDC。
模型配置
该模型依赖于MATLAB工作区中的变量来配置块和设置。它使用示例前面定义的相同过滤器链变量。接下来,定义NCO特性和输入信号。本例使用这些特征来配置NCO块。
指定所需的频率分辨率,并计算实现所需分辨率所需的累加器比特数。设置期望的伪散自由动态范围,然后定义量化累加器位数。NCO使用累加器的量化输出来处理正弦查找表。还计算NCO用于生成指定载波频率的相位增量。NCO将相位抖动应用于那些在量化过程中被移除的累加器位。
以区域。Fd = 1;以区域。AccWL = nextpow2(FsIn/nco.Fd)+1;SFDR = 84;以区域。QuantAccWL = ceil((SFDR-12)/6);以区域。PhaseInc = round((-Fc*2^n . accwl)/FsIn);以区域。NumDitherBits = nco.AccWL-nco.QuantAccWL;
DDC的输入来自ddcIn
变量。现在,为指定一个虚拟值ddcIn
这样模型就可以计算它的数据类型。在测试过程中,ddcIn
为模型提供输入数据。
ddcIn = 0;% #好< NASGU >
方法可以创建基于采样的信号FrameSize
到1,并输出每个单独的样本,因为它是接收。为了提高输入采样频率或降低功耗,本设计还可以实现基于帧的处理FrameSize
应作相应修改。在这个例子中,我们展示的是FrameSize
为4。
FrameSize = 4;
模型结构
该图显示了DDC Simulink模型的顶层。模型导入ddcIn
通过使用Signal from workspace块从MATLAB工作区中获取变量,将输入信号转换为16位值,并将信号应用到DDC。生成HDL代码HDL_DDC
子系统。
modelName =“DDCforLTEHDL”;open_system (modelName);set_param (modelName“SimulationCommand”,“更新”);set_param (modelName“开放”,“上”);
的HDL_DDC
子系统实现了DDC滤波器。首先,NCO块在载频处产生一个复相量。这个信号进入一个混频器,将相量与输入信号相乘。然后,混频器的输出被传递到过滤器链,并抽取到1.92 Msps。
set_param ([modelName' / HDL_DDC '],“开放”,“上”);
NCO区块参数
方法中定义的参数对模型中的NCO块进行配置以区域
结构。该图显示了NCO块参数对话框的两个选项卡。
CIC抽取和增益修正
第一个筛选阶段是用CIC Decimator块实现的CIC Decimator。块参数设置为cicParams
结构的值。为了实现增益校正,模型选择增益校正参数。该图像显示了CIC Decimator块的块参数。
该模型通过使用相应System对象的属性来配置过滤器。CIC补偿、半带抽取和最终抽取滤波器分别以比时钟速率低8、16和32倍的有效采样率工作。模型通过使用有效的输入信号,表明在每个速率下哪些样本是有效的。滤波器链中的信号都具有相同的Simulink采样时间。
CIC补偿、半波段抽取和最终抽取滤波器分别由FIR抽取器实现。通过设置有效输入样本之间的最小循环数参数时,我们可以在输入样本之间使用无效循环。例如,CIC补偿Decimator的每个输入之间的间距为8
,等于抽取因子。所以CIC补偿小数有有效输入样本之间的最小循环数设置为装天花板(cicParams.DecimationFactor / FrameSize)
,等于2
周期。该图像显示了CIC补偿抽取块的块参数。
FIR Decimator块在指定的时钟周期内完全重用乘数。为FrameSize
是4
, CIC补偿抽取过滤器将使用复杂的输入数据4
乘数。half - band Decimation使用4
乘数和最终抽取使用12
乘数。为FrameSize
是1
,由于CIC补偿抽取(CIC Compensation Decimation)和半带抽取(Halfband Decimation)的输入间隔大于它们的滤波器长度,因此这两个抽取器只需要2
乘数。和最终的抽取需要4
那时候的乘数。
载波上的正弦信号测试与验证
为了测试DDC,将一个40khz正弦波调制到载波频率上,并将调制的正弦波通过DDC。然后,测量产生的音色的无杂散动态范围(SFDR)和NCO输出的SFDR。绘制NCO的SFDR和定点DDC输出。
在执行任何模拟之前初始化随机种子。rng (0);产生一个40千赫的测试音,调制到载波上。ddcIn = DDCTestUtils.GenerateTestTone(40e3,Fc);用浮点DDC解调测试信号。ddcOut = DDCTestUtils.DownConvert(ddcIn,FsIn,Fc,ddcFilterChain);释放(ddcFilterChain);通过运行Simulink模型解调测试信号。out = sim(modelName);%测量NCO、浮点DDC输出和定点的SFDR% DDC输出。结果。sfdrNCO = sfdr(real(out.ncoOut),FsIn);结果。sfdrFloatDDC = sfdr(real(ddcOut),FsOut);结果。sfdrFixedDDC = sfdr(real(out.ddcFixedOut),FsOut);disp (“SFDR测量”);disp ([浮点DDC SFDR:num2str (results.sfdrFloatDDC)“数据库”]);disp ([“定点NCO SFDR:”num2str (results.sfdrNCO)“数据库”]);disp ([优化定点DDC SFDR:num2str (results.sfdrFixedDDC)“数据库”]);流(换行符);绘制NCO和定点DDC输出的SFDR。ddcPlots。以区域OutSDFR = figure; sfdr(real(out.ncoOut),FsIn); ddcPlots.OptddcOutSFDR = figure; sfdr(real(out.ddcFixedOut),FsOut);
SFDR测量值浮点DDC SFDR: 291.4184 dB定点NCO SFDR: 83.0306 dB优化定点DDC SFDR: 110.386 dB
LTE信号测试
您可以使用LTE测试信号对DDC执行更严格的测试。使用LTE Toolbox™功能生成符合标准的LTE波形。然后,用DDC模型向下转换波形。使用LTE工具箱函数测量结果信号的误差矢量幅度(EVM)。
rng (0);只有当您有LTE工具箱产品时才执行此测试。。如果许可证(“测试”,“LTE_Toolbox”)使用LTE工具箱函数生成调制的LTE测试信号。。[ddcIn,sigInfo] = DDCTestUtils.GenerateLTETestSignal(Fc);%用浮点DDC向下转换信号。ddcOut = DDCTestUtils.DownConvert(ddcIn,FsIn,Fc,ddcFilterChain);释放(ddcFilterChain);用Simulink模型对信号进行下转换,然后测量并绘制% EVM的浮点和定点结果。用零填充输入%表示传播延迟并返回完整的结果。ddcIn = [ddcIn; 0 (2480*FrameSize,1)];out = sim(modelName);结果。evmFloat = DDCTestUtils.MeasureEVM(sigInfo,ddcOut);结果。evmFixed = DDCTestUtils.MeasureEVM(sigInfo,out.ddcFixedOut(1:length(ddcOut)));disp (LTE误差矢量幅度(EVM)测量);disp ([浮点DDC RMS EVM:num2str (results.evmFloat.RMS * 100, 3)“%”]);disp ([浮点DDC峰值EVM:num2str (results.evmFloat.Peak * 100, 3)“%”]);disp (['定点DDC RMS EVM: 'num2str (results.evmFixed.RMS * 100, 3)“%”]);disp ([“定点DDC峰值EVM:”num2str (results.evmFixed.Peak * 100, 3)“%”]);流(换行符);结束
LTE误差向量量级测量浮点DDC RMS EVM: 0.633%浮点DDC峰值EVM: 2.44%定点DDC RMS EVM: 0.731%定点DDC峰值EVM: 2.69%
HDL代码生成和FPGA实现
要为这个示例生成HDL代码,您必须拥有HDL Coder™产品。使用makehdl
而且makehdltb
命令生成HDL代码和一个HDL测试平台HDL_DDC
子系统。DDC在Xilinx®Zynq®-7000 ZC706评估板上合成。该表显示了投递地点和路径资源利用结果。该设计满足时钟频率为331 MHz的定时要求。
T =表(...分类({附近地区的;“LUTRAM”;“FF”;“布莱姆。”;“DSP”}),...分类({“4341”;“383”;“8248”;“2.0”;“36”}),...“VariableNames”, {“资源”,“使用”})
T = 5x2表资源使用情况________ _____ LUT 4341 LUTRAM 383 FF 8248 BRAM 2.0 DSP 36