原创 ImpulseC介绍(一)

2009-5-7 16:13 2874 7 7 分类: FPGA/CPLD

Electronics System Level,ESL。电子系统级设计,是现在很多EDA厂商积极推广的一个概念。在网上搜了一番,发现跟ESL相关的名词主要有:SystemC,TLM(事务级建模)。具体概念不是很懂,但大致的意思是ESL的设计方法是使用一种比RTL级语言更上层,更抽象的语言(如SystemC)来描述设计模块的功能与作用。从宣传的另一个角度来看,ESL的另外一个好处是软硬件协同设计,就是说让软件开发和硬件平台的设计两条分支能够同期进行,至少软件开发不会滞后之后硬件设计太多,从而简化了设计流程。

ImpulseC Logo

说了这么多,其实我今天是想介绍一个ESL工具:ImpulseC。ImpulseC其实是一个C语言的函数库,利用其中的函数,系统开发者能够用C语言描述一个应用程序。结合ImpulseC自己的编译器,就能够将系统的一部分或者全部转换成HDL代码,这部分代码就能够综合成硬件电路。我们都知道,软件程序其实是一条一条的指令顺序执行的,而将一部分不具有相关性各自独立的代码转换成可以并行执行的硬件模块的话,就能够实现给应用加速的目的,而这在擅长并行计算的FPGA上是很容易实现的。听到这个地方,似乎能够让那些为系统性能加速的硬件工程师松了一口气,但是先别急着高兴,因为想要掌握这种方法,还是需要一段时间的。?

为了给大家建立起一个认识,我在这里先演示一个实验,以便对ImpulseC有一个感性的认识。
这个实验的主要内容就是给运行在MicroBlaze的平台的uClinux操作系统添加一个图像滤波(边缘检测)应用程序,然后将边缘检测的工作用硬件来实现,该应用程序利用了OS提供的文件读写功能,并用“流”的概念为硬件和软件提供了一个数据交互的接口。该实验是由澳大利亚昆士兰大学的John Williams博士所设计的。

?

?

?

点击看大图

?

?

上图为实验流程图(此时已经在MicroBlaze平台上运行起uClinux操作系统):首先以MicroBlaze作为客户端从TFTP服务器上(PC机)把素材图片和应用程序下载到/tmp目录下(该目录为RAMdisk文件系统,是唯一能够读写的区域,其他的地方都是ROMFS文件系统-只读属性)。然后运行应用程序,以素材图片为参数传递进去,然后运行在MicroBlaze之上的图像处理程序就开始依次进行如下步骤:

?

Stream Packing:这一步是将图片数据以Stream的形式组织起来,以合适的方式传给下一级处理;
Row Generation:将图像数据按行像素的形式分割成三个通道(R/G/B)传给下级,这样三个通道的边缘检测可以并行进行;
Pixel Window Filtering:该单元执行基于窗口化的边缘检测图像滤波运算;
Stream Unpacking:将处理后的图像数据以相反于输入时打包的方式传递给软件。

以上四个步骤都是在FPGA上完成(也就是说是硬件执行的)。最后图像处理程序将从Stream送来的数据按照TIFF图片格式写到/tmp目录下,这样一个对彩色图像进行边缘检测的硬件加速实验就基本完成了,要更直观的检验实验结果,可以通过TFTP命令将实验结果传送到TFTP服务器(PC机)上,在PC机上用图像浏览器来看边缘检测后的图片效果。

?

实验工具准备:

ISE,EDK(推荐使用8.2i,我用的就是这个版本);
ImpulseC Codeveloper 2.20(该软件可以从ImpulseC的官方网站上面申请到30天试用版,http://www.impulsec.com)
TFTP服务器端TFTPD32(http://tftpd32.jounin.net/,我用的是v3.23);
XUPV2P实验板;
256MB DDR 266MHz 内存条
以太网交叉电缆一根;
RS232串口线一根;

下面就来介绍一下实验的具体操作步骤:

1. ?在EDK下面建一个基于Virtex II-Pro的硬件平台(由于此部分非本文重点,而且考虑到大家对EDK的熟练程度,在此略去若干字,详细请参见稍后呈上的附件工程中的MHS文件);


2. ?利用生成的BSP文件,MicroBlaze-GCC编译环境和uClinux-20070130源代码编译得到对应硬件平台的操作系统内核镜像文件(具体配置步骤略,理由同上);


3. 接着在Codeveloper 2.20中打开它自带的样例工程-ImageFilter_uClinux (如下图所示):

?

点击看大图

打开后的工程有4个文件:?

4 files

?

img_sw.c, img_hw.c, tiff.c and img.h?
这三个文件就是整个应用的完全描述,其中img_sw.c里面包含了主函数的入口,数据流入/流出通路和一个硬件模块;
tiff.c代码则包含了TIFF图片格式数据的读/写例程。
Img_hw.c代码里面包含的两个硬件进程:prep_run和filter_run(这个“进程”是ImpulseC里面的一个概念,详细的请参见《Practical FPGA Programming in C》一书)则组成了一个图像滤波器。另外还有两个硬件进程用来对流像素数据进行压包和解包。这些硬件进程可以被Codeveloper转换成HDL代码。其余的文件则是需要在MicroBlaze平台上运行的软件进程。


在PC平台上进行桌面仿真
由于ImpulseC就是一种C语言的扩展库,所以可以在PC平台上直接编译成EXE可执行程序,也就能够在PC平台上运行。因此,在CoDeveloper的IDE下,首先编译该项应用程序(Build Software Simulation Executable):

点击看大图

?

编译结果如下图所示:?

点击看大图
?

从控制台的显示可以看到在PC上编译得到了一个叫做img.exe的可执行程序。接着就可以在IDE下对这个程序进行仿真测试了:?

?

点击看大图

?

仿真结果:
在PC平台(Pentium-M 1.70G 2G RAM)上运行该程序对一幅分辨率为512X512的TIFF彩色图片进行边缘检测所用时间超过了10秒。

点击看大图

?

点击看大图
?在后面我将继续演示该实验的后续步骤,另外工程文件也将在稍后提供出来



PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条