No_16_0328 Virtex6 PCIe2.5 仿真学习

来源:互联网 发布:网络与信息安全论文 编辑:程序博客网 时间:2024/06/05 04:08
文档版本 开发工具 测试平台 工程名字 日期 作者 备注 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

一、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的结论。

问题: 如何判断出读的地址是0x000000010 ?
1 0
原创粉丝点击