用于NR SIB1恢复的硬件加速器
这个例子展示了针对HDL代码生成和硬件实现优化的5G SIB1加速器的设计。
简介
本例中描述的Simulink®模型是用于5G NR SIB1恢复的硬件加速器的定点HDL优化实现。
SIB1电网恢复
CORESET0解码
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恢复算法,然后运行nrhdlSIB1Demodulation
,nrhdlCORESET0Decoding
,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_Hz=frequencyOffset* 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 .单击“确定”