相对于源代码开放的开源软件,开源硬件似乎今人费解。因为传统的硬件体系中没有数字化代码,何来开源?因此,开源硬件的开源内涵主要体现在开源文化中的开放、低成本、可二次开发与可任意裁剪上。开源硬件的开放不仅是电路系统的开放,还在于对软件工程师的开放,因此,开源硬件诞生后,吸引了众多软件工程师进入嵌入式应用领域。
可二次开发的开源硬件,是一个基于软件开发的软硬件综合开发平台;基于软件的开发模式有利于软件工程师介入嵌入式产品开发;开源硬件可任意裁剪、任意选择的特点,为开发众多个性化嵌入式产品提供了低成本、低门槛、灵活、便捷的手段。
“开源硬件”:描述如今基于嵌入式产品平台、基于硬件描述语言、以软件技术为主的智能硬件的开发模式。
当今的开源硬件有以下几类:一类是由用户板进化出的可二次开发的板级开源硬件(早期以树莓派为代表);
另一类是开源硬件描述语言(以Chisel为代表源代码开放的开源硬件);
还有一类是开源 *** 作系统中的开源硬件数据结构(如ARM Device Tree)。
开源硬件描述语言:硬件描述语言HDL是一种用形式化方法描述数字电路和系统的语言。
硬件描述语言发展至今已有20多年的历史,它将硬件设计软件化,通过EDA工具(电子设计自动化)进行仿真验证,最终通过微电子的ASIC手段或半定制的FPGA来实现一个真实的硬件系统。这是一种非主流电子工程师的非传统硬件系统设计方法,成功地应用于硬件设计的各个阶段,如建模、仿真、验证与数字化模块的综合等。
随着系统级FPGA以及系统芯片的出现,软硬件协调设计和系统设计变得越来越重要。传统意义上的硬件设计越来越倾向于系统设计和软件设计结合。硬件描述语言为适应新的情况,迅速发展,出现了很多新的硬件描述语言。硬件描述语言从一开始就是一种用软件工具、在软件方法基础上实现的电路系统设计方法。
Chisel是加州大学伯克利分校研究人员设计并发布的一种新的开源硬件设计语言。他们认为现有的硬件描述语言VHDL、Verilog HDL等最初设计的目的是用来仿真的,所以有很多不可综合的语法,此外,VHDL、Verilog HDL缺少目前高级语言具备的一些特性,比如:对象、继承等,于是设计了Chisel,并将其开源。
Chisel建立在Scala语言之上,可以支持高级硬件设计。用户使用Chisel时,以编写Scala程序的方式来设计硬件电路。采用Chisel设计的电路,经过编译可以得到FPGA、ASIC的Verilog HDL的相关代码。目前国内外已有人使用Chisel语言成功地实现了多种开源处理器。有多个开源项目使用Chisel作为开发语言,包括:采用RISC-V架构的开源标量处理器Rocket、开源乱序执行处理器BOOM(Berkeley Out-of-Order Machine)等。
此外,Chisel的开源特性,也有助于用户了解硬件设计语言的内部实现机理,并在此基础上进行特定的优化与改进。
开源设备树设备树是嵌入式 *** 作系统中的一种开源硬件数据结构,是嵌入式 *** 作系统中板级支持包(Board Support Package,BSP)的华丽转身,其源头是PowerPC的Device Tree技术。目前,最著名的是ARM Linux中的扁平设备树FDT(Flattened Device Tree)。
早先在嵌入式系统中引入 *** 作系统时为了满足 *** 作系统对硬件单元的有效管理,设置了板级支持包,并添加有大量的驱动程序固件。板级支持包介于主板硬件与 *** 作系统之间,是 *** 作系统的一部分。程序员在使用嵌入式 *** 作系统时,可以根据硬件结构的变化,在BSP中添加一些和系统相关的驱动程序。因此,随着主板的升级与变更,BSP也愈加庞杂。
以ARM Linux为例,早期的ARM Linux中充斥着大量的垃圾代码,相当多的代码只是在描述板级细节,而这些板级细节对于内核来讲,只是垃圾。后来引入了PowerPC已成熟应用的Device Tree技术,使得ARM Linux内核中的BSP华丽转身为扁平设备树(FDT)。
Device Tree是一种描述硬件的数据结构,基本上是一个描述电路板上CPU、总线、设备组成的树形结构,由一系列的结点(node)和属性(property)组成,结点本身可包含子结点,可用来描述原先kernel中的大量板级细节与硬件细节,直接透过它传递给Linux。Bootloader会将这棵树传递给内核,然后内核可以识别这棵树,并根据它展开出Linux内核中的众多设备,而这些设备用到的内存、IRQ等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应设备。使用FDT后,Linux内核可以直接通过FDT获取硬件的细节信息。
由根结点、子结点、叶结点形成了硬件相关的树形结构,树结构将在节点之间创建父子关系,此父子关系是体系结构无关性的关键。当叶驱动程序或总线结点驱动程序本质上需要依赖于体系结构的服务时,该驱动程序会请求其父级节点提供该服务。采用此方法,不管计算机或处理器的体系结构是什么,驱动程序都可以正常运行。使用FDT后,Linux内核可以直接通过FDT获取硬件的细节信息,这使得ARM Linux内核中的冗余编码大大减少,同时也使得用一个内核镜像去引导同一类ARM芯片集的硬件平台成为可能。
2017年《单片机与嵌入式系统应用》第3期罗名驹等人的“扁平设备树FDT在ARM Linux中的应用研究”详细地介绍了ARM Linux中的FDT,以及如何通过FDT获取板级硬件的细节信息。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)