解决FPGA启动卡住问题

我们的实验板上的实验用FPGA是由Zynq通过SPI来写入bitstream的。我将Zynq移植到新实验板后, 尝试用它来写入我此前研制的上电自检代码, 但是发现Zynq写入完毕后, FPGA并不会自动运行, DONE信号也不会被拉高。经过尝试, 我又发现用JTAG连接一下这个FPGA后, 它就立刻工作正常了。经过更多次的尝试后, 我发现只有用到了MIG (Memory Interface Generator)的bitstream才会出现这个问题, 其他的bitstream都可以自动运行。

经过同学提示, 问题可能发生在FPGA的复位或初始化阶段。为此, 我查阅了UG470 7 Series FPGAs Configuration User Guide, 学习了一下FPGA的初始化流程。我进一步发现, 在FPGA拉高DONE信号并开始运行前, 可能会根据bitstream的配置来等待MMCM Lock或DCI Match。经过确认, 我发现用了MIG的bitstream都配置了等待DCI Match, 没有用的都没有配置该项。然而, 在Zynq写入完毕、FPGA卡住后, 我连接JTAG并读取FPGA相关状态寄存器发现DCI Match是成功的(注意此时因为连接了JTAG, FPGA开始运行)。进一步, 我在约束文件中将用到了MIG的bitstream中等待DCI Match的选项强制关闭后, 这个bitstream也能够在Zynq写入完毕后自动运行了。

至此, 我依然没有什么头绪, 并继续到处乱看文档。突然, 我看到一个时序图, 发现SPI的时钟应该在DONE信号拉高之后再停止。于是, 我猜测是之前的SPI时钟停止得太早, 在FPGA初始化完之前就停止了, 导致FPGA初始化卡住。然后, 连接JTAG后, JTAG继续为FPGA提供了初始化时钟, 使得FPGA初始化流程顺利完成。对此, 我在Zynq的SPI代码里多发送了一些垃圾数据来提供一些额外的时钟周期, 问题解决! 祝贺。

发表评论

注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)

本文链接:https://twd2.me/archives/18201QrCode