提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
想把一些工程应用中碰到的问题和解决办法也合并到这篇文章里面。分成两部分,第一部分记录编译过程的问题,第二部分记录实际应用的问题。
1)implementation时Timing报警 no_input_dalay和no_output_dalay
解决办法:正在找。
发现一篇文章,写得比较详细。就是说这个是和外部器件有关的,所以需要人工在XDC里面设置。
李锐博恩【 Vivado 】输入延迟约束(Constraining Input Delay)
我在XDC增加了
set_input_delay -clock [get_clocks FSMC_CLK] -min -add_delay 0.000 [get_ports {FSMC_D[15]}]
报错说
又增加了一条
create_clock -name FSMC_CLK -period 50 [get_ports FSMC_CLK]
后消除了报错和no_input_dalay的警告。
2)synthesis时使用的IP核提示引脚未连接[Synth 8-3331] design wr_status_flags_as has unconnected port WR_RST
还未找到原因
3)implemention时报错 [DRC REQP-1839] RAMB36 async control check: The RAMB36E1 that has an active asychronous set or reset.
原因是我使用的IP核BRAM的输入信号,在异步复位时被驱动改变了,建议取消或者改成同步复位。
屏蔽后警告消除
4)自己封装IP核时,自己建的时钟会出现警告
[IP_Flow 19-3153] Bus Interface ‘FPGA_50MHz_CLK’: ASSOCIATED_BUSIF bus parameter is missing.
具体解决办法见
这个引用的文章
5)synthesis报警告:
[Synth 8-5788] Register FPGA_Crtl_Reg_reg[1] in module FPGA_COMM_RX_ctrl is has both Set and reset with same priority. This may cause simulation mismatches.
这一条是指REG信号同时复位和赋值了。一般都是指没有在系统复位的时候给他赋初值。
6)synthesis报警告:
[Synth 8-6014] Unused sequential element state1_n_reg was removed.
好像这是VIVADO自身版本的问题,实际上我只用了state1_n,也没有被删除。state1_n_reg是VIVADO自己添加的变量,然后又给删除了。
7)今天碰到一个很奇怪的问题,我以前工程是50MHz晶振输入后,通过PLL变成100MHz作为系统时钟,后来改成了50MHz直接输入作为系统时钟,把PLL删除了。导致用TESTBENCH仿真的时候报错,根本进不去仿真。后来解决办法是在工程中把输入的50MHz用assign连了一下线,再用FPGA_50MHz_CLK_in作为系统时钟,就可以仿真了。
assign FPGA_50MHz_CLK=FPGA_50MHz_CLK_in;
具体原因我在网上也没查到,怀疑是不能直接用晶振作系统时钟,仿真的时候识别到了,所以报错(但是我只加了一个assign,只是连了一条线,为什么仿真就能通过了)。如果有官方的解释希望大家告诉我一下。
(不能直接用晶振作系统时钟应该是担心相位不稳定,需要通过PLL锁相。但我实际使用,到了60°C也没有问题,可能是因为我的工程对时序要求不太高。)
8)2022.03.17
用BD时两个端口连接不匹配报错
[BD 41-237] Bus Interface property MASTER_TYPE does not match between /blk_mem_gen_0/BRAM_PORTA(OTHER) and /axi_bram_ctrl_0/BRAM_PORTA(BRAM_CTRL)
不知道怎么解决,应该是AXI BRAM Controller的端口多了一个bram_rst_a的引脚,还有we的引脚是四根线。原来是BRAM必须选conrtol模式。
9)2022.04.22
使用clk_wiz_0时钟核时,报错
[DRC REQP-1712] Input clock driver: Unsupported PLLE2_ADV connectivity. The signal clk_wiz_0_i/inst/clk_in1 on the clk_wiz_0_i/inst/plle2_adv_inst/CLKIN1 pin of clk_wiz_0_i/inst/plle2_adv_inst with COMPENSATION mode ZHOLD must be driven by a clock capable IO.
解决: 这里把单端信号改成全局时钟
新问题:后端ARM的网口不通了,但是我的FPGA和后端的网口完全没关系,不知道为什么会出这个问题。
解决:查出来不是时钟域的原因,应该是上次编译的时候ILA核出现问题,导致的。但是为什么会影响到网口,不清楚。因为两者完全没联系。只能怀疑是ILA核影响到了和ARM的通信,ARM又影响到了网口通信。
10)2022.07.05
仿真的时候一直报错,说找不到仿真文件。后来发现是文件路径太长,超过80个字符,导致找不到。
这个和WINDOW系统有关系,LINUX没有这个问题。
如果仿真或者编译的时候提示文件找不到,可以考虑一下这个问题。
11)2022.10.28
有一个工程用到XCZU15EG这个芯片的IO口接收高速AD9467的数据,用的是差分输入,1.8V电平。编译的时候报错,意思应该是说我XDC里面设置的端口阻抗模式和电平不匹配,但是我只设置了电平为DIFF_HSTL_I_18,端口阻抗DIFF_TERM_ADV TERM_100这个是自动生成的。
XDC里面设置如下:
set_property PACKAGE_PIN K16 [get_ports {ADC_DATA_IN_N_0[7]}]
set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {ADC_DATA_IN_N_0[7]}]
set_property DIFF_TERM_ADV TERM_100 [get_ports {ADC_DATA_IN_N_0[7]}]
报错:
[DRC PORTPROP-6] I/O standard compatibility with attribute usage: Port ADC_CLK_P_0 has property DIFF_TERM_ADV set, but its I/O Standard, DIFF_HSTL_I_18, does not support this property.
解决:
把set_property DIFF_TERM_ADV TERM_100 [get_ports {ADC_DATA_IN_N_0[7]}]这一行删除掉了,不过我不知道这是怎么生成的,删除了也不清楚会有什么后果,反正编译能正常通过了。我在网上查了一下这个是指在差分端口之间有一个100欧的匹配电阻。
12)2023.03.22
我有一个数组,
begin for (index=0;index<='d512;index=index+1) begin cali_AD[index] <= 'd0; end end
想用set up debug的时候找不到index这个信号,网上找了好几个办法都不行:
A) 用了(mark_debug = “true”)不行。
B) 用了(* KEEP=“TRUE” *)也不行。
C) 在XDC里面添加set_property MARK_DEBUG true [get_nets yc_de]报错。
D) 最后,添加了几个wire信号,并且把wire信号当成数组的下标,然后index和index_wire都能debug了,不知道为什么。应该还是以前把index当成数组下标的原因导致的。
我使用了一个FIFO Generator的IP核,输入端接ADC的20MHz时钟和数据,输出端用FPGA的100MHz系统时钟取出来进行处理。
代码如下:
但是出现了两个问题:
1.输入端时钟如果不通过打两拍与系统时钟同步,会导致读不到数据的问题。
2.输入端时钟打两拍后,输入数据也必须打两拍,不然会导致数据出错。
虽然我通过上面的操作解决了FIFO读数的问题,不过有可能只是运气好,因为原因我还没有找到。
我有几点疑问:
1.异步FIFO本来就是拿来处理这种问题的,为什么还需要同步?
2.一般来说不能对异步数据进行打拍,因为位数太多,打拍的时候有亚稳态会导致数据出错。
2023.5.16 更新
以前的异步FIFO使用其实有很多不对的地方,只是开始我的项目没暴露出来。
目前重新总结了几点:
我的一个项目以前用的是XC7A70T的芯片,通过LDO来供电。后来因为需要改成了XC7K325T的芯片,我却没有改电源。导致高温的时候FPGA无故掉线,自动重新加载。后来查出来是温度高了,FPGA的1V核心电压电流快速变大,导致出错。
我是临时把LDO改成了DCDC电源,又通过降低系统时钟来减小功耗,勉强能用了。
所以有几点需要注意的:
1.注意查芯片资料明确FPGA的电源使用要求。
2.VIVADO工程编译完成后会有功耗的预估,可以参考。
3.最好使用专用的电源芯片给FPGA供电。
4.其实以上几点也不是必须的,因为上面几点留的余量都很大,比如说资料里面说的1V的核心电压最大电流2A,专用的电源芯片更是能提供4A的电流,但是我的LDO输出电流最大只有300mA,常温时也工作正常。像我现在这个板子都不满足以上几点,也能用,就是风险较大,应急可以。下一版我肯定后改过来。
有符号数和‘d50比较会出问题。
如下:
if(pulse_neg_slope > ‘d50) //超过斜率门限//
当pulse_neg_slope为-90时,判断条件也成立了,-250时没成立,感觉是随机的。
写成if(pulse_neg_slope > 50)
是对的,不过标准写法应该写成这样:
parameter signed [11:0]s12_slope_threshold = 50; //–斜率门限
if(pulse_neg_slope > s12_slope_threshold) //超过斜率门限//
这篇文章会随着我的实际工作,不定期更新。欢迎交流。