本次操作包括:工程的版本迁移,板级测试时信号的抓取。
ISE工程转到Vivado2018.2环境下
版本迁移的操作想必大家已经做过不少了,其中包括从ISE转换到vivado与vivado老版本迁移到新版本。郑智海同学给大家介绍了一下如何把工程从ISE迁移到vivado中。
首先我们拿到的是一个ISE的工程,当然是不能够直接用Vivado软件打开的,所以我们要进行第一步操作,将工程导入进去:
打开Vivado2018.2后,点”Creat Project”后,再点击Imported Project,勾选ISE后,寻找到ISE工程所放在的位置进行添加,记得添加的是后缀为.xise的文件,因为之前我点的是别的形式,就一直添加不了,这个小问题要注意。操作如下列图步骤所示。
选择好后点击Next键继续,并选择好自己的工程目录。
Project_1就是我想将工程建在此文件夹中。
勾选ISE之后,选择ISE所在文件目录。
选择好ISE工程之后就算成功将ISE导入vivado2018.2了,也就算完成了第一步工作。
如上面两张图所示,进入vivado2018.2页面后,会显示出这个界面,此时你的IP核在这里是处于过期的状态,因为在ise里的ip核到了vivado中不一定适用,不同软件中的ip核是不兼容的,这里很简单,只需手动升级,即选中ip核并点击右键,有一个upgrade up代表升级,点击之后会出现下面界面:
点击ok后进行generate后,ip核就会自动更新完成:
完成ip核更新后,还有一个重要的问题是此时的约束文件的格式是ucf(代表的是ise的约束文件格式),但vivado是不支持这种格式的,我们需要将ucf转成xdc格式。这里我想介绍两种方法:逐行代码手动修改与图形界面配置修改。
1、手动更改
根据ucf的约束管脚,对应着写一个xdc文件。
逐行修改就是根据上图的转换规则,一行一行地把代码改成xdc形式。下面放上部分一行行修改后的代码。
2. 图形界面配置管脚
而通过图形界面修改就方便得多,鼠标点点即可。在完成synthesis之后,打开implement选项:
在I/O Ports窗口展开管脚,对于每个输入输出信号,在Site栏选择对应的管脚,注意确保Fixed栏处于勾选状态,I/O Std常选择LVCMOS25。设置好后,Implemented Design窗口标题栏会显示一个*号,表示设置发生了更改。按Ctrl+S快捷键保存设置,会弹出窗口如图,提示保存constraints文件会导致综合与实现过期。也就是说,修改了管脚分配设置后,需要重新进行综合、实现操作。
随后会弹出保存新文件的窗口,选择Create a new file并输入文件名,点击OK即可。
此时约束文件就已经生成,保存之后就可以在vivado的约束部分看到自己的xdc了。个人认为如果ucf文件不是特别多的话可以手动更改,如果很多的话可能就需要在tcl输入对应的脚本去更改,这个我就还没尝试过。
板级测试时信号的抓取
1、添加调试的信号
添加信号抓取要先进行synthesis操作,然后open synthesis,点击Set up debug。
在这之前,你就应该想好你要debug哪些信号,抓哪些信号去看波形,当你想用ila抓取哪些信号时,你就可以在代码前标记出(*mark_debug = "true"*)或者(*mark_debug = "1"*).因为标记了之后,你点击set up Debug之后就可以在信号列表中找到相应的信号。
上图是我所标记的部分信号,当然我们需要对代码的功能进行分析,你才好判断。这里还要提及一点,尽量不要抓顶层的信号,因为顶层的信号往往是没有经过处理的信号,这样子很有可能ila是抓不出来波形的。
那么对于我的工程主要是rgmii转gmii,即是一个4位数据转换成8位数据,再对接受的8位数据进行一个CRC的校验,那么我们当然是想抓接收到4位的数据和接收8位的数据,这样你就有了目的,可以在代码中寻找到输入或者输出位宽是4的数据,再找位宽为8的数据,进行mark debug。
如图就是告诉你可以选择对应的信号进行标记,并且可以选择他们的时钟域,之后可以对你选择的信号给予一定的值进行触发。
你在代码里标记之后,就会在列表中出现对应信号,这里需要注意的地方有以下几个点:
A.Clock Domain
这个地方是时钟域的选择,这个是非常讲究的,有时候你抓不到波形的原因就是因为参考时钟太慢,信号往往是从一个快时钟域下来的,你拿慢时钟去抓,就抓不到,而且时钟域选择不当在布局布线的过程往往都会报错。报错的原因是因为你所选的时钟和ila所连接的距离太远,布局布线太困难,这时候你需要更改你的时钟域。这里再说一个概念叫free clock,free clock是要求上电无条件运行的时钟,一般直接用晶振时钟,是比较稳定的时钟,给予电路永久的一种时钟。所以在选择时钟的时候我们都需要考虑去选择free clock。
B.Driver cell
对于DDR型的驱动信号在布局布线过程中往往都会失败的,像图中的IDDR和ODDR,他们是一种原语,由一个时钟输入,下降沿数据由输入时钟的本地反转来计时的,反馈到I/O块的所有的时钟被完全复用,总之在加入debug的时候,要把这两种DDR型的驱动信号删除。个人感觉如果在这些信号再接一个IBUF,再将输出试着添加debug,有可能能成功。
C.ila的个数问题
当你选择了几个时钟域,你就会对应有几个ila,如果你选的时钟都是一样的,那么你就只有一个ila。
如上图所示,是我最终留下来的信号,并将它们的时钟都选择了clk_out2,通过代码里的clk_gen模块可以知道clk_out2的时钟是100MHZ,这里选择100MHZ还有一个原因是debug hub也应该选择在100MHZ,至少在JTAG下载速率的2.5倍以上,而JTAG一般默认在15MHZ,所以我们选择clk_out2也是OK的,个人感觉时钟域的选择还是要在clk_gen给出的选择里挑选,这样的时钟一般都是free clock,时钟域选择的越多,ila越多,布局布线的困难往往就会更大,所以个人觉得要控制ila的数量,不然很容易出错。还有就是采样深度的选择,如果你的信号不多的话可以默认1024,不然也会占用一定的FPGA资源,不过感觉影响也不大。还有Capture control和Advance trigger两个感觉也是可勾选也可以不勾选。
之后我们看到,由于我们只选择了一个时钟域out2,所以它给我们分配了一个ila0以及1个时钟域。之后就点击finish就可以了。完成之后还需要进行保存,保存之后xdc就会自动添加ila和debug hug的部分,将你所需要检测的信号与ila上的探头进行连接:
在这里你可以检查自己的xdc是否是准确的,管脚对应探头的位置,同时可以看到u_ila_0已经例化,并写在了xdc里面。
2、修改调试信号的时钟域
需要注意的是最后一行的debug_hub的时钟,由于我只选择了一个时钟域out2,那么hub的时钟就是默认为out2(虽然它显示的是Clk_user),当有多个ila的时候,hub的时钟往往默认的都会出问题,可能它会与其他的ila时钟默认连接,如果此时的ila时钟为0的话,那么就会出问题。例如现在有两个ila_0和ila_1,分别对应两个时钟clk_out1,clk_out2,然后同时连在一个hub上,默认下,hub的clk是连到ila_1的clk_out2上,这对ila_0就有问题,不同的时钟域,将会导致hub不工作。所以我们可以对hub的时钟进行更改:
a. 直接在xdc上进行更改
可以直接在xdc上进行更改,如上图可以在get_nets后面的内容进行更改,比如我需要改为clk_gen里引出的clk_2,那么我们可以写为get_nets clk_gen/CLK_OUT2,保存即可。不过修改之后的xdc可能还要需要重综合,因为会显示综合过期,比较麻烦,所以我们可以用tcl命令去更改,就可以直接省去这一步,所以tcl的脚本还是很给力的,之后还要多加学习这方面。
b.采用tcl进行更改或者图形界面更改
直接在tcl的path里输入命令后,xdc就会被自动更改。我们可以打开综合设计里的Schematic里去查看代码所生成的电路情况,包括各个走线的情况,可以找到对应生成的hub和如下图的ila_0。
可以看到u_ila_0中有引出的探头,与所测的信号相连接。
把图缩小,可以看到整体的情况,标蓝色的线就是ila_0和hub的clk共同连接到模块gen_clk所引出的CLK_OUT2上,同时可以看出hub的输入与输出都是紧紧与ila_0相连接的,在我们分析debug哪些信号的的时候,可以观察Schematic,判断各个总线所连接的情况,往往比读代码更要直观。
如上图所示,我们还可以打开vivado页面的Debug,里面会有生成好的ila和hub,包括探头所连接的信号,还有他们的时钟域。这里还应该注意到有一个Unassigned Debug Nets,这个就是你有在代码里标注mark debug信号,但在最终选择debug信号列表里删除了,它可能是DDR的驱动信号,或者是你不需要看的信号。倒不是很重要,就是可以注意一下,所以说有很多地方都可以检测你的ila生成的是否正确。每次更改debug的时候都记得要保存,同时还应该检查xdc是否删除干净并生成了新的ila。
在抓信号的的时候我曾经出现过这种状况,后来发现是xdc里有未删除干净的ila_1,这些问题都是需要注意的。
到这就完成了mark debug的工作,然后直接布局布线,并生成比特流,如果没有问题那就能正常的生成比特流了。
3、生成比特流文件并下载抓取信号
完成比特流生成后,点击Open Hardware Manager后,再点击Auto Connect之后右键点击Program Device.第一行是我们比特流生成的文件,第二行则是我们逻辑分析仪的探头文件,也就是ltx文件。
如上图所示,要在Waveform中添加相应你想看到的信号,才会在ila窗口出现波形,同时要在右下角添加触发信号,例如ctl,或者是mac里的dval(这些算是触发信号,抓的时候要一同带上,是用来指示当前数据有效的信号)我刚开始没有在waveform的页面添加想看的信号,只在右下角添加了触发信号ctl,然后怎么样也看不到波形,以为自己哪里出了问题,后来才发现没有添加想看的信号。
这里很重要的一点是在选号触发条件之后(三个ctl都是等于1的时候触发),一定要记得更改触发条件,一开始我选择的是AND(即当三个同时为1的时候才满足触发条件),导致我的信号都是0
如图所示,我所添加的信号都为0,就是因为触发条件没选对。后来我将AND改为OR,只要他们三个有一个为1,那么就满足了触发条件,之后点击run进行触发:
如图所示,当client的信号ctl拉高的时候,rgmii_rxd开始接收到4位二进制的有效数据,之后从CCD模块的rxd_o里接收到了8位二进制的有效数据。
如图5变成了55,f变成了ff,同时ff前面还带着一个d5,f前带着一个d,那么d5就算是前导码,然后是目的地址,源地址,那么半字节就是d。总之我们得到我们最终想要的波形,就算是成功了。当然我们注意到lower和upper的信号都是0。
应该是Zedboard板子的网口只插上了1口,可能client刚好对应在1口上,所以不是信号传输有什么问题,是网口没接上。
当然还应该可以添加更多的信号进行debug,还需要不断地去尝试,不过最主要的信号还是需要找出来debug的,这也需要对工程的代码有一定的了解,借助Schematic网图进行不断地分析。
总结
这里我还想说的就是,有一段时间我一直出现这种状况,无论是改变debug信号,还是更改他们的时钟域,最终Program device后都会出现没有debug cores的情况,感觉很迷,最后我重新将这个ISE工程又导入一个新的文件,重新操作后就解决了,可能有时候一直弄不出来的话,可以考虑重新建工程,或者重新将工程导入。
再总结一下这次调试所遇到的一些问题
1、ere are no debugs core.
2、布线出现问题
3、A clock has stopped. Uable to arm ILA core
4. The debug hub core was notdetected.
5. Device is programmed with adesign that has no supported debug core(s) in it.
这些大部分还是时钟域的问题,时钟域导致了debug失败,所以在选择时钟域方面,我还要多加尝试。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !