这里主要是讨论和验证一下Altera的SOC FPGA的启动方面的特点或者是优势。因为我以前做过FPGA和飞思卡尔的CPU,所以对启动,知道是很头疼的问题。尤其是对于把FPGA当CPU的外设,其BSP的改动还是比较费心思的。当然照着已经开发好的硬件板子和开发好的preload而言,用不着考虑启动的问题。而对于以后的开发,如果不了解启动问题,非常非常难的后续开发。当然这是对于硬件工程师和系统工程师而言的,对于APP的开发人员,没有什么意义。
Altera的SOC是一个ARM-9的HPS和一个Altera的FPGA的合体。因此对于SOC的FPGA的启动,显得非常的灵活多变,而且Altera在启动方面做了很多对于用户方便的地方。
对于FPGA的配置启动,对于大多数做过FPGA的人来说应该非常熟悉,PS,AS,JTAG,FPP,CVP等等。各个FPGA厂家都差不多,而且每个厂家的软件都做了很详细的配置和编程时序,用起来也方便,硬件上专门的应用文档都比较清楚。而对于SOC而言,FPGA的配置又多了一个便利的地方,就是通过HPS去配置FPGA,把FPGA的配置文件装载在HPS的preload部分,相当于把FPGA的配置控制放在了CPU中,把FPAG作为HPS的一个外设用。这其中有个最大的好处就是能对FPGA进行动态的加载,也就是说我们可以通过在HPS中的操作系统(比如LINUX)来对FPAG进行动态加载。这个有个非常好的地方就是大多数操作系统包括linux都能动态卸载驱动后重新加载驱动,意思就是可以对FPGA这个外设进行运行过程中的再配置。这对于通过网络远程软件升级带来了很大的便利。在larkboard的板子上就可以按这种方式对FPGA进行配置。本人做了些尝试,虽然过程很艰难,但在embest的帮助下,还是能够简单对FPGA的ADC采样做了一个小例子。
而对于ARM等CPU而言,启动会比较复杂一些,从流程上说,所有的CPU都差不多,都是从ROM开始,这个是CPU启动后的第一件事,CPU的指针会指向这个启动ROM的地址。比如在飞思卡尔的CPU启动中,这个ROM是外置的,因此地址线的定义一定是要把CPU的复位转移地址指向这个ROM的地址上,而SOC中,这个部分固化在芯片内部,这对于硬件上说会省掉一部分ROM或者是EEPROM的成本。而且放在内部,对于外部硬件来说少一个器件,少一个硬件地址连接的麻烦,而且不会出错。而这个ROM启动程序中,一定要做好下一步的地址定义,在SOC中称之谓存放preload部分的地址,而preload相对于BOOT ROM要大很多,所以这个就必须要外置了,也就是开发板中的SD/TF卡,eMMC flash卡。Cyclone器件不支持NAND的preload。我们称之谓第二启动加载,在一般的CPU中叫第二bootloader。通过把把preload中的程序加载到内部RAM中,CPU开始运行这部分程序的时候,这部分程序比较类似于初始化设备地址等,相当于给启动外设的驱动等,这个和通常的BSP比较类似,在SOC中命名为SPL:设置处理器,配置外部存储器控制器和专用外设I/O引脚,允许用户应用程序代码(可以是OS的启动加载程序)从启动源装入到DDR存储器中。在这一阶段,配置处理器和所有处理器专用I/O—因此,OS启动加载程序(例如U-Boot)甚至可以通过外设(例如通过以太网)来装入OS二进制代码。对于开发过CPU的人,这样一类比,就比较容易理解SOC中的各步的含义了。而且这一部分还可以装载FPGA的配置信息,就是说FPGA的配置信息和ARM的HPS的启动可以放在同一个外部flash或者是NAND中,这又是省掉一个外部硬件器件的地方。对于FPAG和ARM CPU分离的设计,这里需要两个FLASH,一个放FPGA的专用配置信息,一个放CPU的第二启动程序,相当于硬件上麻烦一倍。而第三步当然就是启动的操作系统了,内核启动,这个步骤一定是建立在第二步硬件驱动的基础上的。没有底层驱动,何谈操作系统。很多做操作系统的人,对内核的BSP一定熟悉。当然最后一步才是在此基础上的应用软件的开发,这对于软件开发工程师,就是很熟悉的了。
而对于SOC来说,相对于纯的CPU,就是多一个从FPGA启动的便利了。对于以前的开发,曾经做过从FPGA启动CPU的工作,非常的繁琐,而且重要的是要能理解CPU启动中的FPGA能给予正确的时序,FPGA能正确的传输数据,要对CPU的启动理解深刻和非常熟悉,这对于专门做FPGA的人来说很头疼。而在SOC中,这个工作相对于简单一些了,因为硬件上说内部通过QSYS硬件实现FPGA和CPU的HPS-2-FPGA bridge桥接,相当于时序上我们不用考虑那么多,控制上只需要把Preload部分的启动地址改为0xC0000000, corresponding to offset 0就OK。比较以前的分离两部分,要简单容易得多。这是因为altera为客户考虑了曾经遇到的麻烦问题。当然这里有个前提就是FPGA的配置在先,HPS的启动在后,这对于少部分希望HPS先启动的要求不满足。但对于大多数而言还是很ok的。
在Lark Board的板子上,为我们配置了SD/TF卡,eMMC flash卡的启动,没有做FPGA的对HPS的启动。本人需要的是一个软件无线电平台,所以用TF卡和flash卡 启动只是其中的一些方案,而更多的是要适用于熟悉FPGA而不熟悉HPS的同事。因此除了从TF卡启动外,我尝试从FPGA启动HPS。我采用的方法是通过FPGA把启动文件放在FPGA的外部SDRAM中,然后控制FPGA从SDRAM中把文件送给HPS启动。这个过程还在进行中。而实际未来的操作是给FPGA配置一个外部FLASH,把HPS的preload文件放张FPGA的flash中,通过FPGA读取flash内容给HPS启动。在larkboard上貌似没有这样的硬件条件,只有这样做做看了。估计有人觉得是多此一举,其实是因为有些同事就觉得FPGA更熟悉,对CPU/HPS不熟悉,因此FPGA启动HPS比HPS启动FPGA更喜欢而已。
SOC的FPGA是一个新的技术,因此很多东西都还在摸索中,因此进展比较缓慢,但有个平台,方便了不少,参加竞赛只是一种方式,而对于SOC的应用,未来的路还很长,因此这次是一个切入SOC FPGA的一个机会。条条道路通罗马,以前分离的两部分,如果能在一个器件上实现,未尝不是追求价格和利益最大化的一个好的方法呢。
题外话呢,今年公司形式变化,给了很多前所未有的忙的工作,因此对于这次竞赛实在有些愧对初衷...只能说遗憾
本帖最后由 Xidianboy 于 2015-4-19 08:30 编辑