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 read(S2MM),总线上能抓到数据,但是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(1'b0), // Programmable inversion on CE
.IS_I_INVERTED(1'b0) // 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,再去程序中对应的例化地方查看。
30.三态门原理和实现问题记录
1.假设我们需要实现一个三态门tri_data:
①当en信号为1时,tri_data作为输出,FPGA内部的输出信号out给到tri_data;
②当en信号为0时,tri_data作为输入,tri_data给到FPGA内部的输出信号in;
2.如果不考虑实际电路,纯粹通过逻辑来实现,就可能出现以下两种写法:
//方法一 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, high=input, low=output ); 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博客)