从零开始写一个Xilinx FPGA Loader

本篇文章开始,我会记录一下自己从零开始搭建一个Xilinx FPGA Loader的过程。

背景

之所以会有这么一个想法,主要是Xilinx FPGA的下载器非常贵,即使淘宝上面的不正经的下载器也是非常贵,我买一个廉价的FPGA才不到100块,而配套一个下载器就要好几百,真的是很不人性。另外一个原因就是Vivado下载器似乎是不支持Spartan 6 FPGA SPI Flash下载的,总之各种原因夹杂在一起,也是崇尚自由的精神,我决定写一个可以实现FPGA bit下载更新的一个FPGA Loader,这个项目我正式命名为Xloader。

技术路线

我呢,各种技术玩的比较泛,各种技术都有了解,但是也不是很精通,这样对于设计的深入有点难度,但是对于技术的选型则是比较灵活。因为我平常嵌入式处理器玩的比较多,FPGA偶尔涉猎,并且之前接触过开源的Picorv32的RISC-V核,这个核只有1个文件,十分精简,资源占用也不是很多,所以这次设计就决定采用这个核来进行设计,有了处理器之后,我们还要有相应的外设。这次我们主要会用到两个外设,一个是UART,用于和PC进行通信,另外一个就是SPI,可以用于操作FPGA的配置Flash。这也是两个比较常用的外设,网上找了一圈之后,决定用一下蜂鸟开源处理器的两个IP。为了配合上位机的串口通讯,我们还需要编写相应的串口通信控制程序,这里用的是Python,简单粗暴并非常好用的脚本语言,这个语言真的是我的最爱。

SOC设计

因为采用的是非常精简的核,并且相应的IP也比较简单,另外我们在系统上电之初还需要识别一个按键,从而确定系统是进入Flash Loader还是直接执行更新好的FPGA程序,最好还要有个LED可以显示当前系统的状态,所以我又设计了一个GPIO模块,这个模块可以读取外部pad的状态,也可以驱动GPIO从而控制板载LED的状态。

有了核心和模块之后,我们只需要将相应的模块编好地址,另外给CPU添加相应的SRAM就可以实现一个精简的SOC了。

SOC设计中碰到的一点问题

最开始,因为感觉系统非常简单,并且只有一路单独的时钟,嫌麻烦就没有添加PLL,结果系统运行是非常的不稳定,无奈之下,我还是在系统中添加了PLL,这样系统可以非常稳定的运行。

FPGA 程序更新方式

Xilinx虽然下载器比较贵,但是相应的配置文档给的还是比较全的,就是稍微有点难以理解,对于FPGA的配置,我们可以直接将需要的bit下载到FPGA外部配置flash中,下载地址可以不从0开始,而是空出一个Golden bit的空间,这个空间可以用来存放Xloader,这样每次上电都会进入到Golden xloader,进入Loader之后,Xloader判断用户按键的状态,并依据状态来决定是留在Xloader等待下载还是boot到之前已经配置好的Bit中。当Xloder从PC收到bit并更新到SPI flash中之后,或者用户按键是希望直接boot用户bit,FPGA会通过向内部的ICAP发送配置和重启信息,FPGA收到信息之后会根据配置好的地址读取新的配置文件。

以上就是Xloader的基本原理。后续我会更新相应的具体实现。

相关文章

发表新评论