跟着微电子技能和超大规模集成电路技能的高速开展,进行电子体系规划时的体系杂乱度不断加大,体系软件硬件的异构度进步,软件在体系中所占的份额也越来越大。传统的规划办法在进行电子体系规划时,一般先由体系工程师规划整个体系的架构,画出体系框图(包含各个模块),再用高档编程言语(一般是C/C++/JAVA)完结各个模块的算法,然后进行整个体系的仿真,确认体系的最佳结构、最佳完结算法及其它相关参数。待体系模型确认今后,进行体系软硬件切割规划,但因为缺少共同的软硬件协同规划验证渠道,大多只能依据经历来界说软件和硬件部分各自应完结的功用。关于整个体系的功用和行为,在规划开始阶段,描绘时尚无硬件的概念,经过软硬件区别之后,将体系规范描绘分红软件完结和硬件实
现两部分。尽管VHDL等言语也支撑算法级描绘,可是大部分硬件描绘言语HDL(HardwareDescripTIonLanguage)如VHDL、Verilog等基本上仍是面向硬件的描绘,面向较低的硬件笼统等级。一起因为高档编程言语(C/C++/JAVA)不能描绘硬件规划中的时刻、推迟、信号等物理信息,与后续的硬件规划不兼容,硬件部分需从头用VHDL、Verilog等硬件描绘言语来规划,形成许多的规划重复,也增加了体系规划的杂乱度。
别的,许多要用硬件完结的功用,例如快速傅立叶改换FFT、扫描线算法、消隐算法等老练而又常用的算法都有现成、完善的C言语描绘,假如能够复用这些资源将节约许多的体系规划时刻。
许多EDA东西只能了解HDL言语的描绘,它是规划者和体系之间的界面,规划者经过HDL言语将自己的规划计划告知EDA东西,在EDA东西的协助下进行模仿、归纳和验证。所以体系规划顶用C言语的描绘要转化为HDL言语才干被EDA东西承受。在许多HDL言语中,VHDL言语是被广泛运用的,因而规划和完结一个从C言语转化到VHDL言语的编译器具有重要意义和很大的实用价值。
C与VHDL的言语特征
C言语是现在国际上广泛盛行的一种核算机高档言语,合适于作为体系描绘言语,既可用来编写体系软件,也可用来编写使用软件。C言语是在B言语的基础上开展起来的,既坚持了B言语的长处(精练,挨近硬件),又克服了其缺陷(过于简略,数据无类型等)。后来,C言语屡次作了改善。1978年后,C言语已先后移植到大、中、小、微型机上,并独立于UNIX和PDP。
1983年,美国国家规范化协会(ANSI)对C言语的各种版别进行归纳和扩大,拟定了新的规范,称为ANSIC。总的说来,C言语合适描绘进程和算法,它的运转环境是图灵机模型。它具有许多灵敏的描绘方法,具有较高的笼统才能,不区别函数和进程。数组的界说以及对指针的灵敏使用大大方便了程序的书写,一起因其是为开发软件而规划的言语,因而更长于描绘串行程序。可是因为其不能表现硬件规划中的时刻、推迟、信号等物理特性,硬件模块部分需从头用硬件描绘言语来规划,与后续规划缺少连贯性,也增加了体系规划的杂乱度。
VHDL(Very-High-SpeedIntegratedCircuitHardwareDe2scripTIonLanguage)言语是现在使用较广泛的一种硬件描绘言语,被IEEE(TheInsTItuteofElectricalandElectricEngineers)和美国国防部确认为规范硬件描绘言语,并得到了许多EDA公司的支撑,在电子工程范畴已成为事实上的通用硬件描绘言语。VHDL既能够结构化的分层次的描绘电路结构特性,也能够表明电路输入输出信号的联系特性,还能够描绘和芯片布图有关的几许特性。它是一种较规整的言语,合适于描绘并发程序。可是因为其开始意图并非是为电路规划的,而是用来描绘电路的,因而它不合适进行体系级的软件规划和算法规划,特别是现在体系中越来越多的功用由软件来完结时。
规划计划
C言语和VHDL言语是两种面向不同范畴,各有所长的言语,规划与完结一个C到VHDL的编译器便是把要用硬件来完结的C言语算法描绘翻译成VHDL言语的行为描绘。为了完结从C言语向VHDL的编译转化,首先用Lex和Yacc完结词法剖析和语法剖析。在语法剖析的时分生成一棵C的语法树,,并在自下而上生成语法树的进程中搜集归纳特点。一起在此进程中进行语义剖析———只剖析和翻译与编译转化有关的信息,那些与C言语自身有关的语义则不做剖析,比方是否有变量被重复界说等。在语法树的打开进程中向下传递承继特点并进行转化,将C的规约规矩翻译为相应的VHDL规约规矩。
图1C到VHDL的编译器完结进程
编译器的详细规划与完结进程见图1。在语法剖析的进程中生成一棵语法树———多叉树,其叶子节点记载C程序中的单词,并记载单词的方位、特点、值等,非叶子节点记载C言语的规约规矩以及要传递的特点———包含归纳特点和承继特点。
因为C言语较灵敏而VHDL言语较规整,因而这儿只挑选必定范围内的较常用的C言语语法子集进行转化;因为VHDL只要可归纳子集能够完结,所以在转化时有必要考虑可归纳子集的约束;并且VHDL言语的数据类型有限,咱们有必要编写扩大数据类型的VHDL程序包,在打开语法树完结转化进程顶用来描绘杂乱的逻辑。
转化进程
因为C言语长于描绘串行程序而VHDL合适描绘并发程序,因而关于C程序中的非main函数转化为VHDL中的函数(有返回值的)和进程(无返回值的);关于main函数,将main函数的参数作为enTIty的输入信号,将main的返回值作为entity
的输出信号,将main的函数体作为architecture的一个process。尽管VHDL一般描绘并发程序,但其子程序和process仍是次序履行的,与C言语的原始描绘共同。详细函数对应状况见表1。
转化进程中,经过剖析两种言语的不同,关于C言语的一些共同、灵敏的描绘方法———指针、类型转化、连等、i++和++i的处理、数组、逗号表达式等方面的正确翻译比较要害和重要。
关于C言语中的指针,要将它在C言语中的效果彻底翻译到VHDL比较困难,因为C言语的指针实质上是与地址、与内存的分配有关。而VHDL作为一种描绘硬件的言语,不存在地址的概念。因而在详细转化中将指针类型翻译为整数类型,并记载所指向数组的姓名,整数值表明指向数组中的第几个元素。因为C的高维指针经过内存分配所得到,在VHDL中很难完结,因而开始完结一维指针,而带高维指针的C程序能够转化为一维指针来完结。
关于i++和++i,翻译i++时先记载哪些变量要经过这类操作,在完结对表达式的翻译后再处理。而翻译++i时因为变量值马上改变,因而在翻译时有必要将一个完好的表达式分隔,并引进暂时变量来处理。
相关于C言语中灵敏的类型转化,VHDL则严厉的多,不允许不同类型之间运算。因为C言语没有boolean类型,而VHDL言语有boolean类型,所以在条件表达式中要将整数或其它类型的数转化为boolean类型。一起,在处理C中整数的逻辑运算时,有必要先将整数转化为VHDL的Bit-Vector来运算,核算后再转化回来。
别的,因为C言语不区别函数和进程,可是VHDL严厉区别,并且函数只能出现在表达式中,因而关于没有出现在表达式中的函数调用,翻译时要将其放在一个暂时表达式中,赋值给一个暂时变量。
测验及剖析
为了测验本文提出的规划计划的正确性和有用性,在规划进程中选取了一些常用的数字电路体系来比较C源程序和VHDL方针程序的功用共同性。例如关于一个无操控端口的加法器电路,其电路示意图见图2
该加法器不带任何操控端口,有两个输入端口in1和in2,一个输出端口pout,它们的类型皆为位向量。当输入信号中有任何一个或许两个都发生改变时,进程就要再从头履行一遍。从电路功用的视点来了解:只要在输入端有新的数据输入,那么加法器必定要从头开始作业,将新的数值相加并送到输出端口,这样不断地进行加法操作。关于加法器电路的C言语描绘如下
使用本文提出的规划计划对完结加法器功用的C 言语程序进行编译转化, 得到转化后的方针程序———VHDL 程序如下:
经过剖析编译转化后的方针程序的语法语义和功用证明转化计划是正确和有用的。因为用C 言语进行算法和程序规划,能够大大进步体系描绘的层次和体系规划功率,并且有许多老练、完善的用C 描绘的算法能够复用,而VHDL 言语则是大多数EDA 东西所承受的硬件描绘言语,因而规划与完结一个从C 言语转化到VHDL 言语的编译器具有重要意义和很大的实用价值。
本文剖析了C 与VHDL 的言语特征及各自的优缺陷,提出了合理有用的转化计划,指出从C 向VHDL 转化时需要点留意的几个方面,并对规划计划进行了测验剖析,得到较满足的成果。