硬件/软件嵌入式系统规范:Ada语言的应用与实现
1. 引言
在硬件/软件协同设计中,对嵌入式系统进行准确规范至关重要。Ada作为一种命令式的高级语言,拥有丰富的编程设施,能很好地支持嵌入式系统的规范设计。本文将详细探讨使用Ada进行嵌入式系统规范设计的多个方面,包括系统行为特性、语言特性以及可综合化等内容。
2. 嵌入式系统规范的关键特性
2.1 行为完成
在某些情况下,若系统的完整行为及其子行为都能达到一个完成点,即所有计算执行完毕且所有变量更新完成,那么系统的完整行为将更易于理解。Ada语言包含相关构造,可确保行为完成。
2.2 状态转换
嵌入式系统有时可被视为具有不同行为状态。每个状态可能代表任意计算。多数情况下,状态计算完成后,会评估转换条件并确定下一个状态。这种描述方式对于反应式系统尤为自然,并且它更像是一个图形化、用户友好的界面,而非严格的规范机制。图形化描述可轻松转换为编程语言代码(如Ada),以便使用类似于VHDL中有限状态机(FSM)的描述风格进行执行和分析。
2.3 分区与层次结构
分区和层次结构是处理复杂性的两种重要手段。遵循“分而治之”的原则,将复杂问题分解为较小的部分,直至找到可管理的组件。嵌入式系统规范设计中存在两种理想的层次分区:结构分区和行为分区。
-
结构分区与层次结构
:能够将系统分解为一组相互连接的组件,这些组件可能有自己的内部结构。由于每个组件都有自己的行为,结构分区与并发密切相关。Ada通过任务支持结构分区。
-
行为分区与层次结构
:将系统行为分解为不同的子行为,这些子行为可能有自己的内部行为分区和层次结构。Ada通过包、子程序(过程和函数)和块支持功能分区和层次结构。
以下是不同分区类型的对比表格:
| 分区类型 | 描述 | Ada支持方式 |
| ---- | ---- | ---- |
| 结构分区 | 将系统分解为相互连接的组件 | 任务 |
| 行为分区 | 将系统行为分解为子行为 | 包、子程序、块 |
2.4 并发
复杂行为通常可更好地概念化为一组并发的子行为。并发是支持结构分区的重要要求,可应用于不同粒度。在硬件/软件协同规范中,并发粒度从粗到细依次为:
-
任务级并发
:最粗粒度,任何行为都可划分为不同任务。
-
语句级并发
:较细粒度。
-
操作级并发
:更细粒度,在满足数据依赖的情况下,两个操作可顺序或并行执行,在行为综合阶段进行分析和决策。
-
位级并发
:最细粒度,在逻辑级决定。
顺序和并发实现之间存在权衡。顺序实现通常较慢但成本较低(从门数量和功耗角度),而并发实现通常较快但成本较高。任何综合工具都应能够进行顺序 - 并发转换,以探索满足设计要求的解决方案。
并发规范有助于检测和避免可能出现的非确定性行为模式,并且使规范更灵活。
2.5 非确定性
非确定性指系统对某一事件做出不可预测反应的能力。嵌入式系统规范中存在两种非确定性行为:
-
功能非确定性
:在相同输入模式序列下,系统可能有不同的行为方式。并发规范具有非确定性,能更准确地反映最终实现中潜在的非确定性行为。在系统规范级别,功能非确定性是一个重要特征,以便尽早检测并在必要时避免。
-
时间非确定性
:由特定计算所花费时间的可变性引起。支持时间非确定性也是一个基本特征,因为在系统级别,确切的时间信息尚不清楚。
2.6 定时
定时指在特定抽象级别上关于系统时间行为的信息。定时信息是设计系统的重要特征之一,可用于概念性地识别不同的抽象级别。
在规范阶段,没有关于系统的时间信息,仅定义要施加的定时约束。需要分析定时约束的一致性,以确保存在满足这些约束的实现。
Ada作为一种编程语言,在执行时没有精确的定时,这加速了系统规范的验证和调试。为支持特定的实时约束,它包含一些与时间相关的构造。在Ada - VHDL协同仿真环境中,可以注释并考虑定时限制。
2.7 通信
Ada任务之间可通过三种主要机制进行通信:共享变量、受保护对象和会合。基于这些基本通信机制,可以自然地指定其他更复杂的通信和同步机制(如监视器、信号量、通道、广播等)。只要基本机制能有效实现,就能确保这些更复杂的派生通信和同步机制也能有效实现。
2.8 同步
在Ada中,同步任务的最简单方法是使用无主体的接受语句。任务同步也可通过共享内存或受保护对象实现。此外,Ada任务还可以异步交互。
2.9 异常和中断
可靠的系统应能在因输入数据格式错误、意外执行模式或硬件故障等导致异常计算模式时正常工作。规范应避免此类意外情况,但为了可靠,应考虑并做好应对准备。在Ada中,这些情况称为异常,语言提供了处理它们的机制。
中断可在Ada规范中明确描述,这些中断将影响整个系统。在硬件/软件分区期间,相应的中断处理程序可分配给软件或硬件。
2.10 面向对象
面向对象编程目前是一种常见的编程方法。基于VHDL的面向对象扩展,其在硬件设计中的扩展目前正在研究中。
3. Ada语言的其他特性要求
除了上述特性外,SLDL委员会还为规范语言定义了一系列其他要求和约束:
-
指定部分描述
:系统规范语言必须能够在设计过程的某个步骤描述已知信息,而无需完整描述。Ada通过单独编译功能支持这一点。
-
以独立于领域的方式陈述事物
:Ada作为一种标准、灵活的语言,独立于任何具体的设计方法、应用或技术,满足这一要求。
-
指定参数值的值和含义
:Ada通过使用编译指示和属性支持设计要求和约束的定义。此外,Ada规范可以通过泛型和判别式依赖于这些参数。为了成为标准并被任何工具接受,应开发一个嵌入式系统规范附件,而不修改语言本身。该附件可以定义额外的编译指示、属性、包和限制,以有效支持硬件/软件协同设计。
-
在组件之间分配需求责任
:当对系统单元施加设计要求(如输入 - 输出延迟、最大功耗等)且系统单元已被划分为多个组件时,一般要求将意味着对每个组件的具体要求。Ada编译指示和属性可用于将要求应用于代码的任何相关部分。
-
表示测量值并与约束进行比较
:虽然提取特定实现的实际属性并将其与规范级别施加的要求和约束进行比较是设计工具的责任,但语言应便于此任务。因此,上述提议的Ada嵌入式系统附件可以包括用于定义设计要求和约束的反向注释机制。
-
跟踪需求或约束的满足情况
:注释的需求和约束在需要时可传递给低级工具。应用于软件时,它们必须直接传递给编译器或预处理或后处理工具;应用于硬件时,它们必须传递给行为综合工具。在这方面,应确保系统级别和行为级别定义的设计要求和约束之间的兼容性。
-
易于输入和操作需求与描述
:Ada语言的模块化(基于子程序、任务、块和包)以及单独编译功能便于隔离描述的各个部分。泛型和判别式也便于代码的操作和重用。
-
规范的执行或仿真
:如前文所述,Ada是一种高级命令式编程语言,支持硬件/软件协同设计的复杂嵌入式系统规范。有许多商业工具可用于代码分析、调试、编译、交叉编译等。当模块的精确时间行为已知时,相应的Ada代码可在VHDL模拟器中进行仿真。
4. Ada可综合化
系统规范方法的目标是允许通过一系列并发任务和过程在Ada中完整规范嵌入式系统,而不对语言使用施加任何类型的限制。这种通用方法的主要优点是灵活性,不施加语法约束。然而,综合效率始终与综合工具识别与描述行为相关的实现的能力有关,这需要规范中使用的实现语义。
因此,代码的某些部分由于其指定方式,可能导致不合适或低效的实现。在硬件/软件协同设计中,对于那些要分配给硬件的任务,如果使用计算复杂的算法(如处理复杂数据结构的代码、递归函数等)进行描述,尤其可能导致不合适的实现。设计师有责任为整个规范,特别是那些很可能分配给硬件的函数,使用合适的描述风格。
4.1 规范结构
系统规范可被视为一个具有输入和输出的实体。为了在系统运行的操作条件下验证规范,需要开发一个环境或测试平台。该环境必须产生输入以刺激系统,并存储系统产生的输出。由于系统规范及其环境必须并发操作,它们必须作为由主子程序激活的Ada任务开发。
当处理大型程序时,完整的Ada规范可以拆分为两个包,供主程序使用。“system_spec”包包含嵌入式系统规范本身,“system_environment”包生成输入以测试系统并存储和/或监控其产生的数据。系统规范结构如下:
package system_spec
-- 声明部分
task specification is
entry input1 (...);
pragma map_IO (input1, protocols.RS232);
entry input2 (...);
...
entry output1 (...);
...
end specification;
end system_spec;
package body system_spec
-- 声明部分
task body specification is
-- 声明部分
begin
-- 语句序列
end specification;
end system_spec;
package system_environment
-- 声明部分
task environment;
end system_environment;
package body system_environment
-- 声明部分
task body environment is
-- 声明部分
begin
-- 语句序列
end environment;
end system_environment;
with system_spec;
with system_environment;
procedure system_name is
begin
null;
end system_name;
“system_spec”包中任务“specification”的入口允许轻松识别嵌入式系统的输入和输出,它们的作用类似于VHDL实体中的端口。任务“specification”需要进行全部或部分设计,而任务“environment”则不需要。因此,后续讨论的可实现性描述风格适用于前者,而后者只需遵循Ada编程的一般建议。
对于要在硬件中实现的Ada规范部分,必须施加一些限制,主要源于行为综合工具的VHDL综合语法和语义。关于Ada规范,会出现三种不同情况:
-
直接可转换为VHDL的Ada特性
:这些特性不存在问题,由于Ada和VHDL之间的语法相似性,只需进行少量修改。
-
间接支持的Ada特性
:这些特性没有直接转换为行为VHDL的方式,但经过一些修改可以转换为行为综合工具支持的VHDL代码。
-
无法转换为行为VHDL的Ada特性
:任何包含此类不支持特性的Ada规范模块都无法进行硬件实现,必须在分区期间转移到软件。
以下是这三种情况的mermaid流程图:
graph LR
A[Ada规范特性] --> B{是否直接可转换为VHDL}
B -- 是 --> C[直接转换,少量修改]
B -- 否 --> D{是否可间接转换为VHDL}
D -- 是 --> E[间接转换,修改后支持]
D -- 否 --> F[转移到软件]
4.2 接口综合
分区后,完整规范分为两部分:一部分包含所有要在软件中实现并由处理器执行的任务;另一部分包含所有要在硬件中实现并由多个硬件模块并发执行的任务。Ada软件代码和行为VHDL代码都直接从Ada规范中获取。
然而,除了从原始规范中提取的硬件和软件算法外,还需要添加一些额外的代码,以确保规范中包含的所有任务之间的通信在目标架构上正确实现。接口实现直接影响整个系统实现的性能和成本,因此在系统规范本身中必须考虑,主要有两种接口:
-
I/O接口
:处理系统与其环境之间通过输入和输出的所有通信。可以使用编译指示指定要使用的协议和硬件。通常,接口编译指示将与特定的I/O硬件相关联。如果未直接指定,则必须选择最合适的I/O硬件。I/O硬件可以是可综合的软VHDL模块或硬模块(现成的商用组件或硅宏单元)。如果从入口读取或写入的数据由分配给软件的任务管理,则必须向Ada软件算法中添加额外的Ada代码,以确保处理器与I/O硬件模块之间的正确通信。此额外代码称为I/O驱动程序,它将强烈依赖于所选的目标架构和使用的通信协议。
-
HW/SW接口
:指正确实现Ada规范中任务之间的通信机制。根据任务的最终分配,需要考虑四种可能的数据传输组合:
- 从硬件到硬件的数据传输。
- 从硬件到软件的数据传输。
- 从软件到硬件的数据传输。
- 从软件到软件的数据传输。
综上所述,使用Ada进行硬件/软件嵌入式系统规范设计具有诸多优势,但也需要注意代码的可综合化以及接口实现等问题。设计师应根据具体需求和目标架构,合理运用Ada语言的各种特性,以实现高效、可靠的嵌入式系统设计。
硬件/软件嵌入式系统规范:Ada语言的应用与实现
5. 不同数据传输组合的详细分析
在硬件/软件嵌入式系统规范设计中,HW/SW 接口涉及的四种数据传输组合具有不同的特点和实现要求,下面进行详细分析:
| 数据传输组合 | 特点 | 实现要点 |
| ---- | ---- | ---- |
| 从硬件到硬件的数据传输 | 速度快,直接在硬件模块间进行数据交互,减少了软件干预带来的延迟 | 需要确保硬件模块之间的通信协议兼容,数据格式匹配。可通过硬件接口标准(如 SPI、I2C 等)实现连接,在设计硬件模块时要考虑数据传输的带宽和时序要求 |
| 从硬件到软件的数据传输 | 硬件采集数据后传递给软件进行处理,实现了硬件功能和软件算法的结合 | 软件需要有相应的接口函数来接收硬件数据,同时要处理好数据的同步和缓冲问题。可能需要使用中断机制来通知软件有新数据到达 |
| 从软件到硬件的数据传输 | 软件根据处理结果向硬件发送控制指令或配置数据,实现对硬件的控制 | 软件要生成符合硬件要求的数据格式和协议,确保硬件能够正确解析。在发送数据时要考虑硬件的响应时间和状态 |
| 从软件到软件的数据传输 | 不同软件模块之间的数据交互,实现系统功能的协同 | 要定义好软件模块之间的接口和数据格式,确保数据的一致性和完整性。可以使用共享内存、消息队列等方式进行数据传输 |
6. 设计流程与注意事项
在使用 Ada 进行硬件/软件嵌入式系统规范设计时,可遵循以下设计流程:
graph LR
A[需求分析] --> B[系统规范设计]
B --> C[分区设计]
C --> D[接口综合]
D --> E[代码实现]
E --> F[验证与调试]
F --> G[优化与部署]
- 需求分析 :明确系统的功能、性能、可靠性等要求,确定系统的输入输出和工作环境。
- 系统规范设计 :使用 Ada 语言对系统进行规范描述,包括系统的行为、并发、通信等特性。
- 分区设计 :将系统划分为硬件和软件部分,确定哪些任务分配给硬件,哪些任务分配给软件。
- 接口综合 :设计 I/O 接口和 HW/SW 接口,确保任务之间的通信正常。
- 代码实现 :根据规范和分区设计,编写 Ada 代码和 VHDL 代码。
- 验证与调试 :使用仿真工具对代码进行验证和调试,确保系统满足设计要求。
- 优化与部署 :对系统进行性能优化,然后部署到目标架构上。
在整个设计过程中,还需要注意以下事项:
-
描述风格
:为了提高代码的可综合化程度,要使用合适的描述风格,避免使用复杂的算法和数据结构。
-
兼容性
:确保 Ada 代码和 VHDL 代码之间的兼容性,以及与目标架构的兼容性。
-
资源管理
:合理管理硬件资源和软件资源,避免资源浪费和冲突。
-
异常处理
:在代码中加入异常处理机制,提高系统的可靠性。
7. 案例分析
下面通过一个简单的案例来说明如何使用 Ada 进行硬件/软件嵌入式系统规范设计。假设我们要设计一个温度监测系统,系统通过温度传感器采集温度数据,然后将数据传输到处理器进行处理,最后将处理结果显示在显示屏上。
7.1 系统规范设计
package system_spec
-- 声明部分
task specification is
entry temperature_input (temp : in Integer);
pragma map_IO (temperature_input, protocols.ADC);
entry display_output (result : out String);
pragma map_IO (display_output, protocols.LCD);
end specification;
end system_spec;
package body system_spec
-- 声明部分
task body specification is
temp_value : Integer;
display_str : String(1..10);
begin
accept temperature_input (temp) do
temp_value := temp;
end temperature_input;
-- 简单的温度处理逻辑
if temp_value > 30 then
display_str := "Hot";
else
display_str := "Normal";
end if;
accept display_output (result) do
result := display_str;
end display_output;
end specification;
end system_spec;
package system_environment
-- 声明部分
task environment;
end system_environment;
package body system_environment
-- 声明部分
task body environment is
temp : Integer := 25; -- 模拟温度数据
display_result : String(1..10);
begin
specification.temperature_input(temp);
specification.display_output(display_result);
-- 模拟显示操作
Put_Line("Display: " & display_result);
end environment;
end system_environment;
with system_spec;
with system_environment;
procedure system_name is
begin
null;
end system_name;
7.2 分区设计
在这个案例中,温度传感器可以看作硬件部分,负责采集温度数据;处理器和显示屏可以看作软件部分,负责处理数据和显示结果。
7.3 接口综合
- I/O 接口 :温度传感器通过 ADC 接口将数据传输到处理器,显示屏通过 LCD 接口接收处理器的数据。
- HW/SW 接口 :处理器通过任务之间的通信机制与温度传感器和显示屏进行数据交互。
通过这个案例,我们可以看到如何使用 Ada 语言进行系统规范设计、分区设计和接口综合,实现硬件和软件的协同工作。
8. 总结
使用 Ada 语言进行硬件/软件嵌入式系统规范设计是一种有效的方法。它提供了丰富的编程特性,如并发、通信、异常处理等,能够很好地满足嵌入式系统的设计需求。在设计过程中,需要注意代码的可综合化、接口实现、资源管理等问题,遵循合理的设计流程,以确保系统的高效性和可靠性。通过实际案例的分析,我们可以更好地理解和应用 Ada 语言进行嵌入式系统设计。未来,随着嵌入式系统的不断发展,Ada 语言在硬件/软件协同设计领域有望发挥更大的作用。设计师可以进一步探索 Ada 语言的高级特性,结合新的硬件技术和设计方法,开发出更加复杂和智能的嵌入式系统。