exponenta event banner

коммуникация. HDLCRCDetector

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

Описание

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

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

  1. Создать comm.HDLCRCDetector и задайте его свойства.

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

Дополнительные сведения о работе системных объектов см. в разделе Что такое системные объекты?.

Создание

Описание

пример

CRCDet = comm.HDLCRCDetector создает объект System детектора CRC, оптимизированный для HDL, 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) создает объект System детектора CRC, оптимизированный для HDL, CRCDet, с Polynomial свойство имеет значение polyа для других указанных имен свойств установлены указанные значения.

Свойства

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

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

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

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.

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

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

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

Сведения о прямых и непрямых алгоритмах см. в разделе Коды проверки циклическим избыточным кодом.

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

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

Маска контрольной суммы, заданная как скалярный или векторный тип данных с двойной или одинарной точностью. Объект XOR устанавливает контрольную сумму с этим значением перед добавлением контрольной суммы к входным данным. Если это свойство задано как вектор, длина вектора представляет собой степень полинома генератора, заданную в 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 является действительным.

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

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

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

release(obj)

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

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

Примеры

свернуть все

Кодирование и декодирование сигнала с использованием оптимизированного для ЛПВП генератора 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™. Из этих функций можно создать ЛПВП. Объекты генератора и детектора имеют длину CRC 16 и используют полином по умолчанию.

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

Используйте логический анализатор для просмотра входных и выходных сигналов.

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