comm.HDLCRCDetector

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

Описание

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

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

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

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

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

Создание

Описание

пример

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 Используя Системные объекты (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