王 爽,吴全兴
(1.中国电子科技集团公司第四十七研究所,沈阳 110032;2.沈阳新元信息与测控技术有限公司,沈阳 110179)
SOPC是一种新的系统设计技术,也是一种新的软硬件综合设计技术。通过它,可以很快地将硬件系统(包括微处理器,存储器,外设以及用户逻辑电路等)和软件设计都放在一个可编程的芯片中,以达到系统的IC设计。这种设计方式,具有开发周期短以及系统可修改等优点。设计完成的SOPC可以转为ASIC芯片,从而可以实现快速量产。一旦定义了处理器之后,设计者就“具备”了体系结构,可以马上开始设计软件原型。CPU周边的专用硬件逻辑可以慢慢地集成进去,在每个阶段软件都能够进行测试,解决遇到的问题。另外,软件组可以对结构方面提出一些建议,改善代码效率和处理器性能,这些软件、硬件权衡可以在硬件设计过程中间完成。
在采用NiosII处理器设计SOPC嵌入式系统时,通常会按照以下的步骤:
(1)分析系统需求说明,包括功能需求和性能约束等。
(2)根据分析结果,选择片外外设和片内IP(知识产权核)。除此以外,还要对选择的IP和外设进行初步性能评估,以保证能够满足系统需求。
(3)确定IP和系统参数。
(4)确定系统互联逻辑,分配FPGA的引脚等。
(5)结合Nios提供的软件开发包进行软件开发。
其中硬件系统设计内容可以分成两大部份:
(1)用SOPC Builder创建Nios系统模块并存入块设计文件(.bdf)。
(2)用QuartusⅡ编程器和ByteBlasterⅡ电缆配置Nios开发板上的FPGA。
SOPC Builder可看作是一个以IP模块为输入,集成系统为输出的工具。SOPC Builder图形用户界面启动时,会自动搜索已安装的 IP模块。SOPC Builder 主窗口中的左侧模块池内显示了所有发现的IP模块列表。SOPC Builder通过在一个搜索路径中的所有目录下搜索名为class.ptf的文件来获得IP模块列表。SOPC Builder让IP制作者制定有关IP应该如何连接的细节,这样能够减轻用户为每个设计项目重新再设计(或总线结构)的工作量。而且,通过追踪整个系统的配方,就能够使用SOPC Builder透明地调整相应的系统软件以反映硬件配置的变化。SOPC Builder设计过程有三个主要步骤,如图1所示。
图1 SOPC Builder设计过程
SOPC Builder的IP模块是由IP开发人员提供的硬件(RTL、原理图或EDIF)和软件(C源代码、头文件等)。IP开发者经常会希望拿一个现成的具有微处理器总线接口的逻辑模块,然后转换成SOPC Builder的IP模块。这需要如下三个主要步骤:
(1)建立一个名为 class.ptf的简单文本文件(通常这个过程可以简化,比如通过复制一个类似IP模块的 class.ptf文件,然后修改其中的某些参数)。
(2)实现IP模块的所有文件(HDL文件、软件支持文件(.c 和.h),等等),连同 class.ptf文件,放置在同一个目录下。
(3)将上述的目录及文件复制到SOPC Builder的搜索路径下,设定目录名与该IP模块的正式名称相同。
SOPC Builder内包括和安装了一些IP模块,其他一些IP模块可以从Altera或第三方IP提供商处获得、安装。
用户创建和编辑一个新的系统时,一般要从库中选择一些IP模块,逐个地配置这些IP模块,以及设置整个系统的配置(如,指定地址映射和主/从端口连接等)。在这个过程中,用户的设置都会保存在系统PTF文件中,一般不会有其他文件的产生或修改。
用户可以在模块池内双击IP模块名、按下Add按钮或从系统菜单中选择Add Module来添加一个IP模块。每添加一个IP模块,一个新的模块行会出现在模块表格内,并有一个临时的模块名。在添加阶段的开始,SOPC Builder会在系统PTF文件中建立一个新的MODULE节,并将class.ptf文件MODULE_DEFAULTS节中的所有内容复制到这个新的MODULE节中。因此,IP模块即使没有Add_Program程序,也可以通过MODULE_DEFAULTS节提供添加阶段所需的部分或全部信息。例如一个IP模块的数据宽度总是16位,则不需要编写Add_Program程序,用来在系统PTF文件中设置数据宽度。直接设置class.ptf文件MODULE_DEFAULTS节中的参数更容易些。此后,SOPC Builder会运行IP模块声明的Add_Program程序,并通知Add_Program程序如何找到新建立的MODULE节。SOPC Builder以命令行参数的方式把这个信息传递给Add_Program程序。Add_Program程序可以修改新MODULE节内的任何节或参数,比如WIZARD_SCRIPT_AR GUMENTS和SYSTEM_BUILDER_INFO部分,也可能还有其他部分。
大部分SOPC Builder的IP模块都提供一个编辑工具,用来在模块添加到系统之后重新改变它的参数。用户双击代表系统中某一模块的那一行,就可以对其编辑了。但如果模块class.ptf文件中只有一个空的Edit_Program程序参数,则什么也不会发生。Edit_Program程序也可以通过命令行方式调用,命令行参数与Add_Program程序相同,以便它能找到相应的系统PTF文件和新建立的MODULE节。通常,Edit_Program程序和Add_Program程序提供了相同的图形用户界面来配置模块,它们往往就是同一个程序。
至少一个IP模块添加到系统中后,用户就可以通过SOPC Builder图形用户界面来配置系统了。地址映射表,主/从端口连接,甚至 System Generation标签页的选项等等,都会影响系统的布局布线。
绑定阶段用来提供Add/Edit_Program程序之外的参数设定。绑定阶段在系统配置阶段之后,所以可以重新设定与整个系统模块相关的选项。除非用户返回到前面的阶段,否则模块和它们的互连关系不会改变。绑定阶段所做的选择可能包括:从列表中选择特定类型的模块;选择中断映射;还有一些其他的操作,等等。这些操作最好不要通过模块的向导来执行,因为用户添加不同模块的顺序可能是不确定的。
当用户完成了SOPC Builder中的设计活动之后,最后按下Generate按钮,或从命令行执行系统生成程序时,系统生成就开始了。系统生成的结果是一系列设计文件,如HDL文件,SDK(software-support)目录和模拟工程文件等等。
SOPC Builder生成Nios CPU的同时,会生成一个SDK目录。SOPC Builder为每一个CPU生成SDK目录之后,SOPC Builder接下来会逐个地为系统列表中的每一个模块执行相应的生成程序。SOPC Builder的IP模块会在class.ptf文件中指定自己的生成程序,如果class.ptf文件中Generator_Program参数值为空值(“”),则SOPC Builder包含的缺省生成程序会执行。缺省生成程序执行一些为创建一个新模块所需的简单合理的操作,使得模块在系统中可以看得到。这些操作在模块class.ptf文件的DEFAULT_GENERATOR节中被参数化。如果某一个IP模块显式地指定Generator_Program参数值为none,则在它的模块生成阶段什么也不会发生(这不影响其他模块的生成)。
模块的生成程序可能会非常简单(如缺省生成程序,仅仅拷贝一些文件),也可能非常复杂。许多SOPC Builder的IP模块的HDL代码实现直接由生成程序来产生,而不是简单从库里拷贝。每一个模块的生成程序以命令行执行时,带有一系列的参数,用来指定系统名称和生成的MODULE节的名称。
class.ptf文件中有一个特殊的部分名为 DEFAULT_GENERATOR,用来给缺省生成程序设置相应的参数。这个部分仅对缺省生成程序有用。如果Generator_Program参数没有指定缺省生成程序,很显然,这一部分的内容就被忽略掉了。缺省生成程序产生HDL和完成系统综合和布局布线的准备工作等,缺省生成程序主要完成以下三个操作:模块重新命名并封装;拷贝实现文件到工程目录;整理用于综合的某些文件。
SOPC Builder为系统生成所有实现总线互连逻辑的HDL代码(VHDL或Verilog)。一个完整的系统PTF文件包含有足够的信息,为每一个系统主设备和从设备生成地址解码器、数据选择器、共享从端口的仲裁器、中断逻辑和总线时序逻辑等。
SOPC Builder把系统顶层模块的定义写入系统HDL文件中。顶层模块的定义包括:系统所有I/O端口的声明、系统中每个模块的实例、包含总线逻辑的仲裁模块的实例、以及各个模块间的互连逻辑。SOPC Builder还在系统HDL文件中定义了一个测试模块(一般命名为test_bench)。测试模块包含一个系统模块的实例(命名为DUT),还有系统时钟和复位输入的激励源。SOPC Builder还产生一个原理图文件(.bsf),使得系统模块可以在Quartus的图形编辑方式下使用。
除了在前面阶段生成的硬件(HDL)文件和软件(SDK)文件,SOPC Builder还会生成一些文件和目录以支持第三方的工具。
SOPC Builder为快速模拟系统,会生成一个ModelSim工程目录:<system_name>_sim/,并在该目录下生成功能仿真需要的所有文件。
在工程文件生成阶段,SOPC Builder生成一个<system_name>_generation_script文件。这是一个shell脚本,可以从命令行执行,也可以从其他脚本或程序中执行。这个脚本可以在不进入图形用户界面的情况下,重新生成系统。
SOPC Builder仅仅生成系统模块的HDL描述。如果要综合和编译系统,则需要使用Quartus II软件工具。有时IP开发者仅提供综合好的硬件描述,在这种情况下,需要对该IP封装以避免Quartus对其再次综合。IP开发者可以使用缺省生成程序,并通过设置DEFAULT_GENERATOR/black_box参数来实现封装。设置了black_box参数之后,缺省生成程序会自动生成一个封装文件,以黑盒的方式封装这个IP。
SOPC Builder根据用户选择的IP生成相应的HDL描述文件(系统模块文件),这些文件与用户逻辑区域内的设计描述文件一起由Quartus软件综合,然后下载到FPGA内,这样就构成了系统的硬件基础。
[1]Steve Furber,著.ARM SoC 体系结构[M].田泽,于敦山,盛世敏,译.北京:北京航空航天大学出版社,2002.
[2]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.