文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
---|---|---|---|---|---|---|
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可修改,但需上位机配合
- 注:DeviceID可修改,但需上位机配合
- 第4页:默认不变
- 第5页:默认不变
- 第6页:默认不变
- 第7页:默认不变
- 第8页:默认不变
- 第9页:默认不变
- 第10页:默认不变
- 第11页:选择GTX参考时钟
- Reference Clock Frequency: 选择250Mhz(根据AD9516设置)
- Frequency可选项如下:
- Reference Clock Frequency: 选择250Mhz(根据AD9516设置)
二、 简单仿真测试
(一)一些小问题的解决
报错一:找不到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的结论。