目录
1、概述
本文以Xilinx ISE K7芯片 PCIE IP core 生成的user design 作为学习例程。
vivado里关于PCIE 的IP CORE与ISE里 PCIE的IP core,其user design 逻辑一致。
阅读本文,最好参考一定的PCIE通信协议方面的资料,对比着看,比较容易理解。
本文正在整理中,有些说明不到位,还望理解。如有不对的地方,请留言,我会及时更正。
事务层包(TLP),数据链路层包(DLLP),物理层(PLP)产生于各自所在层,最后通过电或光等介质和另一方通讯。其中数据链路层包(DLLP),物理层(PLP)的包平常不需要关心,在 IP 核中封装好了。
下面,重要的话,请说三遍!!!!!
在 FPGA 上做 PCIe 的功能,变成完成事务层包(TLP)的处理,即可!
在 FPGA 上做 PCIe 的功能,变成完成事务层包(TLP)的处理,即可!
在 FPGA 上做 PCIe 的功能,变成完成事务层包(TLP)的处理,即可!
阅读下文,最好电脑屏幕或桌上书本里,有参考PCIE协议的相关介绍,对比着看,方便理解!
当PCIE IP CORE接收到一个TLP数据包时,其需要做的是, 首先,根据标头判断这个TLP是读存储器还是写存储器。
若是写存储器,就将下一个TLP中的地址和数据解析出来(因为这里一次发送64bit,所以第一个TLP中不包含地址和数据,第二个TLP中包含地址和数据),然后通过PIO_EP_MEM_ACCESS 模块将数据写入指定的地址中;
若是读存储器,就将下一个TLP中包含的地址解析出来,再通过PIO_EP_MEM_ACCESS 模块将数据从指定的地址中读取出来,然后经过发送引擎(PIO_TX_ENGINE )进行完成包拼接,最后通过事务层、数据链路层、物理层封装之后,通过差分发送接口(txn、txp)将数据发送出去。
下面两张图是Xilinx ISE 软件生成的IP CORE的架构连接情况。
一个TLP包(事物层),是由头标、数据和摘要组成。
下面附图,PCIE TLP 包的头标格式。
下图是一个简单的TLP 包,即包含两个64位的数据。clock0时刻,采样的,64位宽的数据1,clock1时刻,采样的是64位宽的数据2。需要注意,下面的TLP报文是:01a0090f40000001+0403020100000010,这个字节发送顺序,是采用AXI Bit的顺序。因此,举例,若需要解析TLP保温里的Request ID,则其对应的TLP报文是第一个64位宽的数据的高16位,即“01a0=0000_0001_1010_0000”.
这是一个,由于一次发送64位,因此这个报文的前64位是标头,后64位是数据和地址。
按照上图的数据格式可知
Request ID:16’b0000_0001_1010_0000
Tag:8’b0000_1001
Last DW BE:4’b0000
First DW BE:4’b1111
Fmt:2’b10
Type:5’b0_0000
Length:10’b00_0000_0001
Data:32’h04030201
Address:32’h00000010(低两位无效)
特别说明,一个TLP数据包,是可以采用AXI总线进行数据传输,当然,在解析数据包时,也是需要根据AXI总线协议,还原TLP包,然后进行数据解析。
当然,TLP数据包,也是可以采用其他协议进行数据传输,比如USE/UART,关键是看速率需求。如果希望传输比较快的话,还是建议采用AXI协议进行传输TLP包比较好!
2、PIO_RX_ENGINE工作时序
3、PIO_TX_ENGINE工作时序
正在整理中,未完,待续。。。。
4、参考文献:
CLGo :https://blog.csdn.net/cllovexyh/article/details/79828833 )