iddr原语使⽤说明_FPGAvivado、SDK使⽤及遇到的问题整理⼀、新建vivado⼯程
转化成vivado可识别的.ngc格式,可以和RTL⼀起吃进去。
在添加source file时,内部有sram或fifo的,先把sram,fifo需要转化成vivado可识别的.ngc格式
添加RTL和SRAM等
选择IP core⽬录,或者add file吃.xci⽂件(xml格式的⽂件,它能够收集所有的配置信
在Add Existing IP时选Add Directories,选择IP core⽬录,或者add file吃.xci⽂件
息),vivado会⾃动识别添加IP core,我这个⽬录下放了3个IP core,被⾃动识别并陈列了出来。
已经⽣成好的IP可以直接在创建⼯程时添加
IP package好后,可以在block design直接调⽤,使⽤⽅便。若是要package IP的,建议XDC⽂件搭建完block design之后再吃
若是要package IP的,建议XDC⽂件搭建完block design之后再吃,不然IP内部包含约束的属性,不好修改。(但我想除⾮全⽤block design搭建⼯程,且IP不需要修改,package才会⽐较⽅便吧)
设为false_path后,穿频部分的电路不再做
添加constraint file,这⾥提供了⼀个约束4个clock,设置为互斥的false path的样本。设为false_path后,穿频部分的电路不再做timing检查。
timing检查
⼆、Package IP⽅法
建议要Package IP的,前⾯的步骤就不要做,添加⼯程⽂件从这⼀步搞起,因为Package IP会⾃动打开⼀个⼯程,这样搭建Block (建议要Package IP的,前⾯的步骤就不要做,添加⼯程⽂件从这⼀步搞起
Design的这个⼯程就是新的,不会和Pachage IP⼯程混乱)Tools-> Create and Package New IP -> Package current project
Tools-> Create and Package New IP -> Package current project
–> -> include .xci file
-> include .xci file(官⽅推荐做法,.xci⽂件中include了优化流程的path,若include IP generated files可能会出现未知问题) –> Finish。
Finish
⾄此,左边Design Sources中出现IP-XACT,⾥⾯有l⽂件,封存着IP相关信息。
点击中间最后⼀栏Review and Package -> edit packaging settings
点击中间最后⼀栏Review and Package -> edit packaging settings,可以勾选Create archive of IP,可⽣成Zip压缩⽂件,⽅点击OK,点击右下⾓Package IP。User IP的package就打包好了,可以在Block Design中使⽤了。
便存档及使⽤。点击OK,点击右下⾓Package IP
点击Create Block Design,在IP Catalog-> User Repository -> UserIP 中就可以到刚封装好的IP。
三、搭建SOC系统
在Block Design中点Add IP,到ZYNQ7 processing System,此模块即7020 ARM-A9的处理器。点击Run Block
点击Run Block 在Block Design中点Add IP,到ZYNQ7 processing System
Automation,会⾃动优化配置这个处理器,并把DDR, FIXED_IO的线也连好了。
Automation
双击它,在PS-PL Configuration中启⽤⼀组AXI master。
在Clock Configuration中出⼀个25M clock,供PL内部pll使⽤。
当validate design时有报reset unsync 这⾥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。
这⾥的图连线问题,interconnect areset连接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。
点击Generate Block Design
打包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有问题。
有时候会报不到iostanderd pin
三、BUFG、BUFH
有遇到timing问题,想通过调BUFG,BUFH来解决,但最终没有解决,采取了其他⽅式,这⾥记录⼀下查的资料。
FPGA全局时钟资源⼀般使⽤全铜层⼯艺实现,并设计了专⽤时钟缓冲与驱动结构,从⽽使全局时钟到达芯⽚内部的所有可配置单元
可配置单元
IBUFG即输⼊全局缓冲,是与专⽤全局时钟(CLB)、 I/O单元(IOB)和选择性块RAM(Block Select RAM)的时延和抖动都为最⼩。IBUFG即输⼊全局缓冲
(CLB)、 I/O单元(IOB)和选择性块RAM(Block Select RAM)
所有从全局时钟管脚输⼊的信号必须经过IBUF单元,否则在布局布线时会报错。
输⼊管脚相连接的⾸级全局缓冲。所有从全局时钟管脚输⼊的信号必须经过IBUF单元
IBUFGDS是IBUFG的差分形式,当差分时钟信号从⼀对差分全局时钟管脚输⼊时,必须使⽤IBUFGDS作为全局时钟输⼊缓冲。IBUFGDS
BUFG是全局缓冲,它的输⼊是IBUFG的输出,BUFG的输出到达FPGA内部的IOB、CLB、选择性块RAM的时钟延迟和抖动最⼩。BUFG是全局缓冲
BUFGCE是带有时钟使能端的全局缓冲。
BUFGCE是带有时钟使能端的全局缓冲
BUFH驱动区域中的⽔平全局时钟树,Xilinx的时钟是通过时钟树来分布的。可⽤于互联逻辑、SelectIO逻辑,DSP48E1模块或者Block BUFH驱动区域中的⽔平全局时钟树
RAM资源的时钟驱动。
sdk所以我⽤BUFH来优化selectio的区域时钟树,综合完成后,看timing似乎没有任何改善。
尝试将system clock和selectio clock⽤BUFH,使区域性的时钟树得到更好的优化,但是system clock推到了PS上⽤于AXI 采样,超出了可使⽤BUFH的区域,故不能使⽤BUFH结构。
经过实验,都⽤BUFG确实优化的更好⼀些。
将PS MIO电压另外,因为⽤到了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单步调试,可以看在哪⼀⾏卡死了。
instance wrapper也不能⽤来
原语,发现并不能⽤ILA来debug,它的instance wrapper也不能⽤来
还有⽤到OBUFDS等Xinlinx单端信号转差分信号的原语,发现并不能⽤ILA来debug
另外可以在ps多出⼀个200M得clock,给ILA采样⽤,避免RTL内部clk不是free的产⽣⼀些问题。
debug
debug。另外可以在ps多出⼀个200M得clock,给ILA采样⽤,避免RTL内部clk不是free的产⽣⼀些问题。
说明database有更新,要右键bsp,fresh⼀下。
如果某个系统⽂件不到,说明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,任务管理器禁⽤,重启vivado。
⑤ 2018版本以下的vivado检查下STDIO中的COM⼝和波特率是否设置正常。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。