FPGA调试错误合集
发布时间:2026/6/10 20:56:26
分类:文化教育
浏览:1234

1.PS端烧录程序至99%卡死出错。解决办法PL的zync IP没有配置正确QSPI和电压配置完成后解决。2.PS端烧录程序出现Error while launching program:Timeout Reached. Mask poll failed at ADDRESS: 0XFD4063E4 MASK: 0x00000010解决办法注释掉psu_init_tcl文件中相应mask poll错误的地址位置。3.PS端出现如下critical waring[BD 41-1629] /zynq_ultra_ps_e_0/SAXIGP2/HP0_LPS_OCM is excluded from all addressable master spaces.解决办法选择include segment。4.AXI DMA由PL到PS的前几个数据丢失。解决办法初始化函数会调用一次axi总线需要在PS端跳过这个初始化函数之后再将数据fifo准备好AxiDmaInit(AxiDmaCtrl,XPAR_AXI_DMA_0_DEVICE_ID);5.AXI DMA readS2MM总线上能抓到数据但是ps端的内存没有数据读入解决办法ZYNQ的IP中高速axi线的位宽设置错误改成与DMA同位宽解决。6.在vivado中添加文件后文件呈灰色。解决办法底层模块相同但是有两个顶层模块都例化了这些底层模块导致vivado程序无法识别删除多余的顶层模块解决。7.PL端修改编译之后重新export hardware、relaunch SDK在SDK端下载程序后PL端无法刷新ila。解决办法PS端的bsp并非最新的将其删除重新使用vivado export hardware再打开SDK。8.撰写逻辑之后抓到的数据无法与逻辑相符检查逻辑并未发现问题。解决办法逻辑中使用了参数带参计算参数在本模块设置的值与上次例化部分的值不一致导致波形始终不对。9.编译错误[DRC AVAL-245] Independent_clock_check...。解决办法时钟错误由于clk_gen模块wire信号没有连接导致没有时钟一般可以通过查看电路图看时钟连接情况。10.编译错误[DRC NSTD-1] Unspecified I/O Standard...。解决办法一般是IO planning里没有对该信号的电平做要求或者保持默认值导致的可以手动添加默认值或者添加免DRC检查的语句set_property SEVERITY {Warning} [get_drc_checks NSTD-1]set_property SEVERITY {Warning} [get_drc_checks UCIO-1]11.FIFO在进行仿真的时候会出现full信号为红线empty一直为高但是实际上板无误解决办法该FIFO的IP使用的是没有rst的没有rst信号会导致信号初始值错误修改IP成有rst的FIFO解决。12.测试vivado18和20中所有FIFO同步、异步和有无复位仿真的时候empty信号都不和read clock对齐。解决办法应该是FIFO的仿真文件中加入了延迟模仿实际情况。代码中的影响是用该empty信号做组合逻辑时可能出现毛刺但是该毛刺不会被时钟捕获所以对最终逻辑没有影响。若对代码其他地方产生影响考虑代码的正确性。13.[DRC PLHDIO-4] 编译错误将板上的差分时钟输入FPGA的PLL时报错[DRC PLHDIO-4] HDIO DRC Checks:The following IO terminals are locked to HIGH_DENSITY IO banks,but they drive a PLL/MMCM instance which cannot be placed in HIGH_DENSITY banks due to absence of such sites.万能且稳妥的解决办法1.在差分输入时钟前例化IBUFDS原语差分转单端后再例化BUFGCE原语再将BUFGCE原语输出的时钟给进PLL举例如下IBUFDS IBUFDS (.O (sys_clk),.I (sys_clk_p),.IB (sys_clk_n));BUFGCE #(.CE_TYPE(SYNC), // ASYNC, HARDSYNC, SYNC.IS_CE_INVERTED(1b0), // Programmable inversion on CE.IS_I_INVERTED(1b0) // Programmable inversion on I)BUFGCE_inst (.O(sys_clk_o), // 1-bit output: Buffer.CE(1), // 1-bit input: Buffer enable.I(sys_clk) // 1-bit input: Buffer);将sys_clk_o输入PLL即可2.在xdc中添加set_property CLOCK_DEDICATED_ROUTE ANY_CMT_COLUMN [get_nets xxx]其中xxx为你的走HDGC差分输入时钟详细解答可以看我的另一篇文章。14.vivado2018使用时报错但是报错位置上下查看都没有发现问题。解决办法可能是工具综合的时候过度flatten了可以尝试修改synthesis的选项为none后重新编译可以正确报出错误位置。15.编译错误ordered port connections cannot be mixed with named port connections解决办法例化格式错误例化时忘记去除逗号。16.复旦微FPGA可以烧录但是无法固化程序。解决办法该项目中使用的复旦微FPGA不支持板卡上GD兆易的FLASH换成镁光的解决。17.使用AXI的xdma通过AXI stream模式扔数上位机无法接收到数据。解决办法axi总线中的tkeep信号没有赋值赋值为FF解决问题。18.使用SDIO传输时异步的SDIO读写模块概率性出错。解决办法由于SDIO是异步时钟需要使用group命令进行时序约束告诉软件哪些是异步的时钟。具体操作synthesis打开report clock interaction具体哪些时钟是异步的可以在这里查看注意pll的时钟要精确到从pll的哪一路输出的。打开edit timing constraints点击set clock groups双击生成group组编辑group名下面可添加需要的时钟SDIO为三路所以总共添加pll的时钟和三路SDIO时钟共四路点…在*框后面搜clk可以找到pll输出的时钟*框后搜SDIO的clk点击set加入回到上层点击OK即可创建在xdc文件中也会出现相应的tcl语句。19.使用vivado2020升级打开2018的工程编译报错所有的IP均无法正常synthesis。解决办法如果带有PS端的BD工程在打开后需要先去BD design中validate一下此次validate后发现2020打开后所有PS端IP都没有分配地址重新分配地址后可正确编译。20.使用SDK进行PS端FLASH烧录时终端可能打印的两种错误①given target does not exist②unrecognized JEDEC ID解决办法①错误一般是JTAG松动导致重新插拔JTAG接口或者PL端先点击连接FPGA再进行烧录②错误为demo板上的flash为国产flash不在vivado的flash list中需要添加额外的bin文件覆盖vivado安装目录下的bin文件。21.编译错误[labtools 27-1429] XML character encoding not supported。解决办法把报错的hw.xml文件删除系统会自动重新生成生成后可继续烧录。22.SRIO的log_clk时钟计算问题。解决办法以3.125G 2X lane为例计算3.125 * 2 * 80% / 64 78.125MHz。23.增加的等长的时序约束没有起作用set_output_delay -clock [get_clocks clk_out1_clk_wiz_0] -min -add_delay -2.01 [get_ports {dsp_par_dat[*]}]set_output_delay -clock [get_clocks clk_out1_clk_wiz_0] -max -add_delay -2.50 [get_ports {dsp_par_dat[*]}]解决办法该tcl语句是在已有时序约束的基础上增加新的delay但是该程序本身就缺乏时序约束所以该语句无法起作用。1.implementation- edit timing constraints - outputs - set output delay - 选clock和object - 点击find如果没有找到port观察port类型是否选对该程序约束的port并非output型而是inout型2.也可以将选好后窗口最下面的command中的tcl指令复制到约束文件中直接约束3.set_output_delay -clock [get_clocks -of_objects [get_pins clk_wiz_0_inst/inst/mmcm_adv_inst/CLKOUT0]] 1.0 [get_ports {dsp_par_dat[15]}]其中1.0代表约束到1ns但是这样肯定会时序报红系统会自动给约束到一个最小的时间这样做的目的实际并不是让时间最短而是让数据线等长。24.将2018.3版本升级到2020.2版本时直接点report IP一键升级会显示IP报红无法正确升级synthesis报错的情况但是messages里没有error信息解决办法在design runs里面找到所有报红的IP单独右键选择regenerate output product。刚开始可以一次多选几个IP统一右键regenerate但是到最后几个IP的时候只能一个一个gen不然依然无法正确编译完成所有IP编译后可直接生成bit。25.关于模块中寄存器是否清零情况解决办法一般来说模块中寄存器的清零只跟rst有关但是当出现系统出错而FPGA不复位的情况模块内部的寄存器就会出现无法清零的情况。①该寄存器只是寄存值的寄存器有无额外的清零信号都可新的数据会覆盖老的数据②该寄存器是一个累加的寄存器由于FPGA没有复位该值不会恢复到初始值必须加入额外的清零信号该信号可以是外部引入也可以是该模块状态机的初始状态生成的信号。26.PCIe link和约束问题PCIe link无法拉高修改约束编译后约束又变回未修改前的约束解决办法1.PCIe不仅要对FPGA端的引脚还要顺着引脚查看底板的引脚顺序本次问题出在底板引脚和FPGA端引脚顺序颠倒所以在vivado里配置约束的时候需要按照底板的顺序来而不是FPGA端的顺序2.在xdc或者implement窗口修改引脚约束编译后引脚约束又变回修改前的顺序。这是因为IP自带xdc会覆盖自己修改的xdc需要在自己xdc的引脚约束前添加如下语句set_property PACKAGE_PIN {} [get_ports {pcie_exp_rxp[3]}]set_property PACKAGE_PIN {} [get_ports {pcie_exp_rxp[2]}]set_property PACKAGE_PIN {} [get_ports {pcie_exp_rxp[1]}]set_property PACKAGE_PIN {} [get_ports {pcie_exp_rxp[0]}]随后再添加约束即可。set_property PACKAGE_PIN AB2 [get_ports {pcie_exp_rxp[3]}]set_property PACKAGE_PIN AD2 [get_ports {pcie_exp_rxp[2]}]set_property PACKAGE_PIN AE4 [get_ports {pcie_exp_rxp[1]}]set_property PACKAGE_PIN AF2 [get_ports {pcie_exp_rxp[0]}]27.以太网调试数据采集错误问题使用以太网RGMII_clk进行数据采集和拼接出来的数据RGMII_data错位1010变成了0101解决办法1.RGMII的clock可以给进PLL做适当的偏移处理让RGMII_clk的边沿能够对齐数据中间2.补充FPGA端抓到的Ethernet的UDP通信协议包图28.vivado关联notepad问题1.在vivado的tool-settings-tool settings-text editor选择custom editor输入D:/software/Notepad/notepad.exe [file name] -n[line number]2.如果设置好后出现C:\User\Administrator\AppData\Roaming\Xilinx\Vivado\12不存在。新建一个的对话框并在notepad中新打开一个12的空文件则需要关闭vivado和notepad软件并进入到C:\User\Administrator\AppData\Roaming\Xilinx\Vivado把Vivado文件夹删除重新上述关联步骤。29.vivado出现ila的ltx文件与bit文件不匹配问题WARNING: [Labtools 27-1979] The probes file(s) xxx.ltx is inconsistent. The core at the location uuid_1727B5D951045ED39DE3E93CB6CBF7B5 has unconnected port bits for input port 6.Resolution: Generate new probes file(s)该问题是bit文件与ila的ltx文件不匹配解决方法如下1.仔细查看编译的vivado软件路径与bit和ltx文件是否相同避免出现拷贝错版本的问题2.确定bit和LTX文件版本无误后在固化等后续调试刷LTX文件时会出现该错误通常原因是ila的IP里的probe位宽与所抓信号位宽不一致。可打开LTX文件根据报错的uuid_1727B5D951045ED39DE3E93CB6CBF7B5找到具体出错的ila再根据出错的port口查看probe再去程序中对应的例化地方查看。LTX文件30.三态门原理和实现问题记录1.假设我们需要实现一个三态门tri_data①当en信号为1时tri_data作为输出FPGA内部的输出信号out给到tri_data②当en信号为0时tri_data作为输入tri_data给到FPGA内部的输出信号in2.如果不考虑实际电路纯粹通过逻辑来实现就可能出现以下两种写法//方法一 assign in ~en ? tri_data : hz; assign tri_data out;//方法二 assign in tri_data; assign tri_data en ? out : hz;3.三态门的原理如下图所示是只有作为输出的时候存在高阻态即PMOS和NMOS都不导通的状态所以方案一错误方案二正确。4.如果实在不放心可以使用Vivado自带的原语。需要注意以下两点①方向不要弄混原语输入I是FPGA实际需要输出的数据输出O是FPGA实际输入的数据②多bit的时候记得使用generate语句加循环。//器件为7z045使用K7系列原语器件为7z020使用A7系列原语 inout [SIZE-1 : 0] tri_data; wire [SIZE-1 : 0] in; wire [SIZE-1 : 0] out; genvar i; generate for(i 0;i SIZE;i i 1)begin:tri_gate IOBUF #( .DRIVE(12), // Specify the output drive strength .IBUF_LOW_PWR(TRUE), // Low Power - TRUE, High Performance FALSE .IOSTANDARD(DEFAULT), // Specify the I/O standard .SLEW(SLOW) // Specify the output slew rate ) IOBUF_inst ( .O (in[i] ), // Buffer output .IO (tri_data[i] ), // Buffer inout port (connect directly to top-level port) .I (out[i] ), // Buffer input .T (en ) // 3-state enable input, highinput, lowoutput ); end endgenerate31.仿真中task撰写规则//task撰写语法 task input_position; input signed [31 : 0] target_pos_tmp ; input signed [31 : 0] encoder1_tmp ; input signed [31 : 0] encoder2_tmp ; begin target_pos target_pos_tmp ; encoder1 encoder1_tmp ; encoder2 encoder2_tmp ; repeat(200)(posedge clk) ; end endtask //task调用 input_position(10000,9700,9700);32、vivado最大线程修改在Vivado安装路径的scripts文件夹中新建Vivado_init.tcl名称不能错Vivado启动时会自动加载此tcl可以将需要启动执行的命令都写到此tcl文件中。这里在tcl中写入set_param general.maxThreads 32引用如何加快Vivado的编译速度_只改了约束文件怎么使得vivado编译加速-CSDN博客