comm.HDLCRCGenerator

Сгенерируйте биты CRC кода и добавьте к входным данным

Описание

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

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

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

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

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

Создание

Описание

пример

CRCGen = comm.HDLCRCGenerator создает оптимизированный HDL Системный объект генератора CRC, 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 Используя Системные объекты (MATLAB).

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

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

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

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

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

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

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

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

Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием 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{:})

Алгоритмы

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

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

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

Объекты

Блоки

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