Aurora接口使用说明.docx
- 文档编号:2225188
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:15
- 大小:1.33MB
Aurora接口使用说明.docx
《Aurora接口使用说明.docx》由会员分享,可在线阅读,更多相关《Aurora接口使用说明.docx(15页珍藏版)》请在冰豆网上搜索。
Aurora接口使用说明
在AMC-2C667X平台上使用FPGA的Aurora接口说明
声明:
本文档仅面向初学者。
1、针对平台用的V6芯片型号新建一个ISE工程,工程中加入AuroraIP核,IP核的设置如下(当然也可以选择其他设置,以下均是针对本测试设置而言)
图1
主要参数:
lanes-通道数,即使用的GTX收发器个数
Lanewidth:
aurora核与用户接口的数据位宽(一般可选2B或者4B)
Lanerate:
Aurora核的对外通信速率,由于采用8B/10B编码,实际有效速率要乘以0.8。
GTREFCLK:
GTX参考时钟频率
采用全双工,流水通信模式。
详细请参考Aurora的UG。
好了,最后一页了,这IP核设置够简单吧!
!
!
(一共才两页好伐…),让你选择GTX位置
图2
平台上的V6片子一共有6组GTXQUAD,每个QUAD有4个GTX,选择一个GTX与平台
的SFP+F2相连,平台说明书写清楚了,是MGT_113_1,就是它了。
生成了这个核以后,核的文件夹下会多出一堆文件,这就是XILINX给你的一个示例工程
-exampledesign.
图3
接下来就可以仿真啦。
仿真:
你可以直接使用它提供的testbench仿真,没问题。
但是有更简单的方法,其实
你仿真只是为了看看它的时序,看看你加的东西对不对,因为只要你加对了,仿真一定
通过。
那么简单的方法呢?
打开modelsim,不要告诉我你没装,或者装了没有关联ISE仿真库,那你得先把这个问
题解决了再说。
好了之后,新建一个modelsim工程(file-new…)在你之前那堆文件的
/simulation/functional文件夹下,看图说话~
图4
下一个界面叫你createnewfiles啥的直接close。
然后你就在modelsim命令窗口轻轻地
敲了一行命令:
dosimulate_mti.do
这个simulate_mti.do就是人家已经仿真好的仿真文件,就在那个文件夹里,意思就是我
仿好了,你拿去用吧,看看就好,没什么技术含量。
Soitbegins:
图5
当然敲了这个命令你的modelsim可能会报错,多半是因为XILINX环境变量的设置问题,
去XX找下答案。
编译通过了之后过了一会,就出现了这个界面:
图5
请务必点否,否则你百忙了…
然后如果出现了最终的仿真波形,那么恭喜你成功了!
!
图6
当然你也可以让仿真多持续一段时间,怎么弄呢?
你需要自己去改它的testbench。
作为一个使用快速使用该IP的文档,我只告诉你我们需要关注的信号无非这么几个,下
图中黑的信号:
图7
简单吧!
上面的五个信号就是用户接口信号,下面的几个是系统接口信号,你要做的就
是写个模块产生数据然后送到Aurora核当中,所以请重点关注那几个用户接口信号及其
时序。
这几个信号什么意思怎么用?
参考UG。
________________________________华丽丽的分割线_____________________________
2、接下来是重点,请至少先读了下Aurora的UserGuide。
综合实现:
下面你要做的就是,针对它重新新建一个工程,然后把那堆文件夹内的所
有.v(hd)和.ucf文件都包含就去,结果就是一个可编译的可用的东西,这些东西没看懂?
其实我也没看懂,没关系。
当然有些地方你需要改动,慢慢往下看。
这个工程建立以后就是这样的:
图8
当然,chipscope的那几个核是我手动添加的方便查看信号而已,你要是牛逼,能直接保
证对就不用加了。
要使用那几个核,上图右侧有个参数叫USE_CHIPSCOPE要设置为1。
接下来看看这个工程的大体结构:
Aurora_module_i:
以源代码的形式给了你Aurora核的实现,与在这里直接添加一个Aurora
IP核一样一样的…是为了方便你修改其中的某些参数。
如果不是大神,请不要肆意修改
它。
Standard_cc_module_i:
时钟补偿模块,用来给通信双方进行时钟补偿,因为这个协议对
时钟要求很高,两端的时钟频偏在100个ppm内都可以补偿回来,时钟同步嘛~
Frame_gen_i/frame_check_i:
用户接口端程序,你要写用户程序可以参考它对Aurora用户
接口的操作方式,其实很简单,UG里面有一个用户接口时序。
其他的不说了自己看吧。
然后你就需要考虑修改ucf文件了,要针对你的片子和平台,这个一开始不熟的话有点
头痛的…下面是我跑通的ucf,给你的参考价值只在于它的管脚锁定:
##UCFgeneratedforxc6vlx240t-ff1759-2device##
#125.0MHzGTXReferenceclockconstraint
NET"GTXQ1_left_i"TNM_NET=GT_REFCLK;
TIMESPECTS_GTXQ1_LEFT_I=PERIOD"GT_REFCLK"125.0MHzHIGH50%;
#UserClockConstraint:
basedonthelinerate(2.0Gbps)andlanewidth(2-Byte)
NET"user_clk_i"TNM_NET=USER_CLK;
TIMESPECTS_USER_CLK_I=PERIOD"USER_CLK"100.0MHzHIGH50%;
#MGT113REFCLK1
NETGTXQ1_PLOC=AD8|IOSTANDARD=LVDS_25|DIFF_TERM=TRUE|PERIOD=8ns
PRIORITY0;
NET"GTXQ1_N"DIFF_TERM="TRUE";
NET"GTXQ1_N"IOSTANDARD=LVDS_25;
NET"GTXQ1_N"LOC=AD7;
#DiffINITClockConstraint
#RefClocksforFPGA1-100M//mustlowerthanrefclkofGTX
NET"INIT_CLK_P"DIFF_TERM="TRUE";
NET"INIT_CLK_P"PERIOD=10ns;
NET"INIT_CLK_P"IOSTANDARD=LVDS_25;
NET"INIT_CLK_P"LOC=J42;
NET"INIT_CLK_N"DIFF_TERM="TRUE";
NET"INIT_CLK_N"IOSTANDARD=LVDS_25;
NET"INIT_CLK_N"LOC=K42;
#100MHzboardClockConstraint
NET"reset_logic_i/init_clk_i"TNM_NET=INIT_CLK;
TIMESPECTS_INIT_CLK=PERIOD"INIT_CLK"10nsHIGH50%;
TIMESPEC"TS_TIG1"=FROM"INIT_CLK"TO"USER_CLK"TIG;
NETGT_RESET_INLOC=AD31;
//NETRESETPULLUP;
//NET"RESET"LOC=P28;
//NETLEDLOC=N28;
#ErrorsIndicators
NETHARD_ERRLOC=N28;#LED2_FPGA0
NETSOFT_ERRLOC=P28;#LED3
#ChannelandLaneupIndicators
NETCHANNEL_UPLOC=K33;#LED0
NETLANE_UPLOC=K32;#LED1
//NETclk_dis_outLOC=L32;#LED7
#GTLocation-MGT_113_1
INSTaurora_module_i/gtx_wrapper_i/GTXE1_INST/gtxe1_iLOC=GTXE1_X0Y5;
#TX/RXlocation
NETRXPLOC=AF3;#MGT_113_1,connectedtoSFP+F2
NETRXNLOC=AF4;
NETTXPLOC=AJ1;
NETTXNLOC=AJ2;
很好很强大有木有!
!
我当时调这个的时候就没个人直接给我个ucf…
然后程序中还有些地方需要改动,慢慢往下看。
看见ucf文件中关于复位的部分没有?
就是这段:
NETGT_RESET_INLOC=AD31;
//NETRESETPULLUP;
//NET"RESET"LOC=P28;
//NET"GT_RESET_IN"LOC=N28;
注释的部分就是它原本生成的东西,把两个复位信号RESET和GT_RESET_IN分别约束到两个按键上来复位,这个复位按照UG上的说明还有一定的时序要求,但是一般这样约束都不会有问题,比如XILINX官方板子这样约束是没问题的。
但是我们的平台就不行了,为什么?
因为没有按键!
它不是个开发板啊……
然后我尝试过另外的复位方法:
写个小程序定时复位,还有就是通过chipscope的虚拟IO口核VIO给Aurora施加复位信号,均无果而终。
那么为什么要把GT_RESET_IN约束到AD31那个管脚上呢?
首先解释下我是这样弄的:
wireF1_F0_WARM_RESET;
assignF1_F0_WARM_RESET=!
GT_RESET_IN;
aurora_125m_RESET_LOGICreset_logic_i
(
.RESET(F1_F0_WARM_RESET),
.USER_CLK(user_clk_i),
.INIT_CLK_P(INIT_CLK_P),
.INIT_CLK_N(INIT_CLK_N),
.GT_RESET_IN(F1_F0_WARM_RESET),
.TX_LOCK_IN(tx_lock_i),
.PLL_NOT_LOCKED(pll_not_locked_i),
.SYSTEM_RESET(system_reset_i),
.GT_RESET_OUT(gt_reset_i)
);
也就是说,把reset_logic这个模块(为啥是它?
因为它的作用就是对输入的复位信号进行时钟去抖和时序纠正然后把输出的复位供给其他模块使用)的两个复位信号—RESET和GT_RESET_IN连到了同一根信号上,即F1_F0_WARM_RESET,而它是连接到AD31管脚连接进来的复位信号的取反信号上。
AD31这个管脚连接到了平台上FPGA1给FPGA0热复位的信号上,因此它连接的是一个复位信号,而取反只是为了将低有效转为高有效而已,因为Aurora中的模块都是用高电平有效复位。
就这么一个复位问题,不知道耗了我多少宝贵时间啊~
复位的问题解决了,时钟呢?
约束文件中有这么几段:
#125.0MHzGTXReferenceclockconstraint
NET"GTXQ1_left_i"TNM_NET=GT_REFCLK;
TIMESPECTS_GTXQ1_LEFT_I=PERIOD"GT_REFCLK"125.0MHzHIGH50%;
#UserClockConstraint:
basedonthelinera
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Aurora 接口 使用说明