No_16_0328 Virtex6 PCIe2.5 仿真学习

文档版本 开发工具 测试平台 工程名字 日期 作者 备注
V1.0 ise14.7 DBF板 PCIETest2 2016.03.28 lutianfei none
  • 参考资料:
    • Spartan 6 PCIE_V2.4 真教程(一)
    • 菜鸟5小时速成FPGA_PCIE设计高手教程.pdf
    • ug671_V6_IntBlock_PCIe.pdf

[TOC]


一、Virtex6-250T的PCIe IP核设置

  • 首先选择2.5版IP核



  • 第1页:参数设置

    • 注意 Lane Width 选择 X4
    • 注意 Link Speed 选择 2.5GT/s
    • 注意 Frenquency(Mhz) 125Mhz,此时钟为给用户使用的trn_clk用户事务时钟。


  • 第2页:BAR空间设置



  • 第3页: ID号设置
    • 注:DeviceID可修改,但需上位机配合



  • 第4页:默认不变



  • 第5页:默认不变



  • 第6页:默认不变



  • 第7页:默认不变



  • 第8页:默认不变



  • 第9页:默认不变



  • 第10页:默认不变



  • 第11页:选择GTX参考时钟
    • Reference Clock Frequency: 选择250Mhz(根据AD9516设置)


    • Frequency可选项如下:




二、 简单仿真测试

(一)一些小问题的解决

报错一:找不到XILINX路径
  • 解决方案:配置系统环境变量


报错二:找不到tests.v文件路径(也可能不报错)
  • 解决方案:修改pcie_exp_usrapp_tx.v文件中tests.v的路径如下:

  • 成功后如下图:



(二)波形分析

包格式说明
  • 包头格式说明


  • Fmt与Type格式说明



  • Posted 与 Non_Posted包

    • Non_Posted:设备发起端发出一个 Non-Posted 请求,在一定时间后,接收端需要回复一个完成包给发起端,如果不回复可能会遇到特别的情况,例如蓝屏。
    • Posted:不需要回复完成包给发起端。


PIO方式 接收 时序图
  • 信号说明:
    • m_axis_rx_tlast : 包结束标志,与m_axis_rx_tvalid一起生效。
    • m_axis_rx_tdata : 接收数据,当m_axis_rx_tvalid为高时,数据有效。
    • m_axis_rx_tkeep[7:0]:决定64bit数据中哪些bit为有效。某位为高时,表示对应的8位数据有效。
    • m_axis_rx_tvalid:表示PCIe核提供了有效数据在m_axis_rx_tdata
    • m_axis_rx_tready:表示用户准备好接收来自m_axis_rx_tdata的数据,此信号必须与m_axis_rx_tvalid同时作用才有效。
    • trn_rerr_fwd:为高正常,为低表示传输出错。


第一包数据:
  • 由上图可知:当 m_axis_rx_tvalid拉高的同时数据到来。
    • 数据包为MWr(存储器写请求),Posted
    • 包头3DW,
    • 数据长度为1(4字节),
    • 写地址为0x00000004(Byte)
    • 写入数据为0x04030201
    • 写入空间为:BAR0
    • trn_rerr_fwd始终为高,没有出错。


  • 第一包数据的结尾:
    • 观察可知当m_axis_rx_tready再次拉高后的下一个时钟m_axis_rx_tvalidm_axis_rx_tlast 同时拉低。


第二包数据
  • 由上图可知:当 m_axis_rx_tvalid拉高的同时数据到来。
    • 数据包为MRd(存储器读请求),Non-Posted包需要返回一个完成包
    • 包头3DW,
    • 读取长度为1(4字节),
    • 读地址为0x00000004(Byte)
    • 读取空间为:BAR0
    • trn_rerr_fwd始终为高,没有出错。
PIO方式 发送 时序图
  • 由上图可知:当 m_axis_tx_tvalid拉高的同时数据到来。
    • 数据包为Cpld(完成包)。
    • 包头3DW,
    • 读回长度为1(4字节),
    • 读地址为0x00000004(Byte)
    • 读取空间为:BAR0
    • 读出的数据:0x04030201,即我们把刚才写入0x00000010地址的数据读出,发现确实是刚才写入的0x04030201,所以脚本判断程序才会出现test_passed的结论。
问题:<font color = red> 如何判断出读的地址是0x000000010 ?</font>

推荐阅读更多精彩内容