В этом примере показов, как использовать блоки NR CRC Энкодера и NR CRC Decoder Simulink ® и сравнить аппаратно оптимизированные результаты с результатами из функций 5G Toolbox™ nrCRCEncode
(5G Toolbox) и nrCRCDecode
(5G Toolbox), соответственно. Эти блоки поддерживают скалярные и векторные входы. Блоки NR CRC Encoder и NR CRC Decoder поддерживают генерацию кода оборудования.
Сгенерируйте случайные системы координат входных данных и управляющего сигнала, который указывает контуры системы координат. Зазор системы координат соответствует задержке блока Энкодера 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);
HDLNCRCEncodeDecode подсистема содержит HDL NR CRC Encoder и HDL NR CRC Decoder подсистемы, которые содержат NR CRC Encoder и NR CRC Decoder блоки Выполнение модели импортирует переменные входного сигнала 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');
Подсистема HDL NR Энкодера содержит блок NR CRC Encoder. Преобразуйте потоковые данные, выводимые блоком NR CRC Encoder, в системы координат, а затем сравните выходные системы координат с выходом nrCRCEncode
5G Toolbox.
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
Подсистема HDL NR CRC Decoder содержит блок NR CRC Decoder. Выходные выходы подсистемы Энкодера HDL NR предоставляются в качестве входов подсистеме декодера CRC HDL NR. Подсистема HDL NR CRC Decoder экспортирует поток декодированных выходных выборок decSampleOut и decErrOut вместе с управляющим сигналом decCtrlOut в рабочее рабочее пространство MATLAB. Сравните их с выходами 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 Toolbox) | nrCRCEncode
(5G Toolbox)