文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
---|---|---|---|---|---|---|
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_tvalid
、m_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的结论。
- 数据包为