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 规则。
PCRC 模块框图如下所示:
图 3.1: PCRC 模块框图
寄存器
PCRC 寄存器
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
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
DR |
31:0 |
RW |
32’hFFFF_FFFF |
|
PCRC_IDR
地址偏移:0x4
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
IDR |
31:0 |
RO |
32’hFFFF_FFFF |
|
PCRC_CR
地址偏移:0x8
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
RESET |
0 |
RW |
0x0 |
|
保留 |
2:1 |
/ |
0x0 |
/ |
POLYSIZE |
4:3 |
RW |
0x0 |
|
REV_IN |
6:5 |
RW |
0x0 |
|
REV_OUT |
7 |
RW |
0x0 |
|
保留 |
31:8 |
/ |
0x0 |
/ |
PCRC_INIT
地址偏移:0xC
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
PCRC_INIT |
31:0 |
RW |
32’hFFFF_FFFF |
可编程的 CRC 初始值。此寄存器用于写入 CRC 初始值。 |
PCRC_POLY
地址偏移:0x10
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
CRC_POLY |
31:0 |
RW |
32’h04C1_1DB7 |
|
PCRC_IP_VER
地址偏移:0x14
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
PCRC_IP_VER |
31:0 |
RO |
0x0001_0000 |
|