《PCI Express体系结构导读15》-- DMA读写TLP 以下均以书中的Capric卡为例,而非常见的PCIE EP:1. Alignment向前X字节对齐:HeadX(Y) = Y-(Y mod X);eg. Head4(0x1007) = 0x1004;该操作非常适合硬件实现,在硬件实现中HeadX(Y) = YnY(n-1)Y…Ym0(m-1)0(m-2)…0(1)0(0),m=log2(X),因此在硬件中只要将Y的第0~(m-1)位清0即可;向后X字节对齐:TailX(Y) = HeadX(Y)+X-1;eg. Tail4(0x1000) = 0x1003;同上,在硬件逻辑中只要将Y的第0~(m-1)位置1即可;2. DMA写操作TLPDMA写逻辑首先获得写操作的起始地址A,和长度L,然后计算出结束地址B=A+L-1(系统需要保证B的计算结果不会出现进位);eg. DMA写操作向0xFFFF_00030xFFFF_0200写数据时,长度位0x1FE,但实际上需要向0xFFFF_00000xFFFF_0203写数据,然后使用First_DW_BE和Last_DW_BE屏蔽多余字节;TLP中使用的实际长度为Head4(A)~Tail4(B)这段数据区域的长度,即M=(Tail4(B) - Head4(A) +1) 2(单位为Word),但是这两个标粗的公式使用了多个32位加法器,非常耗费FPGA内部资源,因此使用另一种算法计算M值:M’=(Head4(A1A0+L1L0+3) - Head4(A1A0)) —— 8;M=L2 + M’