主要内容

FPGA数字下变频器的实现

本示例展示了如何为无线电通信应用(如LTE)设计数字下变频器(DDC),并生成HDL代码。

介绍

ddc广泛应用于数字通信接收机中,用于将射频(RF)或中频(IF)信号转换到基带。DDC操作将信号转移到较低的频率,并降低其采样率,以方便后续处理阶段。本例中的DDC执行复频率转换,然后使用四级滤波器链进行采样率转换。本例从使用DSP System Toolbox™的浮点功能设计DDC开始。然后,将每个阶段转换为固定点,并在生成可合成HDL代码的Simulink®模型中使用。万博1manbetx本例使用这两个测试信号来演示和验证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补偿抽取器通过补偿CIC衰减来改善频谱响应。半带是一个中间小数,最终小数实现精确成就FstopDDC的特性。靠近链末端的较低采样率意味着后面的滤波器可以通过共享乘数来优化资源使用。

此图显示了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。DifferentialDelay = 1;cicParams。NumSections = 3;cicParams。FsOut = FsIn/cicParams.DecimationFactor;cicFilt = dsp.CICDecimator(cicParams.DecimationFactor,cicParams.DifferentialDelay cicParams.NumSections)% #好< * NOPTS >cicGain =增益(cicFilt)
cicFilt = dsp。CICDecimator with properties: DecimationFactor: 8 DifferentialDelay: 1 NumSections: 3 FixedPointDataType: '全精度' 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 No Correction”“带增益修正的CIC”);

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 = design(compSpec,“SystemObject”,真正的)
compFilt = dsp。FIRDecimator with properties: Main DecimationFactor: 2 NumeratorSource: 'Property'分子:[-0.0398 -0.0126 0.2901 0.5258 0.2901 -0.0126 -0.0398]Structure: 'Direct form'使用get来显示所有属性

绘制CIC滤波器(带增益校正)和下垂补偿的组合响应。

ddcPlots。cicComp = fvtool(dsp.FilterCascade (cicFilt cicGainCorr compFilt),“Fs”傅氏国际,“传奇”“关闭”);

Halfband杀害多人者

半带滤波器提供有效的抽取2。半带滤波器是高效的,因为它们的系数大约有一半等于零,并且这些乘法器被排除在硬件实现之外。

hbParams。FsOut = compParams.FsOut/2;hbParams。TransitionWidth = hbParams。FsOut - 2*Fstop;hbParams。阻带衰减= Ast;hbSpec = fdesign.decimator(2;“halfband”“Tw, Ast”hbParams。TransitionWidth,hbParams。StopbandAttenuation,compParams.FsOut);hbFilt =设计(hbSpec,“SystemObject”,真正的)
hbFilt = dsp。FIRDecimator with properties: Main DecimationFactor: 2 NumeratorSource: 'Property' Numerator:[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(2;低通滤波器的“Fp,置,美联社,Ast”成就,Fstop,美联社,Ast + 3, hbParams.FsOut);finalFilt = design(finalSpec,“equiripple”“SystemObject”,真正的)
finalFilt = dsp。FIRDecimator with properties: Main DecimationFactor: 2 NumeratorSource: 'Property' Numerator: [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滤波器链的输入是带有15个小数位的16位数据。滤波器输出为18位值,在中间信号中提供额外的净空和精度。

对于CIC的十进制数,选择“最小分段字长”定点数据类型选项根据输出字长和其他CIC参数自动优化内部字长。

cicFilt。FixedPointDataType =“最小分段字长”;cicFilt。OutputWordLength = 18;

配置增益校正和基于fir的System对象的定点属性。对象使用默认值RoundingMethodOverflowAction物业值(“地板”“包装”分别)。

% CIC增益校正cicGainCorr。FullPrecisionOverride = false;cicGainCorr。CoefficientsDataType =“自定义”;cicGainCorr。customcoefficients = numerictype(fi(cicGainCorr.Numerator,1,16));cicGainCorr。OutputDataType =“自定义”;cicGainCorr。CustomOutputDataType = numerictype(1,18,16);% CIC下垂补偿compFilt。FullPrecisionOverride = false;compFilt。CoefficientsDataType =“自定义”;compFilt。CustomCoefficientsDataType = numerictype([],16,15);compFilt。ProductDataType =“充分精确”;compFilt。AccumulatorDataType =“充分精确”;compFilt。OutputDataType =“自定义”;compFilt。CustomOutputDataType = numerictype([],18,16);% HalfbandhbFilt。FullPrecisionOverride = false;hbFilt。CoefficientsDataType =“自定义”;hbFilt。CustomCoefficientsDataType = numerictype([],16,15);hbFilt。ProductDataType =“充分精确”;hbFilt。AccumulatorDataType =“充分精确”;hbFilt。OutputDataType =“自定义”;hbFilt。CustomOutputDataType = numerictype([],18,16);%冷杉finalFilt。FullPrecisionOverride = false;finalFilt。CoefficientsDataType =“自定义”;finalFilt。CustomCoefficientsDataType = 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万博1manbetx模型

设计流程的下一步是在Simulink中使用支持HDL代码生成的块来实现DDC。万博1manbetx万博1manbetx

模型配置

该模型依赖于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^nco.AccWL)/FsIn);以区域。NumDitherBits = nco.AccWL-nco.QuantAccWL;

DDC的输入来自ddcIn变量。现在,为分配一个虚拟值ddcIn这样模型就可以计算它的数据类型。在测试过程中,ddcIn为模型提供输入数据。

ddcIn = 0;% #好< NASGU >

可以创建基于样本的信号FrameSize到1,并在接收到每个单独的样本时输出。考虑到更高的输入采样频率或降低功耗,本设计还可以实现基于帧的处理FrameSize应作相应修改。在这个例子中,我们展示的是FrameSize为4。

FrameSize = 4;

模型结构

该图显示了DDC Simulink模型的顶层。万博1manbetx模型导入ddcIn通过使用来自工作区的信号块从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抽取器,它是用CIC抽取器块实现的。块参数设置为cicParams结构的值。为了实现增益校正,模型选择增益校正参数。该图像显示CIC Decimator块的块参数。

该模型通过使用相应System对象的属性来配置过滤器。CIC补偿、半带抽取和最终抽取滤波器的有效采样率分别比时钟率低8、16和32倍。该模型通过使用有效的输入信号,以指示在每个速率下哪些样本是有效的。滤波器链中的信号都具有相同的Simulink采样时间。万博1manbetx

CIC补偿、半带抽取和最终抽取滤波器均由FIR抽取器实现。通过设置有效输入样本之间的最小周期数参数,我们可以使用输入样本之间的无效周期。例如,CIC补偿抽取器的每个输入之间的间距为8,它等于抽取因子。所以CIC补偿除数有有效输入样本之间的最小周期数设置为装天花板(cicParams.DecimationFactor / FrameSize),等于2周期。该图像显示了CIC补偿抽取块的块参数。

FIR Decimator块在指定的时钟周期内完全重用乘数器。为FrameSize4, CIC补偿抽取滤波器与复杂的输入数据将使用4乘数。半带抽取使用4乘数,最后抽取使用12乘数。为FrameSize1,由于CIC补偿抽取和半带抽取的输入间距大于它们的滤波器长度,这两个抽取器只需要2乘数。而《Final Decimation》需要4当时是乘数。

正弦载波测试与验证

为了测试DDC,将一个40 kHz的正弦波调制到载波频率上,并将调制好的正弦波通过DDC。然后,测量产生的音调的无杂散动态范围(SFDR)和NCO输出的SFDR。绘制NCO的SFDR和定点DDC输出。

%在执行任何模拟之前初始化随机种子。rng (0);产生40千赫的测试音,调制到载波上。ddcIn = ddctesttils . generatetesttone (40e3,Fc);用浮点DDC解调测试信号。ddcOut = DDCTestUtils.DownConvert(ddcIn,FsIn,Fc,ddcFilterChain);释放(ddcFilterChain);通过运行Simulink模型解调测试信号。万博1manbetxout = 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模型对信号进行下变频,然后测量并绘制万博1manbetx浮点和定点结果的% EVM。用零填充输入%表示传播延迟并返回完整的结果。[cn]; [cn]; [cn];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误差矢量大小(EVM)测量值浮点DDC RMS EVM: 0.633%浮点DDC峰值EVM: 2.44%定点DDC RMS EVM: 0.731%定点DDC峰值EVM: 2.69%

HDL代码生成和FPGA实现

要为本例生成HDL代码,您必须拥有HDL Coder™产品。使用makehdlmakehdltb的生成HDL代码和一个HDL测试台HDL_DDC子系统。DDC是在Xilinx®Zynq®-7000 ZC706评估板上合成的。该表显示了post - place- route资源利用结果。该设计满足时钟频率为331 MHz的时序要求。

table(表)分类({附近地区的;“LUTRAM”;“FF”;“布莱姆。”;“DSP”}),分类({“4341”;“383”;“8248”;“2.0”;“36”}),“VariableNames”, {“资源”“使用”})
T = 5x2表资源使用情况________ _____ LUT 4341 LUTRAM 383 FF 8248 BRAM 2.0 DSP 36