.. _soc_ip_pcrc: PCRC ############## .. toctree:: :maxdepth: 3 :caption: 目录: .. contents:: 目录 :depth: 4 简介 -------- 循环冗余校验(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 规则。 .. math:: 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 模块框图如下所示: .. figure:: /assets/images/pcrc_block.png :alt: PCRC 模块框图 :align: center 图 3.1: PCRC 模块框图 寄存器 ----------- PCRC 寄存器 ~~~~~~~~~~~~~~~~~ PCRC 中的寄存器及其对应偏移量如下表所示: .. list-table:: 表 4.1: PCRC 中寄存器的偏移地址 :header-rows: 1 :widths: auto * - 偏移 - 寄存器名称 - 功能描述 * - 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 .. list-table:: 表 4.2: PCRC_DR 寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DR - 31:0 - RW - 32'hFFFF_FFFF - - 数据寄存器位。 - 此寄存器用于向 CRC 计算器写入新数据。 - 读取时,它保存先前 CRC 计算的结果。 - 如果数据大小小于 32 位,则使用最低有效位来写入/读取正确的值。 PCRC_IDR ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x4 .. list-table:: 表 4.3: PCRC_IDR 寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - IDR - 31:0 - RO - 32'hFFFF_FFFF - - 通用 32 位数据寄存器位。 - 这些位可以用作四个字节的临时存储位置。 - 读取时,它保存先前 CRC 计算的结果。 - 该寄存器不受 PCRC_CR 寄存器中 RESET 位生成的 CRC 复位影响。 PCRC_CR ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x8 .. list-table:: 表 4.4: PCRC_CR 寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 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 .. list-table:: 表 4.5: PCRC_INIT 寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - PCRC_INIT - 31:0 - RW - 32'hFFFF_FFFF - 可编程的 CRC 初始值。此寄存器用于写入 CRC 初始值。 PCRC_POLY ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x10 .. list-table:: 表 4.6: PCRC_POLY 寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - CRC_POLY - 31:0 - RW - 32'h04C1_1DB7 - - 可编程多项式。 - 此寄存器用于写入用于 CRC 计算的多项式系数。 - 如果多项式大小小于 32 位,则必须使用最低有效位来编程正确的值。(仅限奇数多项式) PCRC_IP_VER ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移:0x14 .. list-table:: 表 4.7: PCRC_IP_VER 寄存器格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - PCRC_IP_VER - 31:0 - RO - 0x0001_0000 - 32 位版本号: - [31:24] 保留 - [23:16] 主版本号 - [15:8] 次版本号 - [7:0] 补丁版本号