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
通常,有四个表预先写入存储器,包括编码 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 ®_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 ®_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 寄存器分布。
解码过程与编码过程几乎相同。解码过程还将 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 ®_DEC.b2, REG_TMP11, REG_DEC.b1, 1 ; decode 6b
ldi REG_TMP11, (PDMEM00+LUT_3b4b_DEC) ; TEMP11 for 3b/4b LUT header
lbbo ®_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 寄存器分布。