找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2089|回复: 0
打印 上一主题 下一主题
收起左侧

基于FPGA的嵌入式系统设计思考之一二

[复制链接]
跳转到指定楼层
楼主
ID:103513 发表于 2016-1-17 03:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
作者: phixcoco

开头要赞下lindsey[1]能将自己实践中的心得与大家分享。帖子上说彼有“2年多的应用经验”以及使用过EDK的诸多版本,着实让人仰慕。工程经验以及有体验开发套版本更新的历程是份宝贵的财富也使得积累了不少思考。我无意间看到文章,看完后我很高兴,一方面在于其中点滴的真知灼见,更重要的是其思考能引着大家进一步认识自己可能正在使用的开发平台。
我想我也可以将自己的一份愚见写出来与大家分享!我不是Xilinx EDK的行家,也不是将SoPC应用与嵌入式开发的行家,我与此些产品的机缘开始于06年的IBM PowerPC应用大赛。我们组队参加了,而IBM提供ML403开发板作为决赛的实现平台。12月中旬比赛结束之后我将图书馆里大致所有关于“FPGA、SoC、嵌入式”的书浏览了一遍,算是对自己一个时期内的实践的理论总结!
我想下面的写作方式不用叙事,而用分点阐述以让大家尽快找到我意见的要点而不至于在细枝末节上迷失了论述的重点!

“上帝说,先认识这些词儿吧,否则你将不知所云”!
首先阐述以理清几个概念:SoC”,“SoPC”,“基于FPGA的嵌入式系统”
SoC(System-on-Chip),知道了字面就应该可以明白它的意思。SoC两个重要的概念是IP Reuse(IP重用)和Software/Hardware co-design(软硬件协同设计)。IP重用和软件中的重用关系密切,而协同设计的目的之一是缩短TTM(Time-to-Market)。其硬件实现是通常意义的CHIP。基于Standard Cell(标准单元库),有通常意义的数字后端将前端设计转化为Layout的形式提交Foundary制造,请允许我将这用实现成为ASIC实现吧。
SoPC(System-on-Programmable-Chip)的概念容易理解,与通常意义的SoC的最大不同来自实现目标平台的不同,FPGA是其主要依赖的目标平台。无论是传统芯片中嵌入一个FPGA模块还是FPGA来实现SoC,总之我们可以利用FPGA的优势为系统设计服务。就像基于ASIC和基于FPGA的纯硬件设计流程大致只有后端不同而前端设计流程一致;SoPC和传统意义的SoC都套用SoC的设计方法学以及使用类似的SoC设计流程,区别之一也在于SoPC以FPGA作为实现目标从而少去了诸多后端设计的工作和制造的时间。
基于FPGA的嵌入式系统,这个概念多少像个拼盘。首先嵌入式概念的要点之一既有软件也有硬件同时目标为特定的应用领域。嵌入式系统(Embedded System)也是System,它的硬件部分可以选择用一系列专用芯片搭建板级系统,也可以用几块SoC芯片和少许外围元件搭建,而承载SoC的可以是ASIC实现也可以是FPGA。

“没有后端组?选择FPGA实现吧。批量生产?可以尝试结构化ASIC。完全的单片系统解决方案?SoC吧。没法做进一个die?层叠封装……朋友,具体问题要具体分析的!”
即便是ASIC实现的SoC,通常也会有使用FPGA做 Prototype的阶段。然而实现平台的不同决定了FPGA在其中的作用是不尽相同的,下面的阐述将针对将FPGA作为嵌入式系统实现平台的情况。

1、基于FPGA的嵌入式系统设计的限制
lindsey在“1、SOPC能设计什么样的嵌入式系统”一段中提到了硬件系统设计中的两个主要限制是:片上存储资源和有限的接口IP。下面主要分接口、存储和处理三个部分阐述FPGA用于嵌入式系统搭建的限制。
首先是接口,“pin limitation”是不得不面对的一个问题,这也是为什么我们将一些components集成到chip的内部将pin与pin的连接转换为片内的连接,从而减轻芯片引脚限制带来的系统设计压力。这在存储系统设计的时候会充分感受到,多块片外的存储器(甚至是多种)会消耗大量的FPGA引脚。同时片外和片内互连必然收到pad的物理和电气限制,从而限制了延时和速度。如果需要,可以看看Xilinx的RocketIO。然后是接口IP,当我读到lindsey网友的文章的文字是又喜又悲,一方面IP的概念为人们熟知,另一方面是大家太习惯“免费的午餐”了。常用的接口IP都属于General IP的范畴,在ASIC实现的SoC时,我们通常向Synopsys(全球第一的General IP提供商)以及Mentor等公司付费使用这些IP。免费的IP通常可以移植OpenCores等来源的IP。一些常用的接口IP,因为其差异性和经济性不高所以公司会选择免费提供给用户而没有必要收取费用。而对于大多数的IP都是要收费使用的。接口IP不应该成为嵌入式系统设计中的限制点。
接着是存储系统,存储系统是系统设计者常常要仔细设计的部分。我想为FPGA不能集成大容量存储资源做一下辩解:一是FPGA本身优势在于computing-intensive的设计;二是现有的FPGA主要是基于SRAM,集成适量的SRAM存储单元很容易理解;三是存储器是一个相对独立的市场,其制程(无论是DRAM还是FLASH,更不用说EEPROM等)和FPGA本生不一致;四是存储单元消耗的功耗比例越来越大……事实是FPGA上的存储单元容量十分有限,使得基于FPGA的嵌入式系统设计时不得不使用片外存储单元,这使得存储系统的延迟和带宽以及FPGA的引脚限制都成为系统设计者需要面对的设计问题。
最后到处理,片上系统的主体是处理。在绝大多数的应用领域中基于总线的构架占了绝对的统治地位。两个不容忽视的部分是处理器和总线。撇开Xilinx和Altera泛而谈之,处理器内核并非越快越好,总线也不是唯AMBA独尊。我喜欢Hennessy的“Computer Architecture: A Quantitative Approach”以及“Computer Organization & Design: The Hardware/Software Interface”两本书,因为学会了软硬件两方面思考系统以及量化的研究方法。8051 compatible的处理器软核不可小觑,我们看到漫天32位处理器内核的同时,也该知道ARM的16位Trumb指令集的设计目的。同样还有可能的DSP软/硬核。同样在总线方面,你可能需要Wishbone的轻巧,你可能需要AHB/APB明显的划分来构架系统,抑或你可能需要CoreConnect的读写、配置和数据传输等并行带来的强大性能。顺便提一点:片上总线和传统的板级总线是有差异的,使得将传统的板级总线(PCI)实现在片内是没有多大意义的。FPGA提供了足够的自由度,使得我们可以自由的选择处理器软核和使用的片上总线选择来自量化的分析。但当FPGA用于实现嵌入式系统时,特别是利用Xilinx抑或Altera提供的开发工具进行基于FPGA的嵌入式系统设计时,限制又多了一层,那就是软件的限制!如果你不是使用PPC处理器核,那么你可以选择没有内嵌PPC硬核的Xilinx的FPGA型号,或者内嵌了而不使用它。问题在于系统集成时你无法使用Xilinx EDK提供的软件平台来轻便地集成系统。反过来的思考是,这样你也可以不会陷于选择,而将精力着力与利用提供的内核和总线类型基础上最优化你的设计,并充分享受开发工具提供的在系统集成上的便利!

2、基于FPGA的嵌入式系统设计需要做什么
既然是一个既有软件又有硬件的系统,那么缺少不了软件和硬件两个部门的工程师。传统的嵌入式系统设计中,硬件设计师主要工作在搭建板级系统(抑或还得加上调底层驱动的活儿),而软件工程师向上开发应用。基于FPGA的嵌入式系统设计中,硬件工程师似乎不得不又分成两波,一拨开发片上系统的硬件(由于软硬件接口主要在FPGA上,所以编写底层驱动的事似乎得由他们干了),一拨开发板级硬件。我这里要说一下我在图书馆里看的几本书的印象,那就是无一例外的它们都变成了介绍多个工具的杂集,甚是还包括HDL语言本身,更要命的在于介绍的重点集中在了单个IP设计,于是一本关于SoPC抑或基于FPGA的嵌入式系统设计的书变成了介绍FPGA上设计硬件逻辑的书籍。我想作者们以及许多工程师们似乎没有抓住基于FPGA的嵌入式系统设计的要点:
首先是硬件平台的快速搭建。你是否有体会到如Xilinx EDK的一个亮点就在于硬件平台的快速搭建。在IP都已经available的情况下,利用EDK,我们可以快速地构架起我们的片上硬件系统。以Xilinx的EDK为例,EDK自带的IP已经有不少,且不要小视Xilinx公司可以提供的IP的资源,当然不少都是需要付费的。同时FPGA作为一个灵活的平台,使得我们可以开发自己所需的专用IP来在硬件层面上提高产品的差异性和性能,作为公司可以建立IP库,从而在不同的嵌入式系统搭建时能够方便地在EDK中复用。RTL级的源码保证了很大的实现可移植性。再者就是IP接口生成(也就是Import & Create Peripheral Wizard)极大地简化了总线接口的设计,从而使得基于总线的系统集成是那么地简便!但另一方面我们又不得不看到,在项目需要设计专用的IP,特别是IP比较复杂时,系统设计的周期会被明显拉长。一个原因在于基于FPGA的嵌入式系统设计并没有很好地推广软硬件协同设计的观点。在传统的基于ASIC实现的SoC设计中,我们会根据Specification用高层语言模拟系统(行为模拟,功能精确或者周期精确),模拟软硬件接口,使得硬件在逐步实现的同时,软件能够基于模拟的硬件进行设计和调试,从而软硬件设计的周期能够overlap。而基于FPGA的嵌入式系统设计中,EDK提供了处理器的指令集仿真器(由于不是系统的模拟器,所以缺少调试外围IP的便利性)、提供了在软件上程序和硬件描述语言描述的硬件协同仿真的条件,但是软件设计的前提是硬件系统集成的完成(这点上我并不是很确定!)。总而言之,在构建片上硬件系统的IP模块均具备的情况下,硬件系统能够很快地集成验证并进入软件开发流程,EDK给予了硬件系统集成的便利性。
其次是软件设计体现应用差异性。传统的嵌入式系统由于硬件设计的局限性,使得嵌入式系统的硬件平台差异不大(正如lindsey在“2、SOPC的设计师在设计什么”开头写道的那样),开发集中在软件。然而FPGA的硬件载体使得硬件上也能做不少差异设计,并且基于基于FPGA的设计容易实现功能以及保证时序收敛!但是不应该因此在基于FPGA的嵌入式系统设计中忽视了软件的重要性。软件层面的灵活性仍然是硬件本身无法比拟的,从而使得软件在应用的创新和产品的差异化上扮演了重要的角色,这是我在经历PPC应用大赛后的感受。同时从系统性能设计的考量,正如Hennesey书中体现的思想,硬件构架以及软硬件接口的设计固然重要,系统软件同样很大程度影响着系统的整体性能并可能成为系统性能的瓶颈。而系统软件就是指OS以及软硬件直接交互的使者――驱动。以Xilinx的EDK为例,我个人觉得Xilinx EDK中的驱动分层设计以及驱动的构架很好,传统的层次化的设计思想得到了优美的实践。
那么工程师要做什么呢?不是有这么多的工作可以让你发挥你的想象力吗!

3、“工欲善其事,必先利其器”
硬件工程师在实现强大的计算平台为软件设计提供强有力的支持的同时,硬件设计本身也得益于软件的发展。
首先需要感谢下“Free Software Foundation”和“Open Source Initiatives”(或许Richard Stallman并不喜欢别人感谢这个)。起码林林总总的开源软件让我们的软件开发更加高效。gcc,据称是地球上凡存在过的CPU构架它都支持。或许有点夸张,但是倘若我设计了一套指令集,而需要一个编译器/交叉编译器的话,我会首先想到移植gcc。gcc,gdb/ddd等工具对于软件开发,特别是系统软件开发的工程师来说应当是熟悉的。即便是硬件设计与仿真领域,VCS、Modelsim的工具套件中你是否忽视了gcc的存在呢?
传统的嵌入式开发系统中主要的编程工作在软件,主要的编程对象是CPU/DSP,而它们的指令集是开放的,使得在专用的集成开发环境外,eclipse等软件由于其开放的构架也逐步受到嵌入式软件开发者的喜爱。基于FPGA的嵌入式系统类似的可以采用eclipse作为软件开发集成环境,但其编程性还有FPGA,由于FPGA诸多的不透明性(诸如bit文件格式等等),使得我们可以确信不同的FPGA供应商必然是针对自己的FPGA提供自由的集成开发环境。Xilinx有XPS,而Altera有SoPC Builder开发工具。
对于硬件部分的开发,它和传统的基于FPGA的硬件开发流程相同,因此完全可以借用已经相对成熟的设计工具和流程。事实上,Xilinx和Altera在自家的基于FPGA的嵌入式开发套件中整合了传统的基于FPGA的硬件开发的工具和流程。利用已有的基于FPGA的硬件开发工具链,我们已经可以做系统的整合(包括硬件系统的整合以及软硬件的整合)。然而从嵌入式的需求出发,我们需要一个简化的硬件整合的工具,我们也需要一个简便的软硬件整合的工具。在Xilinx的EDK中,Xilinx Platform Studio(XPS)就是这样的一个集成开发环境。我们希望它能进行有效的IP管理和基于总线的系统集成!
说IP管理,在传统SoC领域中人们也在制定标准化的IP管理,以便于IP的共享和复用,或许是XML抑或是别的。无论软件还是硬件设计人员,你对于配置文件应该不至于陌生。Xilinx的EDK采用的是基于配置的管理。而且不仅仅是管理IP本身。诸多的配置文件可得理清相互的依赖关系,就和开源软件的包依赖关系类似。这造成的一个问题就是如果手工修改配置文件有可能造成系统配置混乱,而使得集成开发工具无法顺畅的解决对应关系造成工程的崩溃。对于基于FPGA的嵌入式开发软件而言,它管理的IP都是带总线接口的IP。而我们设计IP通常分kernel和bus interface两个部分。Import & Create Peripheral Wizard之所以是我喜爱的功能,是因为实践中节省了大量为自己设计的IP设计和验证总线接口的时间,而且总线操作时序比较有保证!在Xilinx的EDK中,它用MPD(Microprocessor Peripheral Definition)和PAO(Peripheral Analyzer Order)等配置文件来标示IP。当IP集成为一个硬件系统时,它用MHS(Microprocessor Hardware Specification)配置文件来标示硬件的连接等属性。相应的工具能够在这些配置文件的指引下来集成硬件系统。软件部分的驱动、编程库等都有一套配置文件。
这些配置文件的作用常常可以被隐藏在GUI界面和按钮之下。然而当进行系统查错,特别当使用自己设计的嵌入式开发板时,你就有必要完全了解Xilinx EDK的各种配置文件的用途,正确地配置软硬件系统以充分发挥XPS下各种工具进行系统集成的能力!
最后补充说明一点,关于综合和布局布线的速度,综合和布局布线算法本身的复杂度加之日益增长的FPGA芯片的规模,我想只能说短时间不会有太多的改观的。如果你经历过在服务器上昼夜跑regression和十数小时综合的经历的话,你或许就不会对XPS工程编译花上半个小时而惊异了!
总之透过一个开发工具,我们或许可以学到一些诸如工程管理的学问。当然我们都期望开发工具能够越来越高效和易用!
感谢你读完我敲下的以上文字,如有谬误,敬请指出!


评分

参与人数 1黑币 +35 收起 理由
暗光 + 35 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表