AnyMath 文档

通用 CRC 生成器

根据生成多项式的 CRC 码位生成器。

模块类型: GeneralCRCGenerator

库中的路径:

/Communication Systems/Error Detection And Correction/CRC/General CRC Generator

说明

通用 CRC 生成器 块为每个输入数据帧生成循环冗余校验(CCS)位,并将其附加到数据帧中。

端口

输入

# IN_1 — 输入信号
二进制列向量

Details

以二进制列向量形式指定的输入信号。输入帧的长度必须是 *每帧校验和 * 参数值的倍数。

数据类型

Float64|Boolean.

复数支持

无

输出

# OUT_1 — 输出码元帧
二进制列向量

Details

以二进制列向量形式返回的编码词输出帧,继承了输入信号的数据类型。输出是输入数据帧,并附加 CRC 位序列。

输出帧的长度为 ,其中 是输入帧的大小, 是帧中校验和的个数, 是生成多项式的阶数。

数据类型

Float64 | Boolean.

复数支持

无

参数

参数

# 生成多项式 — 生成多项式
String

Details

CRC 算法的生成多项式,以下列方式之一指定:

  • 多项式的符号表示。例如z^3 + z^2 + 1`。

  • 二进制向量,其元素按幂次排列,指定生成多项式的系数。该向量的长度为 ( ),其中 是生成多项式的阶数。例如`[1 1 0 1 1]` 表示多项式 。

  • 一个整数向量,按降序包含多项式非零项的度数 。例如`[3 2 0 0]` 表示多项式 。

默认使用 CRC-16-CCITT 生成多项式。

下表列出了一些常用的生成多项式。

CRC 算法名称

生成多项式 CRC-31

CRC-32

z^32 + z^26 + z^23 + z^22 + z^16 + z^12 + z^11 + z^10 + z^8 + z^7 + z^5 + z^4 + z^2 + z + 1

CRC-24

z^24 + z^23 + z^14 + z^12 + z^8 + 1.

CRC-16

z^16 + z^15 + z^2 + 1

CRC-16-CCITT

z^16 + z^12 + z^5 + 1

反向 CRC-16

z^16 + z^14 + z + 1

CRC-8

z^8 + z^7 + z^6 + z^4 + z^2 + 1

CRC-4

z^4 + z^3 + z^2 + z + 1

示例:z^7 + z^2 + 1'、[1 0 0 0 0 0 0 1 0 1 0 1] 和 [7 2 0 0] 表示同一个多项式, 。

默认值

z^16 + z^12 + z^5 + 1

程序使用名称

GeneratorPolynomial

可调谐

无

可计算

无

# 初始状态 — 内部移位寄存器的初始状态

Details

内部移位寄存器的初始状态,指定为二进制标量或二进制向量字符串,长度等于生成多项式的阶数。

标量值将扩展为长度等于生成多项式阶数的矢量字符串。

默认值

0

程序使用名称

InitialStates

可调谐

无

可计算

是

# 直接法 — 采用直接算法计算校验和
Logical

Details

选择该复选框可使用直接算法计算 CRC 校验和。如果不选中,设备将使用间接算法计算 CRC 校验和。

默认值

false (关掉)

程序使用名称

DirectMethod

可调谐

无

可计算

无

# 反射输入字节 — 启用输入字节反射
Logical

Details

选择该复选框可在将数据输入移位寄存器前逐个字节翻转输入数据。

  • 如果选中* 反映输入字节*复选框,则输入帧长度除以*每帧校验和*值必须是`8`的整数倍。

  • 如果未选中* 反映输入字节*参数,程序块不会翻转输入数据。

默认值

false (关掉)

程序使用名称

ReflectInputBytes

可调谐

无

可计算

无

# 最终异或前反射校验和 — 在最后一次 XOR 操作前启用校验和反射
Logical

Details

选择该复选框可在输入数据完全通过移位寄存器后,围绕其中心翻转 CRC 校验和。

  • 如果取消选中 * 在最终 XOR* 之前反映校验和,则程序块不会翻转 CRC 校验和。

默认值

false (关掉)

程序使用名称

ReflectChecksums

可调谐

无

可计算

无

# 最终异或 — 最后一次 XOR 运算

Details

指定为二进制标量或二进制字符串向量的最后一次 XOR 运算,其长度等于生成多项式的阶数。

XOR 操作是使用 Final XOR 参数值与计算出的 CRC 校验位进行的,然后再将其添加到输入数据中。标量值将扩展为长度等于生成多项式阶数的字符串矢量。

  • Final XOR 参数的 0 值等同于无 XOR 操作。

默认值

0

程序使用名称

FinalXOR

可调谐

无

可计算

是

# 每帧校验和 — 为每个帧计算的校验和数
Int64 integer

Details

为每个帧计算的校验和的个数,以正整数表示。

默认值

1

程序使用名称

ChecksumsPerFrame

可调谐

无

可计算

是

算法

直接和间接 CRC 算法

通用 CRC 生成器 设备支持使用间接或直接 CRC 算法生成 CRC 校验和。

间接 CRC 算法

间接 CRC 算法采用与多项式 相对应的二进制数据向量,并添加与多项式 相对应的 位校验和。

输入向量和校验和的级联对应于多项式 ,因为乘以 相当于将输入向量 向左移动几个比特。算法选择校验和 ,使 是一个度数为 的预定多项式 的倍数,该多项式称为_生成多项式_。

算法将 除以 ,并将校验和设置为与余数对应的二进制向量。也就是说,如果 ,其中 是一个度数小于 的多项式,那么校验和就是与 对应的二进制向量。如有必要,算法会在校验和中添加零,使其长度为 。

CRC 生成函数实现了 CRC 算法的传输阶段,其功能如下:

  1. 将输入数据矢量向左移动 位,并将得到的多项式除以 。

  2. 将校验和设置为长度为 的二进制向量,相当于步骤 1 的余数。

  3. 将校验和与输入向量相加。结果就是输出向量。

如上所述,CRC 检测功能计算整个输入向量的校验和。

CRC 算法使用二进制矢量来表示二进制多项式,按强度从大到小的顺序排列。例如,向量 [1 1 0 1 1] 表示多项式 。

general crc generator 1

比特按照从最低比特到最高比特的顺序进入线性反馈移位寄存器(线性反馈移位寄存器,LFSR)。输入信息比特序列表示信息多项式系数的幂次降序。 是生成多项式的阶数,信息矢量用 0 进行扩充,以冲出 LFSR。如果左寄存器级 d(1) 的输出为 1,则对移位寄存器的位与生成多项式的系数进行 XOR 运算。当增强信息序列完全通过 LFSR 时,寄存器中将保留一个校验和 [d(1) d(2) …​ d(r)]。这是二进制长除法的实现,其中信息序列是被除数(分子),多项式是除数(分母)。CRC 校验和是除法运算的余数。

直接 CRC 算法

框图显示了直接 CRC 算法。

general crc generator 2 cn

这里_信息块输入_是 ,_代码字输出_是

直接 CRC 编码的初始阶段发生在三个开关处于 的位置时。算法向编码器输入信息位 。这些比特是输出编码字的第一个 比特。同时,算法将 位发送到线性反馈移位寄存器(LFSR)。当系统将信息的所有 位完全传输到线性反馈移位寄存器后,开关移动到 。在这里,LFSR 包含多项式除法的数学余数。这些比特将从 LFSR 中移出,成为码字输出端的剩余比特(校验和)。

CRC 发生器的操作

CRC 发生器根据指定的生成多项式和每帧校验和的数量,将 CRC 校验和添加到输入帧中。

对于给定的内部移位寄存器初始状态和 每个输入帧的校验和:

  1. 输入信号被分为大小相等的 子帧。

  2. 每个 子帧对应初始状态向量中的一个前缀。

  3. CRC 算法应用于每个子帧。

  4. 得到的校验和被添加到每个子帧的末尾。

  5. 子帧合并后作为矢量列输出。在这里显示的情况下,输入 10 位帧,生成多项式 计算 CRC 校验和,初始状态为 "0",每帧的校验和数量为 "2"。

general crc generator 3 cn

输入帧被分为两个大小为 5 的子帧,计算出大小为 3 的校验和并添加到每个子帧中。初始状态没有显示,因为初始状态"[0]"不会影响 CRC 算法的结果。传输码字的输出帧为 5 + 3 + 5 + 5 + 3 = 16 比特。

文献

  1. Sklar, Bernard."数字通信:基础与应用》。Englewood Cliffs, N.J.: Prentice-Hall, 1988.

  2. Wicker, Stephen B. "Error Control Systems for Digital Communication and Storage." Upper Saddle River, N.J.: Prentice Hall, 1995.