PCRC

简介

循环冗余校验(CRC)计算单元使用多项式发生器从 8 位/16 位/32 位数据字生成 CRC 码。基于 CRC 的技术也常用于众多应用中验证数据传输或存储的完整性。

主要特性

PCRC 的主要特性如下:

  • 支持完全可编程的奇多项式,CRC 宽度可编程(7、8、16、32 位)。

  • 支持间接访问 32 位数据寄存器。

  • 支持对于 32/16/8 位数据宽度分别在 4/2/1 个系统时钟周期内完成 CRC 计算。

  • 支持 I/O 数据的可逆选项。

功能描述

数据访问

CRC 计算单元有一个单一的 32 位读/写数据寄存器 (PCRC_DR)。它用于输入新数据(写访问),并保存先前 CRC 计算的结果(读访问)。

对数据寄存器的每次写操作都会将先前的 CRC 值(存储在 PCRC_DR 中)与新值组合。

PCRC_DR 寄存器可以通过字(word)、右对齐半字(half-word)和右对齐字节(byte)访问。对于其他寄存器,只允许 32 位访问。

输入缓冲区允许立即写入第二个数据,而无需等待先前 CRC 计算导致的任何等待状态。

可以动态调整数据宽度,以最小化给定字节数的写访问次数。例如,对 5 个字节的 CRC 可以通过一次字写和一次字节写来计算。

输入/输出反转 (REV_IN/OUT)

反转操作可以在 8 位、16 位和 32 位上执行,具体取决于 PCRC_CR 寄存器中的 REV_IN 位;以及根据 PCRC_CR 寄存器中的 REV_OUT 位对整个字进行位反转。

CRC 初始化/复位

PCRC_CR 中的复位控制可以将 PCRC_DR 初始化为 PCRC_INIT 寄存器中存储的可编程值。

在写访问 PCRC_INIT 寄存器时,PCRC_DR 寄存器会自动初始化。

PCRC_IDR 寄存器可用于保存与 CRC 计算相关的临时值。它不受 PCRC_CR 寄存器中 RESET 位的影响。

Note

  • PCRC_IDR 计算保存的 CRC 值,其初始值为其复位时的值(全F),而不是由 PCRC_INIT 寄存器配置的值;

  • 读取 PCRC_CR 和 PCRC_IDR 的 CRC 值,其结果无异或操作,需由软件完成。

多项式可编程性

多项式系数通过 PCRC_POLY 寄存器完全可编程,并且可以通过编程 PCRC_CR 寄存器中的 POLYSIZE[1:0] 位将多项式大小配置为 7、8、16 或 32 位。不支持偶多项式。

为了获得可靠的 CRC 计算,不能在 CRC 计算过程中动态更改多项式值或大小。因此,如果 CRC 计算正在进行,应用程序必须在更改多项式之前进行复位。

默认多项式值是 CRC-32(以太网)多项式:0x4C11DB7。

POLYSIZE 为 32 位,INIT 值为 0xFFFFFFF,CRC 结果异或值固定为 0,REV_IN 为 0,REV_OUT 为 0。

参考CRC-32/MPEG-2 规则。

\[X^{32} + X^{26} + X^{23} + X^{22} + X^{16} + X^{12} + X^{11} + X^{10} + X^{8} + X^{7} + X^{5} + X^{4} + X^{2} + X + 1\]

PCRC 模块框图如下所示:

PCRC 模块框图

图 3.1: PCRC 模块框图

寄存器

PCRC 寄存器

PCRC 中的寄存器及其对应偏移量如下表所示:

表 4.1: PCRC 中寄存器的偏移地址

偏移

寄存器名称

功能描述

0x0

PCRC_DR

CRC 数据寄存器

0x4

PCRC_IDR

CRC 独立数据寄存器

0x8

PCRC_CR

CRC 控制寄存器

0xC

PCRC_INIT

CRC 初始值寄存器

0x10

PCRC_POLY

CRC 多项式寄存器

0x14

PCRC_IP_VER

PCRC IP 版本寄存器

PCRC_DR

地址偏移:0x0

表 4.2: PCRC_DR 寄存器格式

字段

位

访问

复位值

描述

DR

31:0

RW

32’hFFFF_FFFF

  • 数据寄存器位。

  • 此寄存器用于向 CRC 计算器写入新数据。

  • 读取时,它保存先前 CRC 计算的结果。

  • 如果数据大小小于 32 位,则使用最低有效位来写入/读取正确的值。

PCRC_IDR

地址偏移:0x4

表 4.3: PCRC_IDR 寄存器格式

字段

位

访问

复位值

描述

IDR

31:0

RO

32’hFFFF_FFFF

  • 通用 32 位数据寄存器位。

  • 这些位可以用作四个字节的临时存储位置。

  • 读取时,它保存先前 CRC 计算的结果。

  • 该寄存器不受 PCRC_CR 寄存器中 RESET 位生成的 CRC 复位影响。

PCRC_CR

地址偏移:0x8

表 4.4: PCRC_CR 寄存器格式

字段

位

访问

复位值

描述

RESET

0

RW

0x0

  • 复位。

  • 此位由软件设置,用于复位 CRC 计算单元并将数据寄存器设置为 PCRC_INIT 寄存器中存储的值。

  • 此位只能设置,由硬件自动清除。

保留

2:1

/

0x0

/

POLYSIZE

4:3

RW

0x0

多项式大小。这些位控制多项式的大小
  • 2’b00: 32 位多项式

  • 2’b01: 16 位多项式

  • 2’b10: 8 位多项式

  • 2’b11: 7 位多项式

REV_IN

6:5

RW

0x0

反转输入数据。这些位控制输入数据位序的反转
  • 2’b00: 位序不受影响

  • 2’b01: 按字节进行位反转

  • 2’b10: 按半字进行位反转

  • 2’b11: 按字进行位反转

REV_OUT

7

RW

0x0

反转输出数据。这些位控制输出数据位序的反转
  • 1’b0: 位序不受影响

  • 1’b1: 位反转输出格式

保留

31:8

/

0x0

/

PCRC_INIT

地址偏移:0xC

表 4.5: PCRC_INIT 寄存器格式

字段

位

访问

复位值

描述

PCRC_INIT

31:0

RW

32’hFFFF_FFFF

可编程的 CRC 初始值。此寄存器用于写入 CRC 初始值。

PCRC_POLY

地址偏移:0x10

表 4.6: PCRC_POLY 寄存器格式

字段

位

访问

复位值

描述

CRC_POLY

31:0

RW

32’h04C1_1DB7

  • 可编程多项式。

  • 此寄存器用于写入用于 CRC 计算的多项式系数。

  • 如果多项式大小小于 32 位,则必须使用最低有效位来编程正确的值。(仅限奇数多项式)

PCRC_IP_VER

地址偏移:0x14

表 4.7: PCRC_IP_VER 寄存器格式

字段

位

访问

复位值

描述

PCRC_IP_VER

31:0

RO

0x0001_0000

32 位版本号:
  • [31:24] 保留

  • [23:16] 主版本号

  • [15:8] 次版本号

  • [7:0] 补丁版本号