验证环境
window 10系统
vivado .4
KC705开发板
验证目的
1)通过xilinx提供的PIOexample 入门pcie。
2)抓取pcietlp报文,学习TLP报文。
背景知识
首先了解一下pcie的应用,在PCIE中有两种数据传输方式:
DMA(Direct Memory Access),直接内存访问,在该模式下,数据传送不是由CPU负责处理,而是由一个特殊的处理器DMA控制器来完成,因此占用极少的CPU资源。
PIO(Programmed Input-Output),可编程输入输出,在该模式下,数据传送由CPU执行I/O端口指令来按照字节或更大的数据单位来处理,占用大量的CPU资源,数据传输速度也大大低于DMA模式。举例老说,在DMA方式下,如果copy文件的同时在播放mp3音乐,则不受丝毫影响;如果在PIO模式下,则会发现音乐声时断时续,这是因为大部分CPU资源被文件传输占用。
目前笔者也在研究pciedma实现(毫无头绪),这里先记录下PIO学习过程。
工程搭建
如下图所示,选择KC705开发板,通道数X8,速度5.0GT/s,其他保持默认就行。
然后生成example例程如下
直接综合,实现,生成mcs文件下载到板卡。
exampe的逻辑框图如下
PIOexample工程的功能是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的commandregister初始化为0,还是我工程的问题,最后软件将commandregister写为7 ,终于可以正常读写,avalon-st上也可以抓取到报文了。
参考文档
pg054
如果觉得《xilinx PCIe PIO工程仿真及验证》对你有帮助,请点赞、收藏,并留下你的观点哦!