FPGA软件的“仿生”设计理念初探
2016-05-03安徽四创电子股份有限公司何启跃
安徽四创电子股份有限公司 何启跃 徐 瑾
FPGA软件的“仿生”设计理念初探
安徽四创电子股份有限公司何启跃徐瑾
【摘要】本文从分析FPGA芯片的内部构造及工作方式入手,在阐述FPGA软件的基本开发流程及常见的设计误区过程中提出了一种将电路功能模块的描述看做是“生命体”的仿生的设计理念。经对比分析表明,“仿生”设计理念对理解概念和激发灵感有着非常积极的促进作用。
【关键词】FPGA软件设计;模块划分;仿生
1 引言
做为大规模可编程逻辑电路芯片的主要代表,FPGA(Field Programmable Gate Array)正以其独特的全开放、可重构、大容量、高集成度及高速并行计算能力等优点迅速成为各种中、高端数字电路中的核心器件。
FPGA的最大特色在于其内部电路结构的可重建性。因此描述其内部电路构造的软件设计是否合理、稳健将会直接影响着其可靠性和并行处理能力的发挥。
在多年的FPGA软件研发中,我们尝试将高效的人员组织架构及沟通方式等人们所熟知的概念和理论融入到FPGA软件设计中。通过大量的研发实践证明,在这样的理念指导下,庞大而复杂FPGA软件设计过程更明晰化、条理化了,最为突出的是在不经意间实现了高效、优化的软件设计。
以下将从分析FPGA芯片的内部构造入手,对这一结合了“仿生”理念的FPGA软件设计方法进行进一步阐述。
2 FPGA的特点分析
如果要用更为生动的语言来描述FPGA芯片,我们可以这样理解:倘若把一片设计完成并具备了某些特定功能的FPGA比作是一台专用机器设备的话,那么未被编程的FPGA芯片可以认为是一个庞大的“零件箱”,其中存放着一堆堆细如沙石的、构成数字电路所必需的最基本单元,它们包括:逻辑门、存储块、乘加器、专用运算核等“零件”。这些基本部件在没有被编程配置前是相互独立存在且没有任何连接关系的。
为了让一片FPGA真正动起来并完成所需要的各种功能,一件必不可少的工作便是从该“零件箱”中选择各种所需要的零件进行复杂的组装连接,并最终构造出一组或多组任务不同、相对独立、能在各种信号互传下协同工作的功能模块集合,这种根据某型号FPGA芯片内所提供的资源将各种“零件”组装成“机器”的设计过程便是FPGA软件设计,而将这一构造方案装入FPGA内搭建并付诸实施的过程便是FPGA软件的加载过程。
作为比较,我们先来看看通用计算机内的中央处理器(CPU),其实,该芯片是一颗内部电路结构已经固化下来的专用集成电路,为了完成不同的处理功能,它并不是像FPGA那样靠在芯片内组合搭建不同的电路结构来满足需求,而是靠逐条解析事先编排好的工作指令并做出不同的动作响应来满足不同的功能要求。于是,计算机系统的工作流程被设计为:在一定频率的连续时钟驱动下从指令存储器中顺序取出一条指令,而后执行这条指令,之后再取指令-执行指令…,如此周而复始地工作下去。显而易见,这样的工作模式并不能对同时发生的事件进行并行实时处理,而只能按部就班地顺序执行指令,并以串行方式对事件进行处理。所谓“一心不可二用”便从根源揭示了CPU的工作特点。
而FPGA正是因为将其硬件架构完全开放给了设计者,因此研发人员便完全有可能将其构造成n个“心”。可以形象地理解为:计算机软件是在设计一个人处理事务的工作流程,而FPGA软件则是在构造一个大到“团队”甚至是“公司”级的工作体系,小到设计每一名员工的工作流程。
3 FPGA软件的基本开发流程
FPGA软件设计的本质就在于完成对FPGA内部电路构造的个性化描述。一般而言,描述电路构造的方式可分为原理图输入方式和语言描述方式(Verilog、VHDL)这两大类。原理图输入是最为直接的电路描述方式,它是以“选择元件库”→“调入元器件”→“器件引脚连线”这一系列画图过程来构造电路结构的。由于这种方式受到器件种类的影响,因此很难完成更为复杂的电路描述任务。而类似计算机程序(如C语言)设计的硬件描述语言设计则是以事件的逻辑行为描述为主线而展开的电路描述过程,可以说它是一种与人类的认知逻辑和思维活动更为贴近的描述手段。
准确来讲,Verilog和VHDL语言是为了描述FPGA内部逻辑电路架构而产生的,它们既不是指令集合,也不具备前后的顺序性,所描述的每一段代码通常都对应着某一个电路结构。因此需要FPGA软件设计者对电路组成有较深的认识。
通常情况下,FPGA软件设计人员会本着自顶而下、由粗而细的思路展开设计。大致的步骤可归纳如下图1所示。
图1 FPGA软件基本开发流程
“FPGA器件选型及引脚定义”完全是依据目标FPGA芯片型号及其所处电路板中的连线状态而定的。由于FPGA 芯片的大部分引脚功能是开放给设计者自由设定的,因此“定义”过程便是为了明确FPGA芯片各引脚在目标电路板中的名称及功能属性,并确保FPGA软件设计(芯片内部电路的可编程描述)与FPGA相关硬件设计(FPGA所处电路板的设计)的输入及输出接口的一致性。换言之,就是在明确该芯片与外界进行信息传递的途径。
“软件架构设计及功能模块的划分”本质来说就是依据需要完成的具体功能明确主要的功能体及其所属层次化功能体的划分。这显然是FPGA软件设计的关键所在。困扰设计者的常常是:到底该划分出几个、什么样的子功能体来协同工作呢?这其实牵扯到了一个不同功能体间的分工与合作问题,由于VHDL语言(或Verilog语言)中的功能模块通常是在各自独立的时钟驱动下独立并行工作的,因此“分工”(划分出的功能模块)越多,其整体的并行处理能力会越强,但随之而来的便是“合作”(用于统一各功能模块协调工作)的资源占用也就越多,协调控制逻辑也就越复杂。
“各层功能模块的描述”也就是真正的FPGA软件代码或电路图形化设计过程,其宗旨是完成FPGA内部电路构成的描述。应该说,在整个开发过程中花费时间最多的通常会是这一阶段。设计者在对既定的功能模块进行再次分解及语言、图形描述过程中常会出现逻辑关系的描述错综复杂且毫无条理、将无关联性的功能归入同一功能模块、某些功能模块异常臃肿繁琐、某些模块间的信号传递杂乱无章、信号事件结果被多个过程体同时驱动、逻辑判断层次过多、逻辑判断出口说明不全、对某些长线任务不做过程保护等等。这些常见的错误和不合理设计可以归咎于设计经验的不足,但有没有一种好的方法让设计者不是从屡屡的纠错中得到提升而是在之前就能迅速掌握要领呢?
“逻辑功能仿真”由于没有将信号在FPGA芯片内流动的准确延时特性反应到其输出结果上,因此仅是一种初步的逻辑关系验证。
“综合、布局布线”是将高级抽象的电路描述对应转化为芯片内各种基本单元的连接关系。这一过程通常可由芯片厂家所提供的工具软件自动完成。
“时序仿真”则是在明确了芯片内的真实电路构成(即完成了布局布线)后,将各信号在FPGA内真实的延时信息反标注到设计网表中以检测整个设计的处理效果,其验证结果的真实性很强。需要强调的是逻辑及时序仿真都需要为仿真工作设计一组覆盖面广、真实性高的激励波形信号,用以激发信号响应。就如同给验钞机放入几张验钞币以检验其效果一样,验钞币所具备的全面性特征是验钞机测试的关键。
“配置下载”是指将编译生成的标明FPGA内部基本单元连接关系的位数据流文件传递给FPGA以实现其内部的电路重构。可借助配置工具软件自动完成。
4 “仿生”理念的引入
我们已经知道,FPGA开放给我们的是最基本的“零件”,我们完全有可以通过不同的设计组合构造出我们所需要的若干“工具”、“设备”、“机器”甚至是由若干“机器人”组成的“工作团队”和“机器人社会”。这些名词其实在我们每一个人的头脑中并不陌生,只是我们很少或不愿将其与电路及芯片建立联系。其实,不论从FPGA的内部构成、工作原理还是软件描述形式都与生命个体、团体、社会的存在及沟通方式极为相似,我们完全有理由在我们的头脑中建立起一座“仿生”桥梁。如果我们将FPGA内部的各种电路结构看做是一个个“生命体”的话,那么很多软件设计中遇到的难题和困惑都能轻松地得到解释。
先拿FPGA软件设计中的功能模块划分来说,这就好比是一个项目需要事先明确到底该由几类人来承担,每类人的人员数及他们的从属关系又是怎样等等。我们在做项目人员划分时所秉承一些原则,如:同类人员分为一组、组间协同工作所需的信息传递量要最小化、不让单个个体承担过多的任务而影响整体效率、在项目人员数量及人力成本与沟通成本之间寻找平衡点等等,这些划分原则同样是适用于FPGA软件模块划分的。
另外,许多FPGA软件设计者常会编制出不同功能体对同一信号进行驱动的代码,这在FPGA软件中会被严格禁止。因为FPGA代码对应的是其内部的电路,电路中的信号连线具有独占性。一个信号又怎么能同时被两个事件来控制呢?就像是一个开关不能同时被两个人操控一样,一人想开,一人想关,开关将做何响应呢?
再有,许多FPGA软件设计者总是习惯于书写套装了超过4层以上的“IF…ELSIF…”语句,这在需要高速时钟处理的FPGA中是非常避讳的。每个后级判断一定要等到上级判断不成立后才会进行,这就会给后级判断带来延时,而过长的延时很有可能会造成整个逻辑判断的混乱甚至是崩溃。这就好比让一个人通过多层筛选去决定所要做的事,如果要做的是最后一件事,那么待到判断出要做什么事时,“黄花菜都已经凉了”。而最快的选择方式显然应该是在同一个判断层面上依据某个特征去匹配对应要做的事,也就是“CASE…WHEN…” 语句。
还有,许多设计者在编写通讯程序时不考虑双方确认的逻辑,试想,如果我们在通电话时仅是一方说话,另一方不做确认应答,那说话方会再继续说下去吗?正常的通话方式难道不是一方说完一断内容后,另一方说声“是”或“好的”吗?
其实,许多FPGA软件设计中常见问题的根源并不是很复杂,只是我们不习惯于将其对应到另一种对象上去思考而已。
5 FPGA软件的“仿生”构造方法
从以上对比分析可以看出,FPGA是靠内部硬件资源的可重构来满足各种功能需求的,也就是说,构造完成的每一部分硬件电路都在行使着各自不同的功能。如果我们将纷繁复杂的片内硬件电路按功能块划分,将各功能相对独立、内部连线紧密、外部连线疏松的电路功能模块看做是一个有生命的群体,它们都在各自的时钟驱动下独立工作着,而它们的输入、输出信号连线则是它感受外部信息并对其做出反应的通道,其内部的信号是受前级驱动的状态信息节点,包含在其中的、由时钟驱动的各进程都做为若干“子功能体”来对待,那么整个FPGA内部便呈现为了一个小型的社会。各功能群体是分级存在的,下级从属于上级,同级功能体间通过信号或存储器互通数据信息。如此看来,FPGA软件架构便于现实生活中的组织架构建立了联系,貌似复杂的FPGA软件便灵动了起来。
基于这样的思想构造的FPGA软件框架见图2所示。
其实,这样的树型软件架构与企业的职能型人员组织结构十分相似。功能体即是一个能完成特定功能的处理器团队,父功能体内可根据处理任务的性质拥有多个子功能体,各子功能体可在所属的父功能体内与其他同级的子功能体实现自由信息交换(通过信号或存储器),跨级的信息交换必须通过其所属的父功能体进行传递。
图2 分级型FPGA软件框架
FPGA的工作方式决定了其树形软件架构的合理性。只要程序加载完成,每一个功能体便会有真真切切的片内硬件电路与之对应,它们都会在统一的时钟下并行工作着,这与多人组成的工作团队有着极其相似的共性。将人员的组织结构融入到整个软件设计过程中后,软件人员能更清晰地理解和掌握各级功能模块的划分和实现步骤,所编制的软件的结构和信号流向会更加明晰,复杂的处理过程则更容易被分解,软件更加模块化、直观化、人性化,可读性更会随之增强,软件团队各成员间的交流也会更加顺畅。最为重要、也是最有意义的是:可通过借鉴我们所熟知的组织架构及人员沟通方式轻松地构造出强直观性、高稳定性和实时性的软件架构。
6 总结
FPGA芯片的特殊结构及开发模式有着与构建一支团队去完成项目十分类似的设计过程。如果我们能经常性地将经过岁月洗礼后沉淀下来的优秀的团队构建模式及运行模式与复杂的FPGA软件研发设计对应起来,相信许多设计灵感将会油然而生。
技术研发过程本身就是一种汇聚所有的先进思想和灵感进行融合创作的过程。“仿生”则是一种获得优秀设计思路的捷径。该篇文章只是一个引子,技术人员如果善于从身边的事物中找寻灵感,将设计思维扩展到不同的维度上去思考问题,很可能会有意想不到的收获。
参考文献
[1]吴继海,蔡海宁,王诚.Altera FPGA/CPLD设计(高级篇)[M].人民邮电出版社.
何启跃(1959—),男,安徽四创电子股份有限公司高级工程师,研究方向:无线电通信。
徐谨(1970—),男,安徽四创电子股份有限公司高级工程师,研究方向:雷达数字处理系统软硬件设计。
作者简介: