exponenta event banner

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

Создание битов кода CRC и добавление к входным данным

Описание

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

Для генерации битов циклического избыточного кода:

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

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

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

Создание

Описание

пример

CRCGen = comm.HDLCRCGenerator создает объект System генератора CRC, оптимизированный для HDL, CRCGen. Этот объект генерирует биты CRC в соответствии с указанным полиномом генератора и добавляет их к входным данным.

CRCGen = comm.HDLCRCGenerator(Name,Value) задает свойства, используя одну или несколько пар имя-значение. Заключите каждое имя свойства в отдельные кавычки. Например,

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

CRCGen = comm.HDLCRCGenerator(poly,Name,Value) устанавливает Polynomial свойство для polyи другие указанные имена свойств для указанных значений.

Свойства

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

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

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

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

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

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

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

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

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

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

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

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

Описание

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

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

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

Входное сообщение, указанное как двоичный вектор или скалярное целое число, представляющее несколько битов. Например, векторный ввод [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 с добавленной контрольной суммой, возвращаемой в виде скалярного целого или двоичного вектора столбца с той же шириной и типом данных, что и входной X.

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

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

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

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

Чтобы использовать функцию объекта, укажите объект 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{:})

Алгоритмы

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

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

.
Представлен в R2012a