本人调试是将DSP作为RC端,FPGA作为EP端,且下文是对DSP代码的讲解。本人调试参考代码是D:\ti\pdk_C6678_1_1_2_6\packages\ti\drv\exampleProjects\PCIE_exampleProject。本文所指的PCIE手册为TI公司C6678的pcie技术手册,全名为 KeyStone Architecture Peripheral Component Interconnect Express (PCIe).pdf
(1)outbound和inbound的理解:
哪一端发起请求哪一端就是outbound。一端是outbound,另一端就是inbound。
对于outbound来说,可以发出写请求和读请求。当作为RC端的DSP对0X60000000发起写请求时,RC发出outbound的写请求,将数据传送给作为EP端的FPGA。当作为RC端的DSP对0X60000000发起读请求时,RC发出outbound的读请求,作为EP端的FPGA先收到读请求然后将数据发给RC端的DSP。
错误理解:简单地将数据出去理解为outbound,数据进去理解为inbound。
DSP存在PCIE_DATA 0x60000000~0x6FFFFFFF这段地址。在这段地址中写数据会触发outbound写机制,在这段地址中读数据会触发outbound读机制。0x60000000该地址在outbound转换机制中为DSP内部总线地址。
(2)对EP端(远程配置空间)BUS_MS和MEM_SP的配置
RC端对EP发出outbound写时,RC端的DSP必须把作为EP端FPGA的BUS_MS和MEM_SP置为1,否则EP端无法收到数据。BUS_MS为设置总线控制权,MEM_SP为设置存储器访问权限,具体可见pcie手册3-63页。

(3)对EP端(远程配置空间)BAR的配置
本地配置空间地址 0x21801000,远程配置空间地址 0x21802000,见pcie手册45页。

在PCIE手册中没有关于remote configuration space中具体的寄存器介绍。但是其和local configuration space中寄存器顺序是一样的,只是偏移量将0x1000改成了0x2000。

从偏移地址上可以看出BAR0和BAR0_MASK地址是一样的。在DSP端,当DBI=1时,此时写入的值为bar的范围大小(bar_mask)。当DBI=0时,此时写入的值为bar的地址(bar)。(DBI在CMD_STSTUS中,DBI默认值为0)详细寄存器见pcie手册的3.2、3.3、3.4章节的寄存器,同时偏移量也可见FPGA的pcie gen3手册。
RC端无法配置EP端bar mask的大小,只能配置bar的地址。RC端配置的bar基地址会因为EP端配置的bar大小而改变。例如:bar_mask=8MB,那么配置的bar地址的0~22会置为0。
配置远程EP端bar0的具体代码如下图所示。在TLP过滤中,bar接收到的数据包头中存在type这一标志位。type=0对应于EP的configuration space,type=1对应于RC的configuration space。故选择对type0Bar32bitIdx进行配置。idx选择0表示配置bar0。DBI默认为0,直接将数值写入bar0,即为bar0的地址。

(4)DSP作RC端,FPGA作EP端时inbound和outbound地址转换
详细的地址转换过程可见pcie手册2.7节。
首先需要说明的是inbound和outbound机制是DSP独有的,FPGA侧不存在inbound和outbound机制。实际上,在PCIE通信链路中的数据帧中不仅包含发送的数据,还包含PCIE地址,数据类型和数据长度等。由于DSP存在inbound和outbound机制,故不需要人为的依据PCIE通信的规范去组帧和解帧,只需配置好inbound和outbound机制所需的寄存器。
下面根据代码具体解释一下inbound和outbound的转换计算过程。
(a) outbound配置如下所示:



由Pcie_getMemSpaceRange (handle, &pcieBase, NULL))函数可以得到pcieBase的地址为0x60000000,此地址即为内部总线地址。关于此地址的详细介绍可以见本位第一章节。

内部总线地址=0x60000000
OB_SIZE= pcie_OB_SIZE_8MB=3
OB_OFFSET_HI= PCIE_OB_HI_ADDR_M=0
PCIE_OB_REGION_M=0 对应于下面的index0,即使用outbound的region 0。
OB_OFFSET_INDEX0= PCIE_OB_LO_ADDR_M=0x70000000
注:第一个参数为PCIE手册中所用参数名,第二个参数为样例代码中所用参数名。

OB_SIZE=3,故取内部总线地址0x60000000的[27:23]位,即index=0
PCIe基地址=OB_OFFSETn_HI+OB_OFFSETn_INDEXn[31:23]
=0+0x70000000[32:23]
PCIe总地址=PCIe基地址+内部总线地址[22:0]
=0x70000000[32:23]+ 0x60000000[22:0]
=0X70000000
即传到PCIE链路中的地址为0x70000000,可以看到的是由于OB_SIZE为8M(因为8M=810241024=2^23 所以取0-22位 ) ,所以要是一次性传输的数据量超过8M的话,要么多次传输,要么再加个region传输。
而这个0x70000000又正好是本文第三章给远程FPGA配置bar0的地址,故FPGA可以收到DSP发送的数据。

(b) inbound配置如下所示:
指定bar1的地址为0x90000000,且为32位bar。

将bar1绑定给inbound机制,且使用region 0

pcieConvert_CoreLocal2GlobalAddr()作用是将本地地址转换为全局地址。在6678中一共有8个核,对于核0来说L2 SRAM本地起始地址为0x00800000,L2 SRAM全局起始地址为0x10800000,两者差值为0x10000000。

IB_START1_HI = PCIE_IB_HI_ADDR_M=0
IB_START1_LO = PCIE_IB_LO_ADDR_M=0x90000000
IB_OFFSET1 = dstBuf.buf的全局地址
注:第一个参数为PCIE手册中所用参数名,第二个参数为样例代码中所用参数名。

PCIe地址偏移量=PCIe地址 -(IB_STARTn_HI:IB_STARTn_LO)
= PCIe地址 – 0x90000000
内部总线地址=IB_OFFSETn+ PCIe地址偏移量
= dstBuf.buf的全局地址+ PCIe地址 – 0x90000000
我们将内部总线设为dstBuf.buf的全局地址,即将从FPGA侧收到的数据存放在dstBuf.buf中。由此我们可以计算出PCIE地址:
dstBuf.buf的全局地址= dstBuf.buf的全局地址+ PCIe地址 – 0x90000000
PCIe地址=0x90000000
FPGA侧将这里计算出来的PCIE地址用在发送数据时的组帧过程里,DSP侧就可以从dstBuf.buf这个变量地址里读到FPGA侧发过来的数据。

6678与FPGA PCIE调试相关推荐

  1. (22)Xilinx FPGA PCIE中断接口(学无止境)

    1 引言 最近在做一个项目,用到PCIE接口.主要是FPGA与ARM通过PCIE接口进行通信,中断调试一直不通有2个月,最近也算是找到原因,FPGA中断上报后,CPU可以收到中断.所以,这里整理一下F ...

  2. tx2 fpga pcie无法读写_Cyclone V SOC(ARM+FPGA)开发文档_之开发流程详解

    双击可查看大图(手动狗头) 目录 Altera Cyclone V soc开发文档 之软硬件开发 1 Cyclone V开发流程介绍 5 专业术语 5 Cyclone V软件开发介绍 6 U-BOOT ...

  3. LabVIEW FPGA PCIe开发讲解-7.2节:目前主流的4大Xilinx FPGA PCIe DMA通信IP核讲解

    1.要开发一个带PCIe或者PXIe接口的FPGA板卡出来,除了硬件本身外,最重要的就是FPGA芯片里面的PCIe通信代码编写,俗称下位机FPGA编程:还有中间层的驱动文件编写以及上位机PC端的应用程 ...

  4. ise仿真添加信号_「干货」推荐一款FPGA仿真调试鸟枪换炮的工具

    俗话说,隔行如隔山.非微电子专业没有做过芯片的同学,是不知道这个世界上还有效率更高的用来对Verilog/VHDL代码进行仿真的工具的.具体来讲,对于做FPGA开发的同学而言,需要知道除了ModelS ...

  5. LabVIEW FPGA PCIe开发讲解-7.1节:FPGA PCIe/PXIe基础知识和概念概述

    1.提到PCIe总线通信,相信很多接触过PCIe或PXIe板卡的用户估计都有所了解过,相对于传统的串口.USB和千兆以太网通信协议,PCIe协议本身可以实现更高数量级的总线通信带宽,比如目前Xilin ...

  6. Xilinx FPGA PCIe XDMA性能测试报告(一)

    1 测试内容 本报告对Xilinx FPGA的PCIe XDMA的性能进行了测试,同时,给出了具体的测试框图.测试平台.测试步骤.测试记录等内容. 2 测试框图 3 测试平台 硬件平台:Dell R3 ...

  7. FPGA的调试-调试设计的指导原则

    对于FPGA调试,主要以Intel FPGA为例,在win10 Quartus ii 17.0环境下进行仿真和调试,开发板类型EP4CE15F17.主要包括一下几个部分: - FPGA的调试-虚拟JT ...

  8. 【紫光同创logos2 FPGA PCIe软件栈设计】

    紫光同创logos2 FPGA PCIe软件栈 基于同创logos2系列FPGA自研PCIe软件栈 驱动层 设备初始化 Device operation 设备卸载 API层 配置空间访问接口 bar访 ...

  9. PCIE调试笔记理解--TLP理解

    PCIE以TLP包的形式传输.在TX端,TLP包按照应用层 -> 传输层 -> 数据链路层 -> 物理层 一级一级的往下传递:RX端与TX端反向传递.PCIE的TLP包由很多很多的类 ...

  10. PowerPC PCI-E调试相关资料小结

    最近在PowerPC的板子上加一个FPGA,需要用PCI-E连接,就调试了PCI-E.由于vxWorks本身已经将驱动写好了,使用时直接调用即可,但是很快就出现了问题:一开始直接使用mmap的方式映射 ...

最新文章

  1. 彻底取代Redis+数据库架构,京东618稳了!
  2. idea项目怎么jdk和scala同时显示在External Libraries下?
  3. 用php编写比赛评奖系统_php编写的抽奖程序中奖概率算法
  4. Mapreduce自定义数据类型
  5. Angular里interpolation text节点的创建逻辑,单步调试
  6. mysql root_mysql root 没有任何权限
  7. vb.net 功能f8键事件_UG软件F8快捷键和笔记本电脑F8快捷键冲突的解决方法
  8. 2022年了,零基础转行计算机还可靠么?
  9. 如何配置Gitlab的双因子验证(Two-Factor Authentication)
  10. 2022全国高中数学联赛A1卷T2几何答案
  11. linux上使用FTP下载远程PTF远程文件
  12. Flink的State概述
  13. 抢滩抖音、B站,快手港股IPO进程加速
  14. 15万甚至30万以内的SUV值不值得买?
  15. 假如我年少有为不自卑
  16. 商品详细信息的代码html_实操分享:如何将商品优惠券,添加到淘宝详情页?...
  17. 北京工业大学计算机科学与技术考研真题,北京工业大学计算机科学与技术2022考研经验...
  18. 查找wordpress端口_如何查看人们用来查找WordPress网站的关键字
  19. go双线性对数字签名
  20. 在没有Release的日子里

热门文章

  1. Visual Studio 2012下载安装方法
  2. 2017年多校联合训练 第五场(吉如一)
  3. 防火墙基本应用(华为USG6000V)
  4. android小米便签源代码分析,小米开源便签Notes-源码研究(1)-导出功能整体思路
  5. 贝叶斯公式理解与应用
  6. Linux搭建FTP服务器
  7. Linux PTP IEEE1588使用
  8. 《Linux系统最佳实践工具:命令行技术》新书抢先看
  9. 网络通信原理之TCP,UDP,QUIC
  10. combus通讯_COM口,串行通讯端口,RS-232接口 基础知识