В этом примере показано, как использовать блоки NR CRC Encoder и NR CRC Decoder Simulink ® и сравнивать аппаратно оптимизированные результаты с результатами функций 5G Toolbox™ nrCRCEncode (5G Панель инструментов) и nrCRCDecode (5G Панель инструментов) соответственно. Эти блоки поддерживают скалярные и векторные входы. Блоки кодера NR CRC и декодера NR CRC поддерживают генерацию аппаратного кода.
Формирование случайных кадров входных данных и управляющего сигнала, указывающего границы кадра. Зазор кадра соответствует задержке блока кодера NR CRC.
CRCType = 'CRC24A'; numFrames = 4; scalar = true; % true for scalar inputs and false vector inputs parallel = false; % true for parallel architecture and false for % serial architecture msg = {numFrames}; dataIn = []; encStartIn = []; encEndIn = []; encValidIn = []; [poly,crcLen] = NRCRCEncodeAndDecoderHDLInitScript(CRCType); if parallel listN = divisors(crcLen); % Factors of length of CRC polynomial dataWidth = randsrc(1,1,listN(2:end)); else dataWidth = 1; end frameGap = 120; % Frame gap selected based on CRCType and dataWidth for ii = 1:numFrames len = randsrc(1,1,1:1000); frameLen = len*dataWidth; msg{ii} = randi([0 1],1,frameLen); % Generate data based on the selected dataWidth if scalar data = reshape(msg{ii},dataWidth,len); encIn = zeros(1,size(data,2)); for i = 1:size(data,2) encIn(i) = bi2de(data(:,i)','left-msb'); %#ok<*SAGROW> end dataIn = fi([dataIn encIn zeros(size(encIn,1),frameGap)],0,dataWidth,0); else encIn = reshape(msg{ii},dataWidth,len); %#ok<*UNRCH> dataIn = logical([dataIn encIn zeros(size(encIn,1),frameGap)]); end encStartIn = logical([encStartIn 1 zeros(1,len-1) zeros(1,frameGap)]); encEndIn = logical([encEndIn zeros(1,len-1) 1 zeros(1,frameGap)]); encValidIn = logical([encValidIn ones(1,len) zeros(1,frameGap)]); end encSampleIn = timeseries(dataIn'); sampleTime = 1; simTime = length(encValidIn);
Подсистема HDLNRCRureDecode содержит кодеры CRC HDL NR и декодеры CRC HDL NR, которые содержат блоки кодера CRC NR и декодера CRC NR соответственно. При запуске модели импортируются переменные входного сигнала encSampleIn, encStartIn, encEndIn, и encValidIn и экспорт переменных encSampleOut и encCtrlOut в рабочую область MATLAB ®.
open_system('NRCRCEncodeAndDecodeHDLModel'); set_param('NRCRCEncodeAndDecodeHDLModel/HDLNRCRCEncodeDecode/HDL NR CRC Encoder/NR CRC Encoder','CRCType',CRCType); set_param('NRCRCEncodeAndDecodeHDLModel/HDLNRCRCEncodeDecode/HDL NR CRC Decoder/NR CRC Decoder','CRCType',CRCType); modelOut = sim('NRCRCEncodeAndDecodeHDLModel');

Подсистема кодирования NR CRC HDL содержит блок кодирования CRC NR. Преобразуйте выходные данные потоковых данных блока кодера NR CRC в кадры, а затем сравните выходные кадры с выходными данными nrCRCEncode 5G функцию «Панель инструментов».
encOut = squeeze(modelOut.encSampleOut.Data); startIdx = find(modelOut.encCtrlOut.start.Data); endIdx = find(modelOut.encCtrlOut.end.Data); encValidOut = squeeze(modelOut.encCtrlOut.valid.Data); vector = ~scalar && parallel; for ii = 1:numFrames refEncBits{ii} = nrCRCEncode(msg{ii}',poly); % Extract actual encoded bits from output idx = startIdx(ii):endIdx(ii); if (vector) % For vector inputs encBits = encOut(:,idx); encBits = encBits(:,encValidOut(idx)); actEncBits{ii} = encBits(:); else encBits = encOut(idx); encBits = encBits(encValidOut(idx)); encBits = dec2bin(encBits,dataWidth)-'0'; actEncBits{ii} = reshape(encBits',length(refEncBits{ii}),1); end error = sum(abs(refEncBits{ii}-double(actEncBits{ii}))); fprintf(['CRC-encoded frame %d: Behavioral and ' ... 'HDL simulation differ by %d bits\n'],ii,error); end
CRC-encoded frame 1: Behavioral and HDL simulation differ by 0 bits CRC-encoded frame 2: Behavioral and HDL simulation differ by 0 bits CRC-encoded frame 3: Behavioral and HDL simulation differ by 0 bits CRC-encoded frame 4: Behavioral and HDL simulation differ by 0 bits
Подсистема декодера NR CRC HDL содержит блок декодера CRC NR. Выходы подсистемы кодирования NR-CRC HDL предоставляются как вход в подсистему декодирования NR-CRC HDL. Подсистема декодера NR CRC HDL экспортирует в рабочую область MATLAB поток декодированных выходных выборок decSampleOut и DecErrOut вместе с управляющим сигналом decStartOut. Сравните их с выводом nrCRCDecode функция.
dataOut = squeeze(modelOut.decSampleOut.Data); errOut = squeeze(modelOut.decErrOut.Data); startIdx = find(modelOut.decStartOut.Data); endIdx = find(modelOut.decEndOut.Data); validOut = squeeze(modelOut.decValidOut.Data); for ii = 1:numFrames [refDecBits{ii},refErr{ii}] = nrCRCDecode(double(actEncBits{ii}),poly); % Extract actual decoded bits from output idx = startIdx(ii):endIdx(ii); if (vector) % For vector inputs dataOutTmp = dataOut(:,idx); validOutTmp = validOut(:,idx); decBits = dataOutTmp(:,validOutTmp); actDecBits{ii} = decBits(:); else dataOutTmp = dataOut(idx); validOutTmp = validOut(idx); decBits = dataOutTmp(validOutTmp); decBits = dec2bin(decBits,dataWidth) - '0'; actDecBits{ii} = reshape(decBits',length(refDecBits{ii}),1); end actErr{ii} = errOut(endIdx(ii)); error_data = sum(abs(refDecBits{ii} - double(actDecBits{ii}))); error_err = double(refErr{ii}) - double(actErr{ii}); fprintf(['CRC-decoded frame %d: Behavioral and ' ... 'HDL simulation differ by %d bits and %d errors\n'],ii,error_data,error_err); end
CRC-decoded frame 1: Behavioral and HDL simulation differ by 0 bits and 0 errors CRC-decoded frame 2: Behavioral and HDL simulation differ by 0 bits and 0 errors CRC-decoded frame 3: Behavioral and HDL simulation differ by 0 bits and 0 errors CRC-decoded frame 4: Behavioral and HDL simulation differ by 0 bits and 0 errors
nrCRCDecode (5G Панель инструментов) | nrCRCEncode (5G Панель инструментов)