第一次开发Lattic FPGA,记录一下遇到的问题供大家参考
使用的芯片时iCE40HX8K,采用的是外接flash方式。
问题1:烧写程序时出错
ERROR - Function:CHECK_ID
Data Expected: h16 Actual: hFF
网上有人使用其他款FPGA的,说是要先擦除,再编程。经试验,我这不是这个问题。经查资料,每一款flash都有其对应的厂商和ID,应当是编程协议中需要进行识别的,我这款ID的确是0x16,而报错是说收到的是0xFF,那么很有理由怀疑就是信号线一直处于高电平,而得到0xFF。因此对线路进行检查,后发现SPI的数据线错了,错误图如下:
我的SDI应当为SPI协议中的MOSI,SDO应当为SPI协议中的MISO,而这里的flash作为SPI协议中的从端(slave端),那么SDI应当连接到DI(pin5)引脚,而SDO应当连接DO(pin2)引脚,也就是说FPGA的SDO应当连接flash的DO,FPGA的SDI应当连接flash的DI。于是我用飞线的方式将两根线交换了,再测试,结果对flash编程成功了。
然而,始终觉得不对劲,自己设计电路时,是参考了lattice官方demo板的,按说不应该会犯这种低级错误。果然,问题并没有这么简单。
问题2:flash编程成功,但FPGA并未实现上电自动配置成功。
带着前面觉得自身不会犯那种低级错误的疑惑,我再次翻查了lattice官方demo和手册,原来这里的引脚还是有问题。
iCE40 LP/HX系列的官方demo我主要参考了:iCEstick评估套件以及iCE40HX-8K Breakout Board(分线板)。这里有一个坑我始料未及。
用过Xilinx和altera FPGA的小伙伴都知道,我们可以直接把程序固化到flash里面,然后FPGA上电自动从里面加载配置,或者我们也可以不固化,而直接下载程序到FPGA里(只不过这样会掉电丢失),同样的,我认为lattice也应当这样。
然而,我们先看iCEstick评估套件的设计图:
我一开始就是参照这个设计的,他的FPGA的SI就是连接flash的SDO,但是他的程序下载并不是用的JTAG,而是板上自带的USB芯片
后来我查询到,lattice的下载器HW-USBN-2B手册里讲到,demo板上自带USB芯片的情况下,是不能用这个下载器的,二者是冲突的。那么这里就有一个疑问,他的这种连接,编程flash时,相当于USB芯片是SPI主端,flash是从端,可是FPGA上电从flash自配置时,究竟谁是主谁是从???
再看iCE40HX-8K Breakout Board(分线板)
他同样有USB芯片,但他这里设置了一个跳线,可以选择设置是给flash编程还是设置给FPGA编程,也就是说,给flash编程和给FPGA上电自配置的接线是不一样的,即SPI的两根数据线是相反的,那么前面的疑问就明了了,前面的评估套件,也许他就是不能FPGA以主端的方式自动从flash加载配置。
于是我又实验了一下,我通过电脑直接给FPGA的SRAM编程,成功点亮了小灯,验证了我的猜想,也就是说,我更改了SPI接线后,可以给flash编程,也可以给FPGA的SRAM编程,但是FPGA却不能自动上电从flash进行配置,原因就是他的SPI接线是相反的,需要跳线。
总结
iCE40 这个芯片的电路设计需要小心,给flash编程和给FPGA SRAM编程以及FPGA与flash之间自动配置的SPI接线是有所不同的,里面的两根数据线是相反的。不过我也想不通,altera和Xilinx在这个上面都是可以既给flash编程,也可以给FPGA编程,还可以FPGA自动配置,接线不会存在引脚不同需要跳线的情况啊。难道lattice在设计上也是犯了此等低级错误???亦或是我自己尚未研究明白???