ZHCACT4 june   2023 AM2431 , AM2432 , AM2434 , AM2631 , AM2631-Q1 , AM2632 , AM2632-Q1 , AM2634 , AM2634-Q1 , AM263P4 , AM263P4-Q1 , AM3351 , AM3352 , AM3354 , AM3356 , AM3357 , AM3358 , AM3358-EP , AM3359 , AM4372 , AM4376 , AM4377 , AM4378 , AM4379 , AM5706 , AM5708 , AM5716 , AM5718 , AM5718-HIREL , AM5726 , AM5728 , AM5729 , AM5746 , AM5748 , AM5749 , AM6411 , AM6412 , AM6421 , AM6422 , AM6441 , AM6442 , AM6526 , AM6528 , AM6546 , AM6548

 

  1.   1
  2.   摘要
  3.   商标
  4. 18b-10b 线路编码简介
  5. 2用于数据发送和接收的 PRU 实现
    1. 2.1 编码和解码数据
    2. 2.2 PRU 模块接口和 GPIO 模式
    3. 2.3 用于通信的 PRU GPIO 移出和移入模式
    4. 2.4 用于通信的三通道外设接口
    5. 2.5 LVDS 和 M-LVDS 接口
  6. 3具有 CRC 模块和开销优化的系统解决方案
    1. 3.1 PRU CRC16/32 模块
    2. 3.2 编码和解码开销优化
  7. 4验证
  8. 5总结
  9. 6参考文献

编码和解码数据

通常,有四个表预先写入存储器,包括编码 5b-6b 表、编码 3b-4b 表、解码 6b-5b 表和解码 4b-3b 表。数据必须在发送之前使用查找表 (LUT) 进行编码,并在接收之后使用 LUT 进行解码。为了演示编码和解码数据,选择 Sitara™ AM243x LaunchPad™ 开发套件作为验证器件。HW_WR_REG8 函数可用于使用 Arm® 内核项目的 C 代码将四个表放入具有不同偏移地址的 PRU 动态随机存取存储器 (DRAM) 中,另请参阅以下代码。

uint32_t enc_5b6b = CSL_PRU_ICSSG0_DRAM1_SLV_RAM_BASE + ENC_5B6B_OFFS;
uint32_t enc_3b4b = CSL_PRU_ICSSG0_DRAM1_SLV_RAM_BASE + ENC_3B4B_OFFS;
uint32_t dec_5b6b = CSL_PRU_ICSSG0_DRAM0_SLV_RAM_BASE + DEC_5B6B_OFFS;
uint32_t dec_3b4b = CSL_PRU_ICSSG0_DRAM0_SLV_RAM_BASE + DEC_3B4B_OFFS;
    //Encoding LUTs (input MSB first, output LSB first)
    //LUT 5b/6b encoding
HW_WR_REG8(enc_5b6b + 0x00, 0x18);
...
    //LUT 3b/4b encoding
HW_WR_REG8(enc_3b4b + 0x00, 0x04);
...
    //Decoding LUTs (input LSB first, output MSB first)
    //LUT 6b/5b decoding
HW_WR_REG8(dec_5b6b + 0x00, INVAL);
...
    //LUT 4b/3b decoding
HW_WR_REG8(dec_3b4b + 0x00, INVAL);
...

数据可以通过使用加载字节突发 (LBBO) 指令的 PRU 固件项目中的 LUT 进行编码。LBBO 指令用于将内存中的数据块读入寄存器文件。REG_TMP11 寄存器存储 LUT 头地址,REG_ENC 寄存器存储原始数据和编码数据。请参阅以下对 8 位数据 (0x34) 进行编码的代码:

Ldi REG_ENC.b0, 0x14                       ;raw data 5b LSB
ldi REG_TMP11, (PDMEM00+LUT_5b6b_ENC)      ; TEMP11 for 5b/6b LUT header
lbbo &REG_ENC.b3, REG_TMP11, REG_ENC.b0, 1 ; FNC.b0 for original 5 bit -data, ENC.b3 for encoded 6 bit
ldi REG_ENC.b1, 0x01                       ; raw data 3b MSB
ldi REG_TMP11, (PDMEM00+LUT_3b4b_ENC)      ; TEMP11 for 3b/4b LUT header
lbbo &REG_ENC.b2, REG_TMP11, REG_ENC.b1, 1 ; FNC.b1 for original 3 bit -data, ENC.b2 for encoded 4 bit

0x34 的五个低位为 0x14,这些位 会立即加载到 REG_ENC 的字节 0 中。在 LUT 之后,将六个编码位写入 REG_ENC 的字节 3 中。0x34 的三个高位为 0x01,这些位会直接加载 到 REG_ENC 的字节 1 中。在 LUT 之后,将四个编码位写入 REG_ENC 的字节 2 中。

图 2-1 显示了原始数据和编码数据的 REG_ENC 寄存器分布。

GUID-20230606-SS0I-XT0X-SWXL-VD39BWMT8CPF-low.svg图 2-1 REG_ENC 编码寄存器分布

解码过程与编码过程几乎相同。解码过程还将 LBBO 指令与 LUT 一起,用于在接收到编码数据之后进行解码。REG_TMP11 寄存器存储 LUT 头地址,REG_DEC 寄存器存储编码数据和解码数据。

将接收六个编码位,并将其移至 REG_DEC 的字节 1 中。在 LUT 之后,将这五个解码位写入 REG_DEC 的字节 2 中。将接收四个高位,并将其移入 REG_DEC 的字节 0 中。在 LUT 之后,将这三个解码位写入 REG_DEC 的字节 3 中。要将寄存器的两个字节中的 10 位数据合并为 8 位数据,REG_DEC 的字节 3 需要左移 5 位,并与 REG_DEC 的字节 2 逻辑相加。最终解码的 8 位数据存储在 REG_DEC 的字节 0 中。以下代码显示了解码过程。

ldi REG_TMP11, (PDMEM00+LUT_5b6b_DEC)      ; TEMP11 for 5b/6b LUT header
lbbo &REG_DEC.b2, REG_TMP11, REG_DEC.b1, 1 ; decode 6b
ldi REG_TMP11, (PDMEM00+LUT_3b4b_DEC)      ; TEMP11 for 3b/4b LUT header
lbbo &REG_DEC.b3, REG_TMP11, REG_DEC.b0, 1 ; decode 4b
lsl REG_DEC.b3, REG_DEC.b3, 5              ; shift left 5 bit
add REG_DEC, REG_DEC.b2, REG_DEC.b3        ; combine to 8 bit data

图 2-2 显示了编码数据和解码数据的 REG_DEC 寄存器分布。

GUID-20230606-SS0I-L142-PHLT-WVJDXV9QLWLH-low.svg图 2-2 REG_DEC 解码寄存器分布