Генератор битов CRC-кода в соответствии с порождающим полиномом.
Описание
Блок General CRC Generator генерирует биты контроля циклическим избыточным кодом (cyclic redundancy check, СКС) для каждого кадра входных данных и добавляет их к кадру.
Входной сигнал, заданный в виде двоичного вектора-столбца. Длина входного кадра должна быть кратна значению параметра Checksums per frame.
Типы данных
Float64 | Boolean
Поддержка комплексных чисел
Нет
Выход
# OUT_1
—
кадр выходного кодового слова
двоичный вектор-столбец
Details
Выходной кадр кодового слова, возвращаемый в виде двоичного вектор-столбца, который наследует тип данных входного сигнала. На выходе получаются кадры входных данных с добавленными к ним последовательностями битов CRC.
Длина выходного кадра равна , где – размер входного кадра, – количество контрольных сумм в кадре, а – степень порождающего полинома.
Порождающий полином для CRC-алгоритма, заданный одним из следующих способов:
Символьное представление полинома. Пример: z^3 + z^2 + 1.
Двоичный вектор, элементы которого задают коэффициенты порождающего полинома в порядке убывания мощности. Длина этого вектора равна (), где – степень порождающего полинома. Пример: [1 1 0 1] представляет полином .
Вектор целых чисел, содержащий степени для ненулевых членов полинома в порядке убывания. Пример: [3 2 0] представляет собой многочлен .
По умолчанию используется порождающий полином CRC-16-CCITT.
В этой таблице перечислены некоторые часто используемые порождающие полиномы.
z^7 + z^2 + 1', [1 0 0 0 0 1 0 1] и [7 2 0] представляют собой один и тот же многочлен, .
Значение по умолчанию
z^16 + z^12 + z^5 + 1
Имя для программного использования
GeneratorPolynomial
Настраиваемый
Нет
#Initial states —
начальные состояния внутреннего сдвигового регистра
Details
Начальные состояния внутреннего сдвигового регистра, заданные в виде двоичного скаляра или двоичного вектора-строки с длиной, равной степени порождающего полинома.
Скалярное значение разворачивается в вектор-строку, длина которой равна степени порождающего полинома.
Установите этот флажок, чтобы использовать прямой алгоритм вычисления контрольной суммы CRC. Если флажок снят, блок использует непрямой алгоритм для вычисления контрольной суммы CRC.
Установите этот флажок, чтобы перевернуть входные данные побайтно перед вводом данных в сдвиговый регистр.
Если установлен флажок параметра Reflect input bytes, длина входного кадра, деленная на значение параметра Checksums per frame, должна быть целым числом, кратным 8.
Если флажок параметра Reflect input bytes снят, блок не переворачивает входные данные.
Значение по умолчанию
false (выключено)
Имя для программного использования
ReflectInputBytes
Настраиваемый
Нет
#Reflect checksums before final XOR —
включение отражения контрольных сумм перед последней XOR-операцией
Details
Установите этот флажок, чтобы перевернуть контрольные суммы CRC вокруг их центров после того, как входные данные полностью пройдут через сдвиговый регистр.
Если флажок параметра Reflect checksums before final XOR снят, блок не переворачивает контрольные суммы CRC.
Последняя XOR-операция, заданная в виде двоичного скаляра или двоичного вектора-строки с длиной, равной степени порождающего полинома.
Операция XOR выполняется с использованием значения параметра Final XOR с рассчитанными битами контрольной суммы CRC перед их добавлением к входным данным. Скалярное значение расширяется до вектора строк, длина которого равна степени порождающего полинома.
Значение 0 параметра Final XOR эквивалентно отсутствию операции XOR.
Значение по умолчанию
0
Имя для программного использования
FinalXOR
Настраиваемый
Нет
#Checksums per frame —
количество контрольных сумм, вычисляемых для каждого кадра
Details
Количество контрольных сумм, вычисляемых для каждого кадра, заданное в виде положительного целого числа.
Значение по умолчанию
1
Имя для программного использования
ChecksumsPerFrame
Настраиваемый
Нет
Алгоритмы
Прямой и непрямой алгоритмы CRC
Блок General CRC Generator поддерживает генерацию контрольной суммы CRC с помощью алгоритма косвенного или прямого CRC.
Непрямой алгоритм CRC
Алгоритм непрямого CRC-преобразования принимает двоичный вектор данных, соответствующий многочлену , и добавляет контрольную сумму из бит, соответствующую многочлену .
Каскадное связывания входного вектора и контрольной суммы соответствует многочлену , поскольку умножение на соответствует сдвигу входного вектора на несколько бит влево. Алгоритм выбирает контрольную сумму так, чтобы была кратна заранее определенному многочлену степени , называемому порождающим полиномом.
Алгоритм делит на , и устанавливает контрольную сумму равной двоичному вектору, соответствующему остатку. То есть, если , где – полином степени меньше , то контрольной суммой будет двоичный вектор, соответствующий . При необходимости алгоритм добавляет нули к контрольной сумме, чтобы она имела длину .
Функция генерации CRC, которая реализует фазу передачи алгоритма CRC, делает следующее:
Сдвигает влево вектор входных данных на бит и делит полученный многочлен на .
Устанавливает контрольную сумму равной двоичному вектору длины , соответствующему остатку от шага 1.
Добавляет контрольную сумму к вектору входных данных. Результатом является выходной вектор.
Функция обнаружения CRC вычисляет контрольную сумму для всего входного вектора, как описано выше.
Алгоритм CRC использует двоичные векторы для представления двоичных полиномов в порядке убывания их силы. Например, вектор [1 1 0 1] представляет полином .
Биты поступают в регистр сдвига с линейной обратной связью (linear feedback shift register, LFSR) в порядке от младшего бита к старшему. Последовательность входных битов сообщения представляет собой коэффициенты полинома сообщения в порядке убывания мощности. Вектор сообщений дополняется нулями, чтобы вымыть LFSR, где – степень порождающего полинома. Если на выходе левого каскада регистра d(1) стоит 1, то выполняется операция XOR битов cдвигового регистра с коэффициентами порождающего полинома. Когда дополненная последовательность сообщений полностью проходит через LFSR, в регистре остается контрольная сумма [d(1) d(2) … d(r)]. Это реализация двоичного длинного деления, в котором последовательность сообщений является делителем (числителем), а полином – делимым (знаменателем). Контрольная сумма CRC – это остаток от операции деления.
Прямой алгоритм CRC
На блок-схеме показан алгоритм прямого CRC.
Здесь Ввод блока сообщений – это , а Вывод кодового слова – это
Начальный этап прямого CRC-кодирования происходит, когда три переключателя находятся в положении . Алгоритм подает на кодер биты сообщения . Эти биты являются первыми битами выходного кодового слова. Одновременно алгоритм посылает битов в регистр сдвига с линейной обратной связью (LFSR). Когда система полностью передает все бит сообщения в LFSR, переключатели переходят в положение . Здесь LFSR содержит математический остаток от деления полинома. Эти биты смещаются из LFSR и являются оставшимися битами (контрольной суммой) на выходе кодового слова.
Работа генератора CRC
Генератор CRC добавляет контрольные суммы CRC к входному кадру в соответствии с заданным порождающим полиномом и числом контрольных сумм на кадр.
Для определенного начального состояния внутреннего сдвигового регистра и контрольных сумм на входной кадр:
Входной сигнал делится на подкадров одинакового размера.
Каждому из субкадру соответствует префикс из вектора начальных состояний.
К каждому подкадру применяется алгоритм CRC.
Полученные контрольные суммы добавляются в конец каждого субкадра.
Подкадры объединяются и выводятся в виде вектор-столбцов. Для сценария, показанного здесь, на вход подается 10-битный кадр, порождающий полином вычисляет контрольную сумму CRC, начальное состояние равно 0, а количество контрольных сумм на кадр равно 2.
Входной кадр делится на два подкадра размером 5, и контрольные суммы размером 3 вычисляются и добавляются к каждому подкадру. Начальные состояния не показаны, поскольку начальное состояние [0] не влияет на результат работы алгоритма CRC. Выходной кадр переданного кодового слова имеет размер 5 + 3 + 5 + 3 = 16 бит.