FPGA问题汇总

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

想把一些工程应用中碰到的问题和解决办法也合并到这篇文章里面。分成两部分,第一部分记录编译过程的问题,第二部分记录实际应用的问题。


一、VIVADO编译问题

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当成数组下标的原因导致的。

在这里插入图片描述
在这里插入图片描述

二、工程问题

1.异步FIFO使用

我使用了一个FIFO Generator的IP核,输入端接ADC的20MHz时钟和数据,输出端用FPGA的100MHz系统时钟取出来进行处理。

代码如下:

在这里插入图片描述

但是出现了两个问题:
1.输入端时钟如果不通过打两拍与系统时钟同步,会导致读不到数据的问题。
2.输入端时钟打两拍后,输入数据也必须打两拍,不然会导致数据出错。
虽然我通过上面的操作解决了FIFO读数的问题,不过有可能只是运气好,因为原因我还没有找到。
我有几点疑问:
1.异步FIFO本来就是拿来处理这种问题的,为什么还需要同步?
2.一般来说不能对异步数据进行打拍,因为位数太多,打拍的时候有亚稳态会导致数据出错。

2023.5.16 更新
以前的异步FIFO使用其实有很多不对的地方,只是开始我的项目没暴露出来。
目前重新总结了几点:

  1. FIFO的复位信号需要与写时钟同步。
  2. FIFO的写使能信号需要与写时钟同步。读使能与读时钟同步。
    3)FIFO的写数据需要与写时钟同步。读数据与读时钟同步。
  3. FIFO的读使能需要同时判断empty信号,写使能需要同时判断full信号,否则可能导致读空写空情况。

2.FPGA功耗问题

这个问题其实很业余,不过我还是写下来了,希望对像我这样的新手有些帮助。

我的一个项目以前用的是XC7A70T的芯片,通过LDO来供电。后来因为需要改成了XC7K325T的芯片,我却没有改电源。导致高温的时候FPGA无故掉线,自动重新加载。后来查出来是温度高了,FPGA的1V核心电压电流快速变大,导致出错。
我是临时把LDO改成了DCDC电源,又通过降低系统时钟来减小功耗,勉强能用了。
所以有几点需要注意的:
1.注意查芯片资料明确FPGA的电源使用要求。
2.VIVADO工程编译完成后会有功耗的预估,可以参考。
3.最好使用专用的电源芯片给FPGA供电。
4.其实以上几点也不是必须的,因为上面几点留的余量都很大,比如说资料里面说的1V的核心电压最大电流2A,专用的电源芯片更是能提供4A的电流,但是我的LDO输出电流最大只有300mA,常温时也工作正常。像我现在这个板子都不满足以上几点,也能用,就是风险较大,应急可以。下一版我肯定后改过来。


3.有符号数问题

有符号数和‘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) //超过斜率门限//

总结

这篇文章会随着我的实际工作,不定期更新。欢迎交流。

  • 10
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
《Hello FPGA》系列书籍是一套以FPGA为主题的入门级书籍,由锆石科技出版发行。该系列书籍共包括4本,分别是《Hello FPGA》、《Hello FPGA:数字电路设计》、《Hello FPGA:工程实践》和《Hello FPGA:嵌入式系统设计》。 《Hello FPGA》是本系列书籍的第一本,内容主要涵盖FPGA概念、FPGA开发环境、FPGA开发语言及FPGA基础项目等方面的内容。本书重点讲解了FPGA所具有的优点和应用领域,以及FPGA开发流程中的各个环节。 《Hello FPGA:数字电路设计》是第二本书籍,该书主要涵盖数字电路设计基础知识、Verilog HDL语言以及数字电路实例设计等方面的内容。本书内容涉及数字电路实例设计的方方面面,非常适合从事数字电路设计的读者。 《Hello FPGA:工程实践》是第三本书籍,本书主要涵盖FPGA开发实战、FPGA高级开发知识以及FPGA性能分析等方面的内容。本书内容涉及到了FPGA开发中复杂的设计和实践技巧,是提高读者FPGA开发技术的好帮手。 《Hello FPGA:嵌入式系统设计》是最后一本书籍,内容主要涵盖FPGA在嵌入式系统中的应用、基于Xilinx Zynq的系统设计、Linux内核驱动程序设计等方面的内容。本书内容适合对于FPGA在嵌入式系统中应用感兴趣的读者。 总的来说,这套《Hello FPGA》系列书籍从平民化的角度出发,揭示了FPGA技术的基础认识和开发实践,全面覆盖了FPGA设计和开发领域的应用与实践,是想要学习FPGA的初学者或者是已有一定基础想要再深入学习的读者的不错选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pp_0604

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值