概述
一、新建vivado工程
在添加source file时,内部有sram或fifo的,先把sram,fifo需要转化成vivado可识别的.ngc格式,可以和RTL一起吃进去。
在Add Existing IP时选Add Directories,选择IP core目录,或者add file吃.xci文件(xml格式的文件,它能够收集所有的配置信息),vivado会自动识别添加IP core,我这个目录下放了3个IP core,被自动识别并陈列了出来。
IP package好后,可以在block design直接调用,使用方便。若是要package IP的,建议XDC文件搭建完block design之后再吃,不然IP内部包含约束的属性,不好修改。(但我想除非全用block design搭建工程,且IP不需要修改,package才会比较方便吧)
添加constraint file,这里提供了一个约束4个clock,设置为互斥的false path的样本。设为false_path后,穿频部分的电路不再做timing检查。
二、Package IP方法
(建议要Package IP的,前面的步骤就不要做,添加工程文件从这一步搞起,因为Package IP会自动打开一个工程,这样搭建Block Design的这个工程就是新的,不会和Pachage IP工程混乱)Tools-> Create and Package New IP -> Package current project -> include .xci file(官方推荐做法,.xci文件中include了优化流程的path,若include IP generated files可能会出现未知问题) –> Finish。
至此,左边Design Sources中出现IP-XACT,里面有component.xml文件,封存着IP相关信息。
点击中间最后一栏Review and Package -> edit packaging settings,可以勾选Create archive of IP,可生成Zip压缩文件,方便存档及使用。点击OK,点击右下角Package IP。User IP的package就打包好了,可以在Block Design中使用了。
点击Create Block Design,在IP Catalog-> User Repository -> UserIP 中就可以找到刚封装好的IP。
三、搭建SOC系统
在Block Design中点Add IP,找到ZYNQ7 processing System,此模块即7020 ARM-A9的处理器。点击Run Block Automation,会自动优化配置这个处理器,并把DDR, FIXED_IO的线也连好了。
双击它,在PS-PL Configuration中启用一组AXI master。
在Clock Configuration中出一个25M clock,供PL内部pll使用。
这里reset我使用的是pll上的locked信号,故没有使用ZYNQ上的,若使用ZYNQ上的reset,当validate design时有报reset unsync warning,建议添加Processor System Reset IP。
若有interrupt,PS中一般只会出现一个interrupt port,若要使用多个,建议添加Concat IP。
PS上AXI为32bits位宽,User IP中是64bits位宽,这里需要AXI转AXI,添加一个AXI interconnect IP,或它自己也会帮忙instance一个interconnect IP。有AXI的IP地址会默认分配到0x40000000。
再添加User IP,点击Run connection Automation。没连线的手动连好,对要引出Block外的port右键,make external。
这里的图连线问题,interconnectareset连接ACLK,peripheralareset连接S00和M00_ACLK。
点击Address Editor,若未分配IP地址,选中Unmapped address-> 右键 –> Auto assign。
点击Tools-> Validate Design,清掉Error和必要的Warning。
Validate时若报两个管脚clk频率对不上,双击管脚,把clock domain和fre HZ改成相应的。
点击Generate Block Design,这时系统就搭建好勒,并生成了HDL。
打包IP和建Block Design最好在两个地方做,我在一个地方做时Design Sources中有IP又有Block Design中搭建的系统,Implement识别到IP,就会出错。
Run Implement后发现,synthesis失败,原因是我的design内部调用了3个vivado自带的ip核,1个pll,2个selectio,包含它自带的IP用来package IP后,它竟然自己识别不了自己的东西了??网上的一般方法如使用.veo中的instance不能解决,查了很多资料尚未解决,决定放弃这种架构。
新的策略是不package IP,只搭建PS和AXI interconnect的Block Design,然后把需要和自己design对接的引脚引出来,写一个wrapper文件,把自己的design和Block Design包起来,手动接线(感觉这才是常用的方法,修改RTL会比package IP方便)。这样第一次连线是比较麻烦,但好处也是明显的,自己写的design没有package成IP,有改动就很方便了。双击AXI的port,设定data位宽为64bits。
有时候会报找不到iostanderd pin,可以看下最近有没有修改code,是不是code有问题。
三、BUFG、BUFH
有遇到timing问题,想通过调BUFG,BUFH来解决,但最终没有解决,采取了其他方式,这里记录一下查的资料。
FPGA全局时钟资源一般使用全铜层工艺实现,并设计了专用时钟缓冲与驱动结构,从而使全局时钟到达芯片内部的所有可配置单元(CLB)、 I/O单元(IOB)和选择性块RAM(Block Select RAM)的时延和抖动都为最小。IBUFG即输入全局缓冲,是与专用全局时钟输入管脚相连接的首级全局缓冲。所有从全局时钟管脚输入的信号必须经过IBUF单元,否则在布局布线时会报错。
IBUFGDS是IBUFG的差分形式,当差分时钟信号从一对差分全局时钟管脚输入时,必须使用IBUFGDS作为全局时钟输入缓冲。
BUFG是全局缓冲,它的输入是IBUFG的输出,BUFG的输出到达FPGA内部的IOB、CLB、选择性块RAM的时钟延迟和抖动最小。
BUFGCE是带有时钟使能端的全局缓冲。
BUFH驱动区域中的水平全局时钟树,Xilinx的时钟是通过时钟树来分布的。可用于互联逻辑、SelectIO逻辑,DSP48E1模块或者Block RAM资源的时钟驱动。
所以我用BUFH来优化selectio的区域时钟树,综合完成后,看timing似乎没有任何改善。
尝试将system clock和selectio clock用BUFH,使区域性的时钟树得到更好的优化,但是system clock推到了PS上用于AXI采样,超出了可使用BUFH的区域,故不能使用BUFH结构。
经过实验,都用BUFG确实优化的更好一些。
另外,因为用到了2.5V的LVDS,设置I/O std,按需分配2.5和3.3V电压。用default值implement时电压要报错,需要将PS MIO电压设为2.5V。
四、SDK使用
Write bitstream成功后就可以开始写c code了控制ps传输了。
File –> Export -> Export Hardware(with bitstream)
File -> Launch SDK –> file -> New -> Application Project
New name -> finish
在New name project的src里面写c code。
在开始写之前,可以先run -> run as Launch on Hardware,看能不能找到ps,成功打印helloword。
用到两个FPGA平台相互传输数据,用SDK下载程序时,发现SDK识别到了不用SDK的那款FPGA上,因此先接SDK的那一台,在run as SDK后,再接上不用ps的那款FPGA,防止SDK识别错误。
若想c code单步调试,run as -> debug DBG,按F6单步调试,可以看在哪一行卡死了。
还有用到OBUFDS等Xinlinx单端信号转差分信号的原语,发现并不能用ILA来debug,它的instance wrapper也不能用来debug。另外可以在ps多出一个200M得clock,给ILA采样用,避免RTL内部clk不是free的产生一些问题。
如果某个系统文件找不到,说明database有更新,要右键bsp,fresh一下。
下面是记录的一些错误:
ERROR: [Labtools 27-3176] hw_server failed during internal command.
网上有2种常规方法,若不行,disconnect ILA,打开ILA的xdc,删掉所有ILA的constaint,重新synthesis,set up debug。
最后解决,我用的流程是,先用SDK的debug mode,按F6进行单步调试,在要调试到我们要抓的波形那里时,进入Vivado Hardware Manager,program PL,我前面没有操作PL,都是ps在跑起来。然后ILA画面出现,设置trigger信号和要抓的信号。按trigger,返回SDK,再按F6,成功抓到且识别到Hardware。
这个问题一旦遇到特别恼火,看网上好多人因为这个问题奔溃了,但我不幸解决了,可供参考。
① 可以检查SW16是否置于在线调试模式(00000),如下图。
② 可以在设备管理器禁用7020的USB驱动,有两个,禁任一都可以,然后自动重启电脑。
③ 可以试着在SDK端再下载一次FPGA代码,这时会报power error的问题,禁用USB
④ 可以关掉SDK和vivado,任务管理器禁用hw_server.exe,重启vivado。
⑤ 2018版本以下的vivado检查下STDIO中的COM口和波特率是否设置正常。
7020通过SW10有3种下载bit sream方式。01为USB,10和11为jtag下载。
因为ps是115200,所以这里和设备管理器相应的COM口也设置到115200。
用ILA debug时,可以添加下面两行语句,来防止信号被优化及添加debug信号。
有些需要降低level的ERROR,可以尝试在pre.tcl中写下列指令。
set_property IS_ENABLED 0 [get_drc_checks {RTSTAT-2}]关掉DRC check
set_property SEVERITY {Warning} [get_drc_checks UCIO-1]
[Common 17-176] Overwrite of existing file isn't enabled. Please specify -force to overwrite file
遇到这种.hwdef的问题,重跑一遍write bitstream就好了。
[DRC 23-20] Rule violation (REQP-1712) Input clock driver - Unsupported PLLE2_ADV connectivity. The signal
勾选override mode,compensate设置为BUF_IN.
[DRC 23-20] Rule violation (PDRC-43) PLL_adv_ClkFrequency_div_no_dclk - The computed value 350.000 MHz (CLKIN1_PERIOD, net PHYCLK) for the VCO operating frequency of the PLLE2_ADV site PLLE2_ADV_X0Y0 (cell fbio_fpga_i0/FBIO_CTL_RN0/fbio_top_i0/fbio2lvds_p
遇到PLL问题,设置MMCM_MODE调整频率就好了。
指针的强制类型转换。打印指针信息用%p。
Xilinx有自定义的u64,u32,不用自己定义无符号整数。
附上一份简单的代码。
至此,我做的这个工程及在工程中所做的一些尝试记录完毕。
最后
以上就是优雅硬币为你收集整理的iddr原语使用说明_FPGA vivado、SDK使用及遇到的问题整理的全部内容,希望文章能够帮你解决iddr原语使用说明_FPGA vivado、SDK使用及遇到的问题整理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复