window 10 系统
vivado 2017.4
KC705 开发板
1)通过xilinx 提供的PIO example 入门pcie。
2)抓取pcie tlp报文,学习TLP报文。
首先了解一下pcie的应用,在PCIE中有两种数据传输方式:
DMA(Direct Memory Access),直接内存访问,在该模式下,数据传送不是由CPU负责处理,而是由一个特殊的处理器DMA控制器来完成,因此占用极少的CPU资源。
PIO(Programmed Input-Output),可编程输入输出,在该模式下,数据传送由CPU执行I/O端口指令来按照字节或更大的数据单位来处理,占用大量的CPU资源,数据传输速度也大大低于DMA模式。举例老说,在DMA方式下,如果copy文件的同时在播放mp3音乐,则不受丝毫影响;如果在PIO模式下,则会发现音乐声时断时续,这是因为大部分CPU资源被文件传输占用。
目前笔者也在研究pcie dma实现(毫无头绪),这里先记录下PIO学习过程。
如下图所示,选择KC705开发板,通道数X8, 速度5.0GT/s, 其他保持默认就行。
然后生成example例程如下
直接综合,实现,生成mcs文件下载到板卡。
exampe 的逻辑框图如下
PIO example 工程的功能是FPGA内部开辟了4 * (512 *32)的RAM区,可以通过pcie接口做读写测试,地址范围 0x000- 0x7ff, 位宽32bit。
PIO工程提供了完整的PIO仿真模型及testbench文件,直接在vivado菜单栏点击 run simulation 就可开始仿真。
将开发板插在主机的pcie插槽上,然后打开windriver软件,可以发现开发板被找到,显示设备如下:
可以看到当前开发板pcie的配置信息,而且申请了bar0空间,接下来对bar0空间读写测试
读写地址0 ,写入0x11223344 ,读出来0x11223344 , 读写正确
读写地址0x7fc, 写入0xaabbccdd, 读出来0xaabbccdd, 读写正确
读写地址0x800, 写入0x01020304 ,读出来0xffffffff, 读写错误。
因为PIO example工程申请的ram地址空间为0x000-0x7ff,所以无法对0x800地址做读写操作。
通过ILA抓取pcie报文,这里不记录了。
最近在做一个PCIE相关的项目,用的altera的FPGA, 简单的PIO模式访问,逻辑也很简单,就是读写一下RAM和register, 结果上板之后,操作系统可以扫描到板卡, DEVICE ID /VERDOR ID都是对的,枚举到bar0 memory空间, 但是就是无法读写bar0,通过signaltap抓取avalon-st报文,发现经过pcie core后没有任何报文发出, bar_hit也一直显示0,实在摸不到头脑。 最后查到pcie的配置寄存器有问题,
cmd寄存器读到的值为0 ,
不知道为什么altera pcie的 command register初始化为0,还是我工程的问题, 最后软件将 command register 写为7 , 终于可以正常读写,avalon-st上也可以抓取到报文了。
pg054