zynq开发遇到的相关问题

问题1:使用第三方平台提供的开发板,核心版未提供管教说明,而IP开发时,需要用外部复位,因此无法分管脚。

解决方法: 1、用VIO,VIO可以固定初始值

                   2、自己做一个上电复位模块,reg初始值固定时0或者1,在始终稳定后,计数达到特定值后,拉高或者拉低(根据复位信号极性确定),从而实现复位


问题2: 在某些自己定制的IP中,添加了VIO或者xilinx提供的IP,但是在IP添加到总工程中时,综合时,被告知缺少文件。

解决方案: 1、以vio为例,假如,我自己设计的ip名字叫做myip,myip中有vio或者ila,那么我在myip中首先需要添加这两个ip的xci文件。

                         其次,在总工程中也添加ila和vio的xci文件,双保险,综合一定没有问题。

问题3: VDMA的出现status异常

解决方案: 1、读取vmdaSR的状态值,初步判断时由什么造成其异常,以我的工程为例,我读到0x1c000,很明显,每一行的计数超过了hsize设定的值,因此我判断时tlast没有收到。虽然VMDA的sync全部配置称none,且没有Enable同步,但是VDMA还是需要tlast信号,因此我在自己的ip接口出加了tlast信号,从而使IP正常。


问题4: VDMA取数据异常

       硬件配置: VDMA配置未全自由模式,读写通道全部配置称none对齐模式,且都配置称master

       软件配置: 配置称单帧模式,不循环。

       异常: 取数据有问题。 我设置的VDMA从DDR取数据的起始地址是0x22000000,并将0x22000000附近地址的内容全部设定为0x55555555,我通过vivado抓取AXImater口读通道的数据,地址通道第一个取的地址是0x22000000,达到预期,但是data通道的数据不对,不是0x55555555,并且去了多个值后,才是0x55555555。我一直怀疑时系统未配置好,不是VDMA的问题,因为VDMA取的地址时正确的,只是回的数据有问题。找了好久没有找到解决之道。后来没办法,在VDMA中加入同步信号,自己的IP也产生同步信号给VDMA,后期一切正常。目前问题虽然绕过去了,但是还未解决正在分析。

       后续实验分析:怀疑是一帧结束后,加设我自己的IP已经停止要数据了,但是中间路径上的fifo依然要数据,而VDMA会单帧循环向外界灌数据,因此会继续向fifo写数据知道fifo满了,整个系统才会不动。后面我复位一下整个系统,但是PS AXI总线的outstanding状态不会改变,因此即使我重新从0x22000000开始发数据,收到的数据也不是0x22000000. 而是将前面的outstanding的数据补齐后再发送0x22000000地址内的内容。

     事情总结是: 1、凡是做事,一开始就应该用最完善的方法,而不是简陋的方法,会留下很多坑。

                            2、踩在巨人的肩膀上会省很多事,可以借鉴别人的设计和软件环境,配置和软件都一样,先搭建一套平台出来。这样效率会比从0开始高很多。











<think>我们正在处理一个关于Zynq开发中的错误信息:"Common17-55'get_property'expectsatleastoneobject."这个错误通常发生在使用Vivado设计套件中的Tcl脚本时,当尝试使用`get_property`命令但未指定任何对象或指定的对象不存在时出现。###错误原因分析1.**对象不存在**:可能尝试获取一个不存在对象的属性。例如,指定的IP核、端口或单元格名称不正确或尚未创建。2.**作用域问题**:`get_property`命令在当前作用域找不到指定的对象。例如,可能在错误的层次结构中访问对象。3.**时序问题**:在对象创建之前就尝试获取其属性。例如,在创建IP核之前就尝试获取其属性。4.**拼写错误**:对象名称或属性名称的拼写错误。###解决方法####1.检查对象是否存在在使用`get_property`之前,确保对象存在。可以使用`get_objects`命令验证对象是否存在。```tcl#示例:检查对象是否存在setobj[get_objects-quiet<object_name>]if{[llength$obj]==0}{puts"Error:Objectnotfound."}else{get_property<property_name>$obj}```使用`-quiet`选项可以避免因对象不存在而报错,然后通过判断返回列表长度来确定对象是否存在。####2.指定正确的对象作用域确保在正确的层次结构中访问对象。例如,如果对象位于某个模块内,可能需要使用`get_selected_objects`或指定完整路径。```tcl#示例:获取特定模块中的对象get_property<property_name>[get_cells-hier-filter{NAME=~<hierarchical_path>}]```####3.确保对象已创建检查Tcl脚本的执行顺序,确保在获取对象属性之前,该对象已经被创建。####4.检查拼写仔细检查对象名称和属性名称的拼写,确保与设计中的名称一致。###示例场景假设我们有一个名为`design_1`的块设计,其中包含一个名为`processing_system7_0`的Zynq处理器IP核。我们想获取其`CONFIG.PCW_USE_M_AXI_GP0`属性的值。**错误写法**(可能导致Common17-55错误):```tclget_propertyCONFIG.PCW_USE_M_AXI_GP0[get_ipsprocessing_system7_0]```如果`processing_system7_0`不存在(例如,拼写错误或尚未创建),则会报错。**正确写法**:```tclsetzynq_ip[get_ips-quietprocessing_system7_0]if{$zynq_ipne""}{setvalue[get_propertyCONFIG.PCW_USE_M_AXI_GP0$zynq_ip]puts$value}else{puts"ZynqIPnotfound."}```###总结该错误的核心在于`get_property`命令没有接收到有效的对象。通过确保对象存在、正确拼写、在正确的作用域中以及按正确顺序执行命令,可以解决此问题。§§相关问题§§1.在VivadoTcl脚本中,如何安全地获取对象的属性以避免类似错误?2.除了`get_property`,VivadoTcl中还有哪些常用的对象属性操作命令?3.如何调试VivadoTcl脚本中的对象作用域问题?</think>### Zynq错误:Common 17-55 "get_property expects at least one object" 解决方法 #### 错误原因分析 该错误发生在Vivado Tcl脚本中,核心问题是**`get_property`命令没有接收到有效的对象引用**。常见原因包括: 1. **对象不存在**:尝试访问的设计对象(如IP核、端口、单元格等)尚未创建或名称拼写错误 2. **作用域错误**:在错误的设计层次中查找对象(如block design未打开时访问其内部对象) 3. **时序问题**:在对象创建前就尝试获取其属性 4. **空返回值**:前置命令(如`get_bd_cells`)返回空列表时直接传给`get_property` #### 解决方法(逐步操作) ##### 1. 验证对象是否存在(关键步骤) ```tcl # 先确认对象是否可获取 set target_obj [get_bd_cells -quiet <your_cell_name>] if { [llength $target_obj] == 0 } { puts "ERROR: 对象不存在!检查名称: <your_cell_name>" } else { # 安全获取属性 get_property <property_name> $target_obj } ``` **说明**: - `-quiet`参数抑制错误输出 - `llength`检查返回对象列表长度 - 替换`<your_cell_name>`为实际对象名(如`processing_system7_0`) ##### 2. 检查设计作用域 - **Block Design场景**:确保在`current_bd_design`上下文中操作 ```tcl current_bd_design [get_bd_designs <design_name>] ``` - **层级路径**:对于子模块使用完整路径 ```tcl get_bd_cells /<parent_module>/<child_cell> ``` ##### 3. 调试对象列表 列出所有可用对象验证环境状态: ```tcl # 列出所有BD单元格 puts [join [get_bd_cells *] "\n"] # 列出所有端口 puts [join [get_bd_ports *] "\n"] ``` ##### 4. 时序同步处理 若在脚本中创建对象后立即访问: ```tcl create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_0 # 添加同步点 save_bd_design ; # 强制设计更新 # 现在安全访问 get_property CONFIG.GPIO_WIDTH [get_bd_cells axi_gpio_0] ``` #### 典型修复案例 **场景**:获取Zynq处理系统的时钟属性时出错 ```tcl # 错误代码: get_property CONFIG.FREQ_HZ [get_bd_pins processing_system7_0/FCLK_CLK0] # 修复后: set clk_pin [get_bd_pins -quiet processing_system7_0/FCLK_CLK0] if {$clk_pin ne ""} { get_property CONFIG.FREQ_HZ $clk_pin } else { puts "错误:时钟引脚不存在!" } ``` #### 预防措施 1. 始终用`-quiet`+空值检查包装`get_*`命令 2. 在关键操作后使用`save_bd_design`同步设计状态 3. 使用Tcl的`catch`命令处理异常: ```tcl if { [catch {get_property ...} result] } { puts "属性获取失败:$result" } ``` > 此错误通常源于设计状态不同步或对象命名错误,通过严格的对象存在性验证可避免90%以上的发生[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值