当前位置:首页 > 工业控制 > 电子设计自动化

传统的嵌入式产品只能实现某种特定的功能,不能满足用户可变的丰富多彩的应用需求。为解决这个问题,本文设计并实现了一种使用Java作为软件平台的基于FPGA的可编程嵌入式系统,以实现系统对多种本地应用和网络的支持。

1. 概述

传 统的嵌入式系统设计的主要目标是找到一种优化的体系结构来完成单一的,特定的功能。对这样的系统来说,ASIC和核心处理器是作为特别的构件模块加以考虑 的:设计者根据应用的要求选择适当的ASIC,根据给定的性能要求比如处理器主频,系统稳定性,以及对功耗的要求等选用适当的处理器内核。

然而,在当今移动通信已经进入每个人的生活的今天,现在的嵌入式系统比如PDA等已经不同于传统意义上的嵌入式系统了,它们有自己的独特特点。客观需要要求它们能够支持多种应用功能如网页浏览,播放音频/视频文件,以及进行无线网络通信等。

这样看来,传统的设计思路因为只面向单一的应用,无法满足多应用嵌入式系统的需求。而解决这一问题的良好途径便是向嵌入式系统引入可编程能力,以使得系统能够根据用户的不同要求实现对不同应用的支持。

为了向系统中引入可编程能力,我们考虑在系统中嵌入FPGA,因为FPGA具有下列特点,使得它成为我们的首选:

1.现在的FPGA的处理能力和逻辑容量已经接近于专用ASIC,功耗也比较低,能够满足我们系统设计的要求;
2.由于FPGA具有的可重编程能力,使用了FPGA的嵌入式系统能够满足各种不同的应用要求;

从 嵌入式系统管理的角度来说,对网络通信的支持也是很有必要的,也是很有特色的一个应用,因为它使得从远端服务器下载新的应用程序并在本地运行成为可能。为 实现对这个功能的支持,我们采用Java作为软件平台。因为Java运行在Java虚拟机之上,它能够下载并执行新的应用程序代码,并且无需在下载后重新 启动系统。

综上所述,这个新的嵌入式系统是基于Java的,有一个FPGA和标准处理器相连。我们通过网络下载Java代码和可以对 FPGA进行编程的比特流。该系统也支持对FPGA的动态重新配置。为了实现硬件(FPGA)和软件(Java应用程序代码)之间的通信,又定义了一组本 地API,以使得从Java应用层能够访问到底层的硬件。为了调用这些本地API,采用了Java本地接口(JNI)。在本文中,将一些Java函数 (Javamethod)用FPGA可编程硬件来实现,称之为硬件方法(HW method)。

2. 系统设计

实现一个Java函数功能的对应的硬件方法实现的逻辑结构图如图1所示。

输入缓存和输出缓存分别用来接收输入参数和存储输出结果。控制缓存用于对硬件方法的控制和检测,比如向硬件方法发出启动指令,检查其所处的状态并判断操作是否完成等。该模块中的所有缓存都映射到处理器物理地址空间中,处理器可以使用正常的读写指令完成对这些缓存的访问。

图2是该嵌入式系统的硬件平台,由一个标准处理器,一个FPGA和一个系统存储单元构成。它们之间通过共享的系统总线连接在一起。

当 处理器向一个硬件方法发出读写操作指令时,该硬件方法在其自己的地址解码器的帮助下向数据总线上发送对应的响应信号。在这里,我们可以认为是处理器发起的 硬件/软件通信指令,而FPGA则是作为一个从属单元做出回应。因为在处理器发起初始指令后,就由可配置管理器来负责管理FPGA编程。这样一来,就实现 了处理器和FPGA的并行运行。

如图3所示,我们选择Java作为软件平台,并且装载了一个嵌入式操作系统为Java实时应用程序提供基本的服务,比如线程和其它硬件管理等。

通过系统管理器,可以从远程服务器下载Java应用程序。系统管理器主要实现了下面3种协议:

1. 应用程序代码(包括可对FPGA进行编程的比特流)下载协议;
2. 用于远程管理的系统维护相关的协议;
3. 控制对嵌入式系统访问权限的认证协议。

系统管理器包括基于socket连接的客户端类加载器。远端应用程序可以下载到本地并按照下面的过程执行:

1. 完成认证过程,系统进入管理模式;
2. 下载应用程序代码,完成系统初始化,比如加载FPGA可编程比特流到相应的存储单元;
3. 执行新的应用程序。

在该系统中,为了简化起见,预先映射硬件方法地址到确定的系统物理存储区,目的是为了寻址操作的方便快捷。

由于我们使用了Java软件平台,应用程序就无法直接访问底层的硬件。这就是说,运行在处理器Java虚拟机上的应用程序不能直接访问映射到FPGA中硬件方法的缓存区域。为解决这个问题,理论上可以采用下面两种方法:

1. 修改Java虚拟机,使其具有对处理器物理地址的直接访问能力;
2. 单独设计一种Java本地接口(JNI),使得应用程序通过该接口提供的功能实现对硬件方法映射到的物理地址的访问。

尽 管第一种方案的效率较高,并且没有引入额外开销,但是修改Java虚拟机内核是相当繁杂的工作,同时也可能会引起潜在的系统不稳定。第二种方案虽然引入了 一定的额外开销,但便于移植和实现。因此,我们采用方案二,在Java虚拟机和Java本地接口之外又设计了一个本地通信库。

本地通信库API形式如下:

  int hwWriteXXX(int addr, XXX p);
int hwWriteArrayXXX(int addr, XXX[] p);
XXX hwReadXXX(int addr);
XXX[] hwReadArrayXXX(int addr);
int hwConfig(int cf_mem_addr, int bitstr_size);
Java本地接口层接口的形式如下:
class HWInterface{
static int ConfigStatus;
public static native int setParam(CID hw_cid, object P)
{
if(type_of_P == XXX)
err = hwWriteXXX(hw_cid.addr, (XXX)P);
return err;
}
public static native int getResult(CID hw_cid, object R);
public static native int setCMD(CID hw_cid, int cmd);
public static native int getStatus(CID hw_cid);
public synchronized static native int configHW( CID hw_cid);
}

在上面代码中,XXX表示基本的Java数据类型如整型(integer)、浮点型(float)、双精度型(double)等。

Java 应用程序通过类HWInterface提供的方法访问本地库。上面的代码中给出了setParam的具体实现。其中,CID是包括硬件方法映射到的缓存地 址的一个对象,对应于每个硬件方法的CID都是唯一的,因此,该地址和缓存区大小都是事先已经确定了的。但是,由于系统中只有一个配置控制器,我们无法同 时就两个或多个硬件方法向FPGA进行编程,也可以说同一时刻只能有一个硬件方法在使用配置控制器。为此,引入了一个静态变量ConfigStatus来 反映配置控制器的当前状态。所以,访问配置控制器的函数configHW()是静态的同步的。

使用上面给出的接口,则下面这段代码

  methodA()
{
…;
int a = objA.m1(2); //SW method
int b = objB.m2(3); //HW method
int c = a + b;
…;
}
就应该写成下面的形式:
methodA()
{
…;
1 HWInterface.configHW(cid2); // cid2 is the ID of HW method m2
2 Object P = new Integer(3);
3 HWInterface.SetParam(cid2,P);
4 HWInterface.startHW(cid2);
5 int a = objA.m1(2);
6 Object R = new Integer();
7 While(HWInterface.getResult(cid2, R) == 0)
; //wait until HW method finished
8 HWInterface.getResult(cid2, R);
9 int b = ((Integer)R.getValue());
10 int c = a + b;
…;
}

在 上例中,为了执行FPGA中的函数objB.m2(),首先对FPGA进行编程(Line1)。然后,将参数拷贝到硬件方法的输 入缓存中 (Line3),并对硬件方法进行初始化(Line4)。最后,采用了一个循环函数持续检查硬件方法缓存的状态(Line7,8),直至计算完成,然后拷 贝得到结果(Line9)。

3. 系统实现

使用ARM710T处理器和Virtex的FPGA,根据上文给出的设计方案,我们实现了一个嵌入式系统开发平台。该平台包括一个网络接口,两个调试接口,一个PCI主机接口和一个串行口。并移植了一个嵌入式操作系统和一个小巧的Java实时运行环境。如图4:

4. 总结

本 文用一种全新的思路,对传统的嵌入式系统进行了改进,实现了一种能够支持多种应用的嵌入式系统平台。利用FPGA的可编程性和Java平台良好的移植性 能,该平台完全能够满足我们的设计要求。当然,也有不足之处,比如对配置控制器的状态的获取,可以考虑使用中断的方式来实现,而不是采用本文中的循环查询 机制。这将在以后的工作中加以改进。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭