主要内容

用于NR SIB1恢复的硬件加速器

这个例子展示了针对HDL代码生成和硬件实现优化的5G SIB1加速器的设计。

简介

本例中描述的Simulink®模型是用于5G NR SIB1恢复的硬件加速器的定点HDL优化实现。

  1. SIB1电网恢复

  2. CORESET0解码

  3. SIB1 LDPC译码

设计并优化了SIB1网格恢复算法的频率范围为1 (FR1)。CORESET0和SIB1 LDPC解码算法都支持这两个频率范围。的NR HDL SIB1恢复示例展示了如何集成硬件加速器与SSB检测和解码设计,以实现一个完整的SIB1恢复模型。同时支持FR1和FR2的设计实现在NR HDL SIB1恢复FR2的例子。

这个例子是一个相关的集合,更多信息请参见NR HDL参考应用概述

文件结构

本示例使用这些文件。

仿真软件模型

  • nrhdlSIB1Demodulation.slx:此Simulink模型引用nrhdlDDCFR1Core而且nrhdlSIB1DemodulationFR1Core模型模拟SIB1网格解调步骤的SIB1恢复。

  • nrhdlCORESET0Decoding.slx:该模型引用nrhdlCORESET0DecodingCore而且nrhdlPolarDecodingChainCore模型模拟CORESET0解码步骤的SIB1恢复。

  • nrhdlSIB1LDPCDecoding.slx:该模型引用nrhdlLDPCDecodingChainCore模型模拟SIB1 LDPC解码步骤的SIB1恢复。

  • nrhdlDDCFR1Core.slx:这个模型实现了一个DDC来为SIB1和ssb创建样例流。

  • nrhdlSIB1DemodulationFR1Core.slx:该模型实现了SIB1解调算法。

  • nrhdlCORESET0DecodingCore.slx:该模型实现CORESET0解码算法。

  • nrhdlPolarDecodingChainCore.slx:该模型实现公共极性解码链。

  • nrhdlLDPCDecodingChainCore.slx:该模型实现了SIB1 LDPC解码算法。

模型数据字典

  • nrhdlReceiverData.sldd:这个Simulink数据字典包含定义示例模型中包含的总线的总线对象。

MATLAB代码

  • runSIB1AcceleratorModels.m:该脚本使用MATLAB参考实现MIB恢复算法,然后运行nrhdlSIB1DemodulationnrhdlCORESET0Decoding,nrhdlSIB1LDPCDecoding仿真软件模型。该脚本使用5G工具箱™和MATLAB参考代码验证模型的操作。

  • nrhdlexamples:包含MATLAB参考代码和用于验证实现模型的实用函数的包。

NR HDL SIB1解调

此图显示了nrhdlSIB1Demodulation模型。模型的顶层从MATLAB基本工作空间读取信号,将它们传递给SIB1解调子系统,并将输出写回工作空间。

模型。DemodulationTop =“nrhdlSIB1Demodulation”;open_system (models.DemodulationTop);

SIB1解调子系统

SIB1解调子系统引用nrhdlDDCFR1Core而且nrhdlSIB1DemodulationFR1Core模型。的算法nrhdlSIB1DemodulationFR1Core模型将在下一节中进行描述。有关nrhdlDDCFR1Core模型的NR HDL细胞搜索的例子。DDC的输出是SIB1解调算法的输入。应用于DDC的频率偏移量结合了从成功的MIB恢复到SSB的频率偏移量估计项和SSB到SIB1的偏移量。组合频率偏移以接收波形中的CORESET0为中心。

set_param([模型。DemodulationTop' / SIB1解调'],“开放”“上”);

输入

  • dataIn: 14位有符号复值信号,以61.44 Msps采样。

  • validIn: 1位控制信号进行验证dataIn

  • paramsIn: SIB1GridParamBus类型的总线。

  • 开始: 1位控制信号,用于启动SIB1网格恢复操作。

  • clearStatus: 1位控制信号,用于清除状态信号的状态。

SIB1GridParamBus

  • ssbTimingOffset: 21位无符号值,为检测到的SSB的时间偏移量。在0到1228799的样本中,时间偏移为61.44 Msps。

  • scsSSB: 2位无符号值,指定检测到SSB的子载波间距(SCS)。将此信号设置为0以选择15khz,或1以选择30khz。

  • ssbIndex3Lsb: 3位无符号值,即SSB索引的3个最低有效位。

  • pbchPayload: 32位无符号值,包含MIB和附加的PBCH定时数据。

  • minChanBW: 2位无符号值,指定最小通道带宽。0表示5mhz, 1表示10mhz, 2表示40mhz。

  • ssbPattern:指定SSB模式的2位无符号值。0表示“Case A”,1表示“Case B”,2表示“Case C”。

  • Lmax: 2位无符号数,表示一次突发的最大ssb个数。取值为0表示4个,取值为1表示8个,取值为2表示64个。

输出

  • 状态: 2位无符号值,表示SIB1解调操作的进度。

  • dataOut: 16位带符号复值SIB1资源网格数据。该算法输出SIB1网格的28个OFDM符号,每个周期一个资源元素(RE)。

  • validOut: 1位控制信号,用于验证dataOut输出。

  • coreset0Resources: coreset0ResourcesBus类型的总线。

  • coreset0Occasion: coreset0conditionbus类型的总线。

  • parsedMIB: MIBBus类型的总线。

coreset0ResourcesBus

  • resourceBlocks: 2位无符号值,指定资源块的数量。0表示24,1表示48,2表示96。

  • ofdmSymbols: 2位无符号值,即CORESET0所跨越的OFDM符号的数量。

  • frequencyOffset: 32位有符号值,指定从SSB到CORESET0的相对频率偏移量。该信号连接到一个32位蓄能器的NCO。使用这个方程将值转换为Hz:frequencyOffset_HzfrequencyOffset* 61.44e6 / 2^32。

  • muxPattern: 2位无符号值,指定CORESET0多路复用模式。

coreset0OccasionBus

  • slotOffset: 8位无符号值,即从偶帧头到第一个被监控槽位的槽位偏移。

  • firstSymbol: 4位无符号值,指定槽位中第一个被占用的OFDM符号。

MIBBus

  • sfn: 10位无符号值,即系统帧号(SFN)。

  • scsCommon: 1位无符号值,指定公共子载波间距。0表示15khz, 1表示30khz。

  • Kssb: 5位无符号值,即SSB与整个资源块网格之间的偏移量。

  • drmsTypeAPos: 1位无符号值,指定PDSCH分配类型A的DMRS符号的位置,其中0表示位置2,1表示位置3。

  • pdcchConfigSIB1: 8位无符号值,包含CORESET0的配置

  • cellBarred: 1位值,指示单元是否被禁止。

  • intraFreqReselection: 1位值,表示是否允许频率内重选。

  • hrf: 1位值,即半帧位。

  • ssbIdx: 3位值,是SSB的索引。

状态信号状态

  • 0:初始状态。等待启动脉冲。

  • 1:等待CORESET0定时场合。

  • 2: OFDM解调并输出SIB1网格数据。

SIB1解调模型

这张图显示的是nrhdlSIB1DemodulationFR1Core模型。该设计在61.44 MHz采样率的IQ数据上工作,需要成功的MIB恢复参数。启动信号开始SIB1解调操作,当paramsIn总线上的所有输入端口都有效时,将该信号设置为1。在解调期间,必须保持paramsIn上的值不变。

模型。DemodulationCore =“nrhdlSIB1DemodulationFR1Core”;load_system (models.DemodulationCore);set_param(模型。DemodulationCore,“SimulationCommand”“更新”);set_param([模型。DemodulationCore' / SIB1DemodulationCore '],“开放”“上”);

OFDM解调子系统接收启动信号,OFDM对输入数据进行解调,输出到SIB1网格。该子系统计算一个可变大小的FFT,具有可配置的循环前缀长度和保护子载波数量。FFT大小的选择取决于SIB1网格的子载波间距。对于SCS 15使用2048点FFT,对于SCS 30使用1024点FFT。这些值对应于30.72 MHz的采样率。循环前缀长度在SIB1网格的OFDM解调过程中变化,以解释出现在半子帧边界的较长的循环前缀符号。用保护子载波的数量从全解调带宽中提取SIB1网格。

OFDM解调子系统需要配置值才能成功解调SIB1网格。这些值是从MIB恢复的结果中计算出来的。的SIB1配置子系统从PBCH有效负载构造MIB并解析pdcchSIB1Config字段来确定coreset0Resources而且coreset0TimingOccasion.的coreset0Resources信号包含从SSB到CORESET0的频率偏移和CORESET0资源网格的带宽。的coreset0TimingOccasion信号包含从偶数SFN帧头到第一个被监视槽位的槽位偏移,即2个系统帧内的槽位。被监视的槽位定时偏移子系统转换coreset0TimingOccasion插槽偏移到定时引用计数。利用SSB模式、SSB索引和SSB时序参考计算偶数SFN帧头的时序参考,由此计算CORESET0的时序参考值。定时参考计数器与SSB检测参考同步,用于跟踪SIB1数据流。一旦启动信号被断言,startController等待SIB1计时引用到达由被监视的槽位计时偏移子系统计算的目标偏移量,然后触发OFDM解调开始。该图显示了被监视SSB、偶数帧头和CORESET0计时场合的计时参考示例。这些偏移量取决于发射单元的配置。

NR HDL CORESET0解码

此图显示了nrhdlCORESET0Decoding模型。模型的顶层从MATLAB基本工作空间读取信号,将它们传递给CORESET0解码子系统,并将输出写回工作空间。

模型。CORESET0Top =“nrhdlCORESET0Decoding”;open_system (models.CORESET0Top);

CORESET0解码子系统

CORESET0解码子系统引用nrhdlCORESET0DecodingCore而且nrhdlPolarDecodingChainCore模型。的算法nrhdlCORESET0DecodingCore模型将在下一节中进行描述。的nrhdlPolarDecodingChainCore模型覆盖在NR HDL MIB恢复的例子。该子系统执行CORESET0候选对象的信道估计和均衡、QPSK符号解调、解扰、速率恢复、极性译码和CRC译码。该设计通过nextFrame信号提供反压力,以指示何时可以接受新的候选对象。处理被分成两个模型,以允许nrhdlPolarDecodingChainCore的SSB解码和SIB1 CORESET0解码之间共享NR HDL SIB1恢复的例子。介绍子系统的输入输出。

set_param([模型。CORESET0Top' / CORESET0解码”],“开放”“上”);

输入

  • gridDataIn: 16位signed CORESET0候选OFDM网格数据。

  • gridCtrlIn:采样控制总线信号进行验证gridDataIn

  • NSym:当前资源元素组(REG)的4位OFDM符号号。

  • baseRBIdx:当前REG的7位基本CORESET0资源块索引。

  • searchSpaces:长度为3的3位无符号向量,表示聚合级别4、8和16上的搜索空间数量。

  • coreset0Syms: 2位无符号值,即CORESET0所跨越的OFDM符号的数量。

  • coreset0RBs: 2位无符号值,指定资源块的数量。0表示24,1表示48,2表示96。

  • NSlot: 7位无符号值,指定第一个被监视的CORESET0槽位的槽位号。

  • NCellID: 10位无符号值,为解调后SSB的cell ID。

  • 重新启动: 1位控制信号,用于重新启动处理。

输出

  • 状态: 3位无符号值,表示CORESET0解码过程的进度。

  • dciData: 41位无符号数据,包含最终解码的DCI。

  • firstOrSecondSlot: 1位值,指示是否在第一个(0)或第二个(1)监视槽位中找到已解码的DCI。

  • searchFailed: 1位值,表示CORESET0 DCI搜索失败。

  • dciValid: 1位值,表示搜索完成。

  • nextFrame: 1位信号,在可输入下一个候选时向信号提供背压。

状态信号状态

  • 0:初始状态。等待启动脉冲。

  • 1:执行信道估计、均衡、符号解调和解乱。

  • 2:执行极性速率恢复。

  • 3.:进行极性和CRC解码。

  • 4:候选解码失败,等待下一次尝试。

  • 5:解码所有没有成功的候选人。

  • 6:成功解码候选DCI。

CORESET0解码模型

这张图显示的是nrhdlCORESET0DecodingCore模型。为了解码CORESET0,在多个候选对象上执行盲搜索。正确的候选对象由CRC余数等于SIB1 RNTI 65535确定。该设计协调每一个搜索步骤,并生成所需的参数,以解码候选nrhdlPolarDecodingChainCore模型。在对候选对象进行解码后,检查CRC结果。如果CRC通过,则将解码后的数据输出到dciData端口。如果CRC失败,算法用nextFrame它已经为下一个候选人做好了准备。如果所有的候选者都没有成功解码,那么searchFailed设置高。每个槽的搜索候选数由searchSpaces输入时,该信号是3个值的向量,对应于三个可能聚合值的候选数量[4 8 16]。该设计期望候选项按聚合级别的递减顺序输入。搜索总数是搜索空间的两倍,因为有两个槽位被监视以进行解码。的firstOrSecondSlot输出信号的槽位解码的DCI。状态信号可以用来监视解码的进度。每个候选失败都用状态表示4最终结果由两个州发出信号5(失败)或状态6(成功)。

模型。coreset0Decoding =“nrhdlCORESET0DecodingCore”;load_system (models.coreset0Decoding);set_param (models.coreset0Decoding“SimulationCommand”“更新”);set_param (models.coreset0Decoding“开放”“上”);

NR HDL SIB1 LDPC解码

此图显示了nrhdlSIB1LPDCDecoding模型。模型的顶层从MATLAB基本工作空间读取信号,将它们传递给SIB1 LDPC解码子系统,并将输出写回工作空间。

模型。LDPCTop=“nrhdlSIB1LDPCDecoding”;open_system (models.LDPCTop);

SIB1 LDPC解码子系统

SIB1 LDPC译码子系统的引用nrhdlLDPCDecodingChainCore模型。子系统完成LDPC解码、码块解分割和CRC解码。介绍子系统的输入输出。

set_param([模型。LDPCTop' / SIB1 LDPC译码'],“开放”“上”);

输入

  • ldpcDta: 16位signed LDPC码字LLR数据。

  • ldpcCtrl:用于验证的示例控制总线ldpcData

  • G:输入码字的15位长度。

  • ldpcZc: 16位无符号值,表示LDPC码字使用的提升大小。

  • tbs: 12位无符号值,表示已解码输出数据的长度。

  • clearStatus: 1位控制信号,用于清除状态信号的状态。

输出

  • 状态: 3位无符号值,表示SIB1解码过程的进度。

  • sib1Bits: 1位数据,即最终解码的SIB1有效负载。

  • sib1BitsCtrl:用于验证的示例控制总线sib1Bits

  • sib1Err: 1位值,表示是否SIB1 CRC失败。

  • 诊断:包含诊断信号的总线。

状态信号状态

  • 0:初始状态。等待启动脉冲。

  • 1:执行LDPC速率恢复。

  • 2:进行LDPC解码。

  • 3.: CRC解码。

  • 4: SIB1解码失败。

  • 5:成功解码SIB1。

SIB1 LDPC解码模型

这张图显示的是nrhdlLDPCDecodingChainCore模型。该设计接受输入llr以及一个示例控制总线和其他常数。第一阶段进行LDPC速率恢复,包括信号缩放和字长缩减,为LDPC解码准备数据。第二阶段采用最小和分层信念传播算法对LDPC数据进行解码,并从输入端引入提升因子。对于SIB1用例,只支持基本图2bgn输入是恒定的。然后算法执行代码块去分割。对于SIB1,这只需要从数据末尾删除填充位,以生成长度为tbs+ 16 CRC位。最后阶段使用CRC16执行CRC解码,没有置乱。输出已解码的SIB1位和错误状态。此外,还提供了一个状态端口来显示算法的进展。速率恢复阶段的输出提供在诊断端口上。

模型。ldpcDecoding =“nrhdlLDPCDecodingChainCore”;load_system (models.ldpcDecoding);set_param (models.ldpcDecoding“SimulationCommand”“更新”);set_param ([models.ldpcDecoding“/ LDPC译码链”],“开放”“上”);

SIB1加速器模拟设置

该图显示了这个示例实现的模拟设置。5G Toolbox函数用于生成测试波形。然后使用MATLAB参考代码执行MIB恢复所需的步骤- SSB搜索、解调和解码。结果为SIB1解调阶段提供了输入数据。相同的输入被传递给MATLAB和Simulink实现的SIB1解调,并直接比较输出网格。从网格中提取CORESET0候选序列,并使用MATLAB和Simulink进行解码。利用DCI结果从资源网格中提取出SIB1 LDPC码字,并在MATLAB和Simulink中进行最终解码。在每个阶段将MATLAB和Simulink的结果进行比较,以确定它们的等价性。

SIB1加速器模拟

使用runSIB1AcceleratorModels脚本使用硬件加速器运行SIB1恢复模拟。该脚本在MATLAB命令提示符中显示其进度,并生成输入和输出的图形以供分析。该试验台支持多个仿真用例。文中显示了完整的案例集及其参数。这个例子显示了运行“SimCase 1”的结果。给出了MATLAB和Simulink通过SIB1解调生成的资源网格,以及它们之间的差异及其相对均方误差(MSE)。网格图被标记为突出显示已解码的PDCCH和PDSCH。显示CORESET0解码的DCI字段,并比较最终的SIB1位。此比较验证了Simulink实现与MATLAB参考非常匹配。

disp (nrhdlexamples.generateFR1RxWaveform (“列表”));
模拟案例单边带模式共同PDCCH副载波间距配置SIB1信噪比dB Lmax最强的单边带索引  _______________ ___________ _________________________ _________________ ______ ___________________ ____ " SimCase 1”“案例C“30 164 50 4 8”SimCase 2”“案例B“15 100 6 7 8”SimCase 3”“案例”30 4 20 2 8“SimCase 4”“案例”15 84 7 0 4
runSIB1AcceleratorModels;
runSIB1AcceleratorModels;
生成测试波形。利用MATLAB的参考资料搜索ssb。利用MATLAB参考解调最强SSB。利用MATLAB参考软件对解调后的SSB进行解码。利用MATLAB参考解调SIB1网格。利用Simulink模型解调SIB1网格。nrhdlSIB1Demodulation运行。启动串行模型参考仿真构建nrhdlDDCFR1Core的模型参考仿真目标是最新的。nrhdlSIB1DemodulationFR1Core的模型参考仿真目标是最新的。构建总结0的2个模型构建(2个模型已经是最新的)构建持续时间:0h 0m 0.76361 ................... MATLAB and Simulink grids relative MSE : -62.453 dB Extracting CORESET0 candidates from the SIB1 grid. Decoding CORESET0 candidates using MATLAB reference. Decoding CORESET0 candidates using Simulink. Running nrhdlCORESET0Decoding.slx ### Starting serial model reference simulation build ### Model reference simulation target for nrhdlCORESET0DecodingCore is up to date. ### Model reference simulation target for nrhdlPolarDecodingChainCore is up to date. Build Summary 0 of 2 models built (2 models already up to date) Build duration: 0h 0m 0.92363s .......... DCI from MATLAB: RIV: 528 TDDIndex: 0 VRBToPRBInterleaving: 0 ModCoding: 0 RV: 0 SIIndicator: 0 Reserved: 0 DCI from Simulink: RIV: 528 TDDIndex: 0 VRBToPRBInterleaving: 0 ModCoding: 0 RV: 0 SIIndicator: 0 Reserved: 0 DCI successfully decoded from Simulink grid with hardware acceleration Extracting LDPC codeword from the SIB1 grid. Decoding SIB1 using MATLAB reference. Decoding SIB1 using Simulink. Running nrhdlSIB1LDPCDecoding.slx ### Starting serial model reference simulation build ### Model reference simulation target for nrhdlLDPCDecodingChainCore is up to date. Build Summary 0 of 1 models built (1 models already up to date) Build duration: 0h 0m 0.61133s .......... SIB1 successfully decoded from Simulink grid with hardware acceleration SIB1 bits from MATLAB and Simulink match

HDL代码生成和实现结果

要为这个示例生成HDL代码,您必须拥有HDL Coder™许可证。使用makehdl而且makehdltb命令生成HDL代码和一个HDL测试台架nrhdlSIB1Demodulation / SIB1解调nrhdlCORESET0Decoding / CORESET0解码nrhdlSIB1LDPCDecoding / SIB1 LDPC译码子系统。合成的HDL代码用于Xilinx®Zynq®-7000 ZC706评估板。下表显示了站点位置和路由资源的利用结果。该设计满足时钟频率为150mhz的定时。

nrhdlsib1解调模型的资源利用:

T =表(...分类({片寄存器的片附近地区的“RAMB18”“RAMB36”“DSP48”}),...(12932;7338;19;10;35),...“VariableNames”, {“资源”“使用”});disp (T);
资源使用情况_______________ _____ Slice寄存器12932 Slice LUTs 7338 RAMB18 19 RAMB36 10 DSP48 35

nrhdlCORESET0Decoding模型的资源利用率:

T =表(...分类({片寄存器的片附近地区的“RAMB18”“RAMB36”“DSP48”}),...(8291;11073;8;4;16),...“VariableNames”, {“资源”“使用”});disp (T);
资源使用情况_______________ _____ Slice寄存器8291 Slice LUTs 11073 RAMB18 8 RAMB36 4 DSP48 16

nrhdlSIB1LDPCDecoding模型的资源利用率:

T =表(...分类({片寄存器的片附近地区的“RAMB18”“RAMB36”“DSP48”}),...(61821;42092;289;20;3),...“VariableNames”, {“资源”“使用”});disp (T);字段=字段名(模型);k = 1:长度(字段)close_system(模型。(字段{k}), 0);结束
资源使用情况_______________ _____ Slice寄存器61821 Slice LUTs 42092 RAMB18 289 RAMB36 20 DSP48 3 .单击“确定”

相关的例子

更多关于

Baidu
map