李长波
(芜湖职业技术学院,安徽 芜湖 241000)
在企业的研发中,经常遇到硬件软件化和软件硬件化的问题。本文论述的是一个硬件软件化的问题,用软件仿真硬件,使用户在软件仿真的环境中完成需要硬件才可以完成的工作。对于各种专用SoC,硬件软件化的平台搭建有较高的技术含量。
图1为SoC芯片的构成框图[1],由图1可以看出,该芯片有十大模块构成,分别是主控MCU、电源、触摸屏、双时钟、UART、SPI、LCD 控制器、FLASH 驱动、I/O口和存储器。专用SoC是针对某一类特定需求而设计。图1所示的IC是为了词典机设计的框架,每一个应用模块都有对应的用途。主控SoC调度所有的模块,而且其中还包含累加器、RAM、各种寄存器等资源。存储器是线性存储器,要求容量大,存放数量庞大的词典数据。双时钟模块要实现高速运算和计时功能,开机时高速运算,关机时保留低速时钟计时;I/O口模块可以外加各种DSP,如语音,也可以设计按键。FLASH驱动用来存放可以被用户修改的数据。LCD控制器外接COG类的LCD 作为显示设备[2]。
图1 SoC的基本构成
SoC内部有4个部分要建立模型:累加器、RAM、FLASH、各类寄存器。根据所仿真的SoC的类型,抽象出它的数据模型,如SoC的位数等。图2是SoC的基本框图,从图2中可以看出,要建立的仿真模型有累加器ACC、寄存器、RAM。寄存器包括SoC各种功能寄存器,如状态寄存器、堆栈寄存器、通用寄存器、特殊寄存器等,并且要清楚每个寄存器每个位的功能。RAM也包含较多的内涵,如全局变量、局部变量、堆栈区以及特殊变量等的仿真,都需要严密的算法,来保证结果的正确。
图2 处理单元的基本构成
其它模块包括:触摸屏、双时钟、UART、SPI、LCD控制器、FLASH驱动、I/O口和存储器模块。对于每一个外设,系统都为它定义好数学模型的同时,开一个或多个线程完成对其功能的仿真。图3为触摸屏的仿真流程图,图4为FLASH的仿真流程图。从图3中可以看出,触摸屏要处理单击、双击和拖动三个事件;FLASH要处理扇区读写问题,而且在写的时候,要完成先擦出后写入的功能。其它模块与此类似,不重复叙述。
图3 触摸屏仿真流程图
图4 FLASH读写流程图
指令仿真是系统非常关键的部分,每一条指令按照它对应的时序、操作的寄存器、影响的状态位、影响的堆栈等都要准确仿真(图5)。而且对于指令仿真,不仅要建立单个指令的数据模型,还要建立整个数据指令集合的处理系统。
图5 MCS-51的取指时序
时序对单个指令非常关键,下面以总线数据写为例加以说明。从图5可以看出,每一个时间点要非常准确,系统在进行指令仿真时,必须按时钟准确计算。所以,仿真只能是高速IC仿真低速IC。
图6是SoC主控芯片左移指令的流程图,从图6中可以看出,指令操作就是数据结构的操作,所以,数据结构的定义非常关键。当前芯片的架构主要是ARM和MIPS,而指令集基本使用RISC(Reduced Instruction Set Computing)指令集,所以仿真相对规范。
图6 左移指令流程图
把SoC主芯片的指令全部用程序解释出来之后,这些子模块需要进行管理。本系统建立了一个指针队列加以管理。每个元素的信息如图7所示,其显示了指令集的管理结构。其中指令是一个指针,指向对应的指令子模块,优先级依据RISC指令集提供信息确定,脉冲数是该指令占用多少个脉冲,时间是该指令执行完所消耗的总时间。
图7 指令集管理结构
系统使用VC开发平台设计完成,在开发的过程中,大量使用宏定义,有较好的可移植性。
系统划分的模块[4]如图8所示,共分为5大模块,分别是处理器模块、存储器模块、指令模块、外设模块和人机接口模块。处理器模块完成处理器的数据定义、参数设置、程序运行等功能;存储器模块完成处理器的数据定义、参数设置、读写运算等功能;指令模块完成指令的仿真、指令集合的管理、指令的调用机制等功能;外设模块完成外设的数据定义、参数设置、功能仿真等功能;人机接口模块处理系统与用户的接口。
图8 总体模块的划分
总体设计把系统分成五部分大的模块,这些模块还要继续分割成小的模块。模块越小,任务越清晰,这是软件设计的基本步骤。这里只以处理器模块来加以说明,其它的模块省略。从图9中可以看出,处理器模块又划分出四个小模块,分别是现场模块、指令模块、时序模块和计算模块。现场模块完成SoC主芯片的累加器、寄存器、RAM等功能;指令模块完成指令的仿真设计和管理;时序模块完成SoC晶振的仿真和计算功能;计算模块完成上述三个模块的集成及综合处理的功能。这些小模块还可以继续划分,直到分成可以直接写子函数为止,并且完成流程图。
图9 处理器模块的划分
根据详细设计的流程图,程序员可以完成代码的转化。流程图代码化属于正向工程范畴,先将流程图转化成流程树,树有根节点和子节点,根节点表示整个流程,子节点可以是控制节点或代码节点。控制节点可以实现顺序、分支、循环等控制;代码节点实现函数调用、表达式或代码段,然后再对流程树进行深度优先的遍历,输出每个流程节点所表示的代码,最终得到源文件[5-6]。
程序测试是指对一个完成了全部或部分功能、模块的计算机程序在正式使用前的检测,以确保该程序能按预定的方式正确地运行。测试可以分成白盒测试、黑盒测试和灰盒测试。系统完成之后,通过测试才可以交付使用。本系统使用灰盒测试法,主要由程序设计人员自己完成逻辑覆盖测试和功能覆盖测试。
本系统完成专用SoC在PC机上的软仿真,完成了SoC的软化功能。本系统的应用在两个方面:一是产品开发,二是宣传品制作。开发一款电子产品,若软件工作量大,则软开发平台非常重要。因为软件要多人完成,软开发平台有高效率和低成本的特点,现在很多此类厂商都使用软件开发平台。另外,当前互联网的影响非常大,如果能把你的产品做成演示版放在互联网上宣传,效果非常好,仿真软件在这个方面起到很大作用。
[1]张志良.单片机原理与控制技术[M].2版.北京:机械工业出版社,2007.
[2]袁志勇.嵌入式系统原理与应用技术[M].北京:北京航空航天大学出版社,2009.
[3]徐士良.计算机软件技术基础[M].3版.北京:清华大学出版社,2010.
[4]奈霍夫.数据结构与算法分析[M].2版.北京:清华大学出版社,2006.
[5] Donald Hearn,Pauline Baker.Computer Graphics C Version[M].北京:清华大学出版社,1998.
[6]黄维通,姚瑞霞.Visual C++程序设计教程[M].北京:机械工业出版社,2001.