comm.HDLCRCDetector

Обнаружьте ошибки во входных данных с помощью CRC

Описание

Эта оптимизированная HDL Система детектора циклического избыточного кода (CRC) object™ вычисляет контрольную сумму на входных данных и сравнивает результат с входной контрольной суммой. Вместо обработки системы координат, HDLCRCDetector Системный объект обрабатывает данные о потоковой передаче. Объект имеет управляющие сигналы синхронизации системы координат для обоих потоков входных и выходных данных.

Вычислить и сравнить контрольные суммы:

  1. Создайте comm.HDLCRCDetector объект и набор его свойства.

  2. Вызовите объект с аргументами, как будто это была функция.

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты?.

Создание

Описание

пример

CRCDet = comm.HDLCRCDetector создает оптимизированный HDL Системный объект детектора CRC, CRCDet, это обнаруживает ошибки во входных данных согласно заданному полиному генератора.

CRCDet = comm.HDLCRCDetector(Name,Value)свойства наборов с помощью одной или нескольких пар "имя-значение". Заключите каждое имя свойства в одинарные кавычки. Например,

CRCDet = comm.HDLCRCDetector('Polynomial',[1 0 0 0 1 0 0 0 0], ...
'FinalXORValue',[1 1 0 0 0 0 0 0]);
задает полином CRC8 и 8-битное значение к XOR с итоговой контрольной суммой.

CRCDet = comm.HDLCRCDetector(poly,Name,Value) создает оптимизированный HDL Системный объект детектора CRC, CRCDet, с Polynomial набор свойств к poly, и другой заданный набор имен свойства к заданным значениям.

Свойства

развернуть все

Если в противном случае не обозначено, свойства являются ненастраиваемыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируют, когда вы вызываете их, и release функция разблокировала их.

Если свойство является настраиваемым, можно изменить его значение в любое время.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты.

Полином генератора в виде бинарного вектора, с коэффициентами в порядке убывания степеней. Длина вектора должна быть равна степени полинома плюс 1.

Начальные условия сдвигового регистра в виде двоичного файла, скаляра с одинарной точностью или с двойной точностью или вектора. Если вы задаете это свойство как вектор, длина вектора является степенью полинома генератора, который вы задаете в Polynomial свойство. Если вы задаете это свойство как скаляр, объект расширяет значение до вектора из длины, равной степени полинома генератора.

Метод вычисления контрольной суммы в виде логического скаляра. Когда этим свойством является true, объект использует прямой алгоритм для вычислений контрольной суммы CRC.

Чтобы узнать о прямых и непрямых алгоритмах, см. Коды Контроля циклическим избыточным кодом.

Введите порядок байтов в виде логического скаляра. Когда этим свойством является true, объект инвертирует входные данные на bytewise основе, прежде чем он введет сдвиговый регистр.

Порядок байтов контрольной суммы в виде логического скаляра. Когда этим свойством является true, объект инвертирует контрольную сумму выхода CRC вокруг своего центра.

Маска контрольной суммы в виде двоичного файла, дважды или скаляр типа данных с одинарной точностью или вектор. Объект XORs контрольная сумма с этим значением прежде, чем добавить контрольную сумму к входным данным. Если вы задаете это свойство как вектор, длина вектора является степенью полинома генератора, который вы задаете в Polynomial свойство. Если вы задаете это свойство как скаляр, объект расширяет значение до вектора из длины, равной степени полинома генератора.

Использование

Описание

[Y,startOut,endOut,validOut,err] = CRCn(X,startIn,endIn,validIn) вычисляет контрольные суммы CRC для входного сигнала X на основе управляющих сигналов и сравнивает вычисленную контрольную сумму с входной контрольной суммой. Если эти две контрольных суммы не равны, выход err установлен в 1 true).

Входные параметры

развернуть все

Входной сигнал и добавленная контрольная сумма в виде бинарного вектора или скалярного целого числа, представляющего несколько битов. Например, векторный вход [0,0,0,1,0,0,1,1] эквивалентно uint8 вход 19.

Если вход является вектором, тип данных может быть двойным или логическим. Если вход является скаляром, тип данных может быть беззнаковым целым или фиксированной точкой без знака с 0 дробными битами (fi([],0,N,0)).

X может быть часть или все сообщение, которое будет проверяться.

Длина X должно быть меньше чем или равно продолжительности CRC, и продолжительность CRC должна быть делимой длиной X.

Продолжительность CRC является порядком полинома, который вы задаете в Polynomial свойство.

Типы данных: double | uint8 | uint16 | uint32 | logical | unsigned fi

Запустите входного сигнала в виде логического скаляра.

Конец входного сигнала в виде логического скаляра.

Валидность входных данных в виде логического скаляра. Когда validIn 1 (true), объект вычисляет контрольную сумму CRC для входа X.

Выходные аргументы

развернуть все

Обменивайтесь сообщениями с удаленной контрольной суммой, возвращенной как скалярное целое число или вектор столбца двоичных данных с той же шириной и типом данных как вход X.

Запустите входного сигнала, возвращенного как логический скаляр.

Конец входного сигнала, возвращенного как логический скаляр.

Валидность входных данных, возвращенных как логический скаляр. Когда validOut 1 (true), выходные данные Y isvalid.

Несоответствие контрольной суммы, возвращенное как логический скаляр. err 1 (true) когда входная контрольная сумма не совпадает с расчетной контрольной суммой.

Функции объекта

Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj, используйте этот синтаксис:

release(obj)

развернуть все

stepЗапустите алгоритм Системного объекта
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта

Примеры

свернуть все

Закодируйте и декодируйте сигнал с помощью оптимизированных HDL Системных объектов генератора и детектора CRC. В этом примере показано, как включать каждый объект в функцию для генерации HDL-кода.

Создайте 32-битное сообщение, которое будет закодировано в двух 16-битных столбцах.

msg = randi([0 1],16,2);

Запуститесь для 12 шагов, чтобы вместить задержку обоих объектов. Присвойте управляющие сигналы для всех шагов. Первые две выборки являются допустимыми данными, и остаток обрабатывает задержку.

numSteps = 12;
startIn = logical([1 0 0 0 0 0 0 0 0 0 0 0]);
endIn   = logical([0 1 0 0 0 0 0 0 0 0 0 0]);
validIn = logical([1 1 0 0 0 0 0 0 0 0 0 0]);

Передайте случайный вход HDLCRCGenerator Система object™, в то время как это обрабатывает входной сигнал. Случайные данные не закодированы, потому что входом допустимый сигнал является 0 для шагов 3 - 10.

randIn = randi([0, 1],16,numSteps-2);
dataIn = [msg randIn];

Запишите функцию, которая создает и вызывает каждую Систему object™. Можно сгенерировать HDL от этих функций. Генератор и детектор возражают, и имейте продолжительность CRC 16 и используйте полином по умолчанию.

Примечание: Этот объектный синтаксис запускается только в R2016b или позже. Если вы используете более ранний релиз, заменяете каждый вызов объекта с эквивалентным step синтаксис. Например, замените myObject(x) с step(myObject,x).

function [dataOut,startOut,endOut,validOut] = HDLCRC16Gen(dataIn,startIn,endIn,validIn)
%HDLCRC16Gen
% Generates CRC checksum using the comm.HDLCRCGenerator System object(TM)
% dataIn is a binary column vector. 
% startIn, endIn, and validIn are logical scalar values.
% You can generate HDL code from this function.

  persistent crcg16;
  if isempty(crcg16)
    crcg16 = comm.HDLCRCGenerator()
  end    
  [dataOut,startOut,endOut,validOut] = crcg16(dataIn,startIn,endIn,validIn);
end


function [dataOut,startOut,endOut,validOut,err] = HDLCRC16Det(dataIn,startIn,endIn,validIn)
%HDLCRC16Det
% Checks CRC checksum using the comm.HDLCRCDetector System object(TM)
% dataIn is a binary column vector. 
% startIn, endIn, and validIn are logical scalar values.
% You can generate HDL code from this function.

  persistent crcd16;
  if isempty(crcd16)
    crcd16 = comm.HDLCRCDetector()
  end    
  [dataOut,startOut,endOut,validOut,err] = crcd16(dataIn,startIn,endIn,validIn);
end


Вызовите функцию генератора CRC. Закодированное сообщение является исходным сообщением плюс контрольная сумма на 16 битов.

 for i =  1:numSteps
 [dataOutGen(:,i),startOutGen(i),endOutGen(i),validOutGen(i)] = ...
     HDLCRC16Gen(logical(dataIn(:,i)),startIn(i),endIn(i),validIn(i));
 end
crcg16 = 

  comm.HDLCRCGenerator with properties:

            Polynomial: [1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1]
          InitialState: 0
          DirectMethod: false
          ReflectInput: false
    ReflectCRCChecksum: false
         FinalXORValue: 0

Добавьте шум путем зеркального отражения немного в сообщении.

dataOutNoise = dataOutGen;
dataOutNoise(2,4) = ~dataOutNoise(2,4);

Вызовите функцию детектора CRC. Выход детектора является входным сигналом с удаленной контрольной суммой. Если входная контрольная сумма не была правильна, err флаг установлен с последним словом выхода.

for i = 1:numSteps
[dataOut(:,i),startOut(i),endOut(i),validOut(i),err(i)] = ...
    HDLCRC16Det(logical(dataOutNoise(:,i)),startOutGen(i),endOutGen(i),validOutGen(i));
end
crcd16 = 

  comm.HDLCRCDetector with properties:

            Polynomial: [1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1]
          InitialState: 0
          DirectMethod: false
          ReflectInput: false
    ReflectCRCChecksum: false
         FinalXORValue: 0

Используйте Logic Analyzer, чтобы просмотреть сигналы ввода и вывода.

channels = {'validIn','startIn','endIn',...
    {'dataIn','Radix','Hexadecimal'},...
    'validOutGen','startOutGen','endOutGen',...
    {'dataOutGen','Radix','Hexadecimal'},...
    {'dataOutNoise','Radix','Hexadecimal'},...
    'validOut','startOut','endOut','err',...
    {'dataOut','Radix','Hexadecimal'}};
la = dsp.LogicAnalyzer('Name','CRC Encode and Decode','NumInputPorts',length(channels),...
                      'BackgroundColor','Black','DisplayChannelHeight',8);

 for ii = 1:length(channels)
    if iscell(channels{ii})
        % Display data signals as hexadecimal integers
        c = channels{ii};
        modifyDisplayChannel(la,ii,'Name',c{1},c{2},c{3})
        % Convert binary column vector to integer
        dat2 = uint16(bi2de(eval(c{1})'));
        chanData{ii} = squeeze(dat2);
    else
        modifyDisplayChannel(la,ii,'Name',channels{ii})
        chanData{ii} = squeeze(eval(channels{ii})');
    end
 end
la(chanData{:})

Алгоритмы

развернуть все

Расширенные возможности

Смотрите также

Объекты

Блоки

Представленный в R2012b