将C算法转换为Verilog HDL实现的一种改进方法

2014-04-21 09:05贺敬凯
深圳信息职业技术学院学报 2014年3期
关键词:工作频率C语言语句

贺敬凯

(深圳信息职业技术学院 电子与通信学院,广东 深圳 518172)

将C算法转换为Verilog HDL实现的一种改进方法

贺敬凯

(深圳信息职业技术学院 电子与通信学院,广东 深圳 518172)

本文在分析软件算法和硬件实现的不同特点的基础上,结合C语言算法和HDL硬件实现的特点,提出了将C算法转换为HDL实现的一种改进方法。通过求最大公因数的例子,说明了改进前后的方法在资源利用和最大工作频率方面的差距并不是很明显,但改进后的方法比改进前的方法简洁实用,易于理解和操作。本文提出的改进方法优势明显,具有更广泛的应用前景,对于一般C语言算法的硬件实现具有适用性和指导意义。

C算法; HDL硬件实现;循环结构;选择结构;顺序结构

文献[1]中提出了一种从C语言算法转换成Verilog HDL实现的方法,这种方法首先将C语言算法转换成状态图,然后再使用HDL实现。这种方法虽然具有通用性,但是得到状态图以及状态图的化简,都对技术人员有较高的要求。本文尝试在原有的思路的基础上,提出一种改进方法,尝试直接由C语言得出HDL实现。

1 改进方法的提出

目前C语言是实现算法的最流行最常用的高级语言之一,并且任何C语言算法均可采用三种基本结构实现,即顺序、循环和分支这三种基本结构。因此,我们仍然假定需要使用硬件实现的C语言算法仅含有这三种结构。对于这三种结构来说,顺序结构、分支结构(case语句、if语句)、循环结构(for语句)均是可综合的,唯一需要关注的就是循环结构中的while语句,该语句在C语言中非常实用,应用非常广泛,因此,如果我们找到了适合while语句的转换方法,则整个C语言算法就可以很容易地转换成HDL实现,而文献[2]则提出了对于while语句的处理方法。

在C语言中,循环语句包括限定循环次数的语句(for语句)和不限定循环次数的语句(while语句),相应的,在HDL语言中也有不停循环执行的语句,即always语句,因此C语言中的循环语句可以考虑使用always语句配合选择语句(if…else…)来实现。对于顺序语句和选择语句,HDL语言与C语言非常相似,在HDL语言中可以直接使用always语句或assign语句实现。结合C语言和HDL语言的上述特点,本人提出C语言算法到HDL实现的一种转换方法,如图1所示。

图1 C语言到HDL实现的一种转换结构Fig.1 Transform structure for C language algorithm to HDL hardware

图1中,将C语言中的语句替换成了always模块。关于图1的进一步说明:

(1)该转换结构要求C语言中循环语句的上一条语句和下一条语句均不是循环语句。事实上,如果C语言中的上一条语句含有循环结构,那么仍然可以在上一句中使用图1所示的转换结构进行迭代替换。因此,图1这种转换结构适用于任何C语言算法。

(2)在C语言中变量的值不断在变化,转化成HDL硬件实现时,这些变量均对应到always语句块中的寄存器变量。

(3)在C语言中,只要条件cond成立,就会执行循环体;而always模块则是在系统时钟的上升沿/下降沿不停地执行,因此always模块内需要为循环语句增加一个终止条件,该终止条件就是原循环语句的cond条件。always语句中,在满足条件的情况下,才去执行循环体,否则跳过不执行,这一功能是通过if语句来实现的。

(4)因为C语言是一种顺序执行的语句,因此为了使C语句的这种执行顺序能在一个always语句块内按顺序正确执行,此时可能需要适当增加一些控制变量,或者定义一个状态机来实现状态转换,每个状态对应一个C语言中的语句,进而保证语句的执行顺序。

(5)图1中仅列出了3条语句的组合情况,事实上,这种组合情况可以推广到任何C语言算法。图1中的上一条语句/下一条语句可以是单独的一条顺序语句、选择语句、循环语句,也可以是3条语句的任何组合。

(6)在C语言中,执行一次循环体所用的时间,与处理器的系统时钟、机器指令周期以及处理器当前执行的任务是相关的,具体执行时间不易控制。而在HDL语言中,always模块则是在每次时钟的上升沿执行,因此执行一次循环体的时间是已知的,是可控的。

可以看出,使用图1这种替换结构,C语言就很容易地变成了HDL硬件实现;同时C算法在变成硬件的过程中,其性能变得可控。

2 改进方法在求解 GCD中的应用及其性能分析

文献[1]中求解GCD的C语言算法如例1所示。

【例1】求最大公约数的C语言软件算法

例1中由4条语句组合而成,循环语句(while (!go_i);)、选择语句(if…else…)、循环语句(while(y != 0) …)、顺序语句(d_o = x;)。例1中使用一个go_i信号来启动程序,转换成硬件后,信号go_i应为一个单脉冲信号以启动求解运算。在C语言中,变量x、y、r、d_o的值不断在变化,对应到HDL硬件中,这些变量均应对应到always语句块中的寄存器变量。使用图1将C语言算法转换成HDL实现,实现的HDL代码如例2所示。

【例2】使用图1得到的求最大公约数的HDL硬件实现

例2中,注释语句标明了C语言中的语句和HDL实现中的代码的一一对应关系,可以结合图1来理解这个转换过程。在本例,由于C语言算法比较简单,因此通过时钟上升沿这个触发always块运行的条件就可以实现原C语言中4条语句的顺序执行。结合文献[1]和本文的实现方法和过程,可以看出,本文提出的方法比文献[1]中的方法简洁实用,易于理解和操作,请读者细心体会。

例2中的求模运算,在QuartusII中是可综合的,从实现结果可以看出,QuartusII实际上是调用了宏功能模块来实现这一功能;求模运算在ISE中是不可综合的,我们可以使用ISE中的除法器IP核Divider Generator来实现,或者自己使用Verilog HDL语言实现该功能。

对上述得到的实现进行仿真验证。使用Modelsim进行功能仿真,得到的仿真波形如图2所示。从仿真波形可以看出,该改进方法实现了求最大公因数的功能。

图2 仿真波形图Fig.2 simulation waveform

下面,使用Quartus11.0集成开发环境,使用Altera公司的FPGA芯片EP3C5F256C6,对改进前后两种方法的资源使用情况以及系统的最大运行频率进行比较。

两种方法经QuartusII综合后的硬件资源使用情况的对比如表1所示。

表1 方法改进前后的硬件资源消耗Tab.1 comparation of hardware resource used for two methods

两种方法经QuartusII在FPGA芯片上实现后的最大频率的对比如表2所示。

表2 方法改进前后的最大工作时钟频率Table 2 comparation of the maximum frequency for two methods

从表1和表2可以看出,方法改进后,FPGA的资源利用得到了节约,使用的逻辑单元(LE)约节省了14%,但工作频率有所下降,下降约为5%。这也可以理解为面积和速度的一种交换,总体来讲,这种工作频率的下降是可以接受的。

3 结论

本文在分析软件算法和硬件实现的不同特点的基础上,结合C语言算法和HDL硬件实现的特点,提出了将C算法转换为HDL实现的一种改进方法。通过求最大公因数的例子,比较了改进前和改进后的实现方法在FPGA资源使用以及在FPGA实现后的最大工作频率等方面的差距,通过比较发现改进前后的方法在资源利用和最大工作频率方面的差距并不是很明显,但改进后的方法比改进前的方法简洁实用,易于理解和操作。综上,本文提出的改进方法优势明显,具有更广泛的应用前景,对于一般C语言算法的硬件实现具有适用性和指导意义。

(References)

[1]贺敬凯,王瑞春,万学元等.将C算法转换为Verilog实现的一种方法.计算机工程与应用.2010年第46卷第30期He Jingkai,Wang Rui-chui,Wan Xue-yuan,et al.One method of transforming C arithmetic to Verilog implementation.Computer engineering and applications.2010,46(30):71-74.

[2]Richard E.Haskell Darrin M.Hanna著,郑利浩,王荃,陈华锋译. FPGA数字逻辑设计教程(M).2010 Richard E.Haskell Darrin M.Hanna. Digital Design Using Digilent FPGA Board(M).2010(in Chinese)

One improved method for transforming C language algorithm to HDL hardware implementation

HE Jingkai
(College of Electronics and Communications Technology,Shenzhen Institute of Information Technology,GuangDong,ShenZhen 518172,P.R.China)

Based on analyzing the difference between C language algorithm and HDL hardware implementation,an improved method for transforming C language algorithm to HDL hardware implementation was put forward. We demonstrated the application and advantages of this method through an example for solving gcd.The method proposed in this article not only has many advantages and widely application,but also offers good guidance to transform C language algorithm to HDL hardware implementation.

algorithm based on C;HDL hardware implementation;cycle structure;selective structure;sequential structure

TP312

:A

1672-6332(2014)03-0045-04

【责任编辑:高潮】

2014-05-03

广东省高职教育信息技术类专业教学指导委员会“教学与竞赛融通制度研究与实践(XXJS-2013-1041)”;横向课题“FPGA动态重构时隙关键影响因素及动态重构应用研究(HX-056)”;校级精品资源共享课程建设项目“FPGA应用开发(JPKC-201306)”;校级校企合作专项课题“校企联合实验室建设探讨(JY2014B04)” 资助。

贺敬凯(1974-),男(汉),山东枣庄人,博士,高级工程师。研究方向:嵌入式系统设计、单片机与FPGA应用研究。E-mail:hejk@sziit.com.cn

猜你喜欢
工作频率C语言语句
重点:语句衔接
基于Visual Studio Code的C语言程序设计实践教学探索
基于C语言的计算机软件编程
CPU故障的处理技巧
高职高专院校C语言程序设计教学改革探索
高频非对称EMCCD增益驱动电路设计
一种工作频率可变的双向DC-DC变换器
新时期自适应通信技术应用发展现状
论子函数在C语言数据格式输出中的应用
如何搞定语句衔接题