为了降低嵌入式系统的开发成本,同时加快开发速度并保持可靠性,该行业已经转向可重构架构,以适应未来的任务需求并处理系统故障。这些可重构子系统通常基于资源受限的FPGA硬件,或者基于功能齐全的多处理器系统和专用dsp。
针对fpga需要在Verilog中进行开发®或硬件描述语言(VHDL)®,而针对处理器则需要用C/ c++进行开发。许多算法和组件,特别是与通信相关的算法和组件,必须同时针对基于处理器和基于fpga的子系统。
桑迪亚国家实验室与MathWorks顾问一起发起了一个项目,以评估此类应用的基于模型的设计。基于模型的设计将使他们能够从框图生成C/ c++或HDL,并将相同的算法部署到基于处理器和基于fpga的子系统。该项目涉及在FPGA上实现两个标准化的通信协议,联合架构标准数据包协议(JPP)和联合架构标准可靠数据交付协议(JRDDP)。JPP和JRDDP是建立在SpaceWire之上的高级协议,SpaceWire是嵌入式系统中广泛用于模块间通信的物理协议层。桑迪亚国家实验室使用这些协议的手工编码版本来评估基于模型的设计开发的实现。
本文描述了该项目,重点关注模型体系结构和使用的验证技术。它证明了基于模型的设计非常适合于协议实现。
设计要求
JPP和JRDDP通信协议指定了如何将数据从源节点传输到目标节点。它们指定数据包的格式以及数据包传输和重传输的顺序。
因为实现这些协议所需的活动是预定义的和顺序的,所以状态机是一个合乎逻辑的选择。我们决定使用Simulink金宝app®和Stateflow®实现状态机,为这些协议建模和生成C和HDL代码。
模型架构
该项目涉及使用Simulink和Stateflow开发JPP和JRDDP模型。金宝app作为一种尽力而为的协议,JPP只需要一个发送端块和一个接收端块。JRDDP更加复杂。它是一种可靠的数据包传输协议,用于保证应用程序之间的数据传输,它对数据包和控制数据包的发送和接收都需要块。
为这个项目开发的块针对硬件(FPGA)上的实现进行了优化。用户应用程序必须在工作时钟频率上流数据字节进出块。发送器块提供双端口RAM块,用户应用程序在切换开始传输信号之前将数据流放入其中。
接收块维护两组双端口RAM,接收到的数据在到达时流到其中。当一个完整的包可用时,脉冲信号通知用户应用程序在相应的银行中有一个完整的包可用。
所有的发射机块都有相似的结构。图2显示了JPP发射器块的顶层体系结构。
发射器块一端连接到用户应用程序,另一端连接到SpaceWire接口。
接收块具有类似的结构(图3)。
图4显示了一个使用JPP协议发送和接收数据的完整应用程序。
实现更高级别的JRDDP协议
作为一种高级协议,JRDDP的建模比JPP更具挑战性。JRDDP定义了初始化阶段相互连接的发送端点和接收端点之间的通信。一个节点可以有多个发送和接收端点。一个完整的JRDDP端点需要将基本的JRDDP块放在一起并对它们进行调度。
为了说明这一过程,我们开发了一个具有两个发送端点的示例发射机和一个具有两个接收端点的示例接收机。
JRDDP定义了端点必须转换的不同状态。终点的初始状态是“关闭”。当用户应用程序请求端点打开时,端点将转换为“已启用”状态,此时端点将向远程端点发送打开请求。在接收到确认时,端点转换到“Open”状态。在“Open”状态下,用户应用程序可以将数据传输到远程节点。
基于模型的设计使我们能够在状态流图中捕获这个复杂的过程(图5)。
一个完整的JRDDP实现需要为每个端点维护JRDDP状态机,并使用JRDDP构建块:JRDDP发射器块、JRDDP接收器块以及JRDDP控制和确认数据包块。我们需要创建Simulink和State金宝appflow块来将数据从SpaceWire接口路由到相应端点的状态机,并从端点的状态机路由到SpaceWire接口。
图6显示了两个传输端点的JRDDP端点实现。顶部是两个JRDDP状态机,每个端点一个。中央状态流图是一个数据包路由器,用于将每个状态机的控制和数据包路由到控制或数据发送块。图中包括一个数据接收器,它将接收到的数据包路由到适当的端点状态机。
为SpaceWire接口集成Sandia IP
Sandia开发了VHDL知识产权(IP)来创建SpaceWire接收机和发射机端点。对于Sandia来说,评估这个在生产中使用了几年的IP是否容易集成到由Simulink模型的HDL Coder™生成的HDL是很重要的。金宝app
金宝app仿真软件可以黑箱,创建只包含实例化手写实体的接口端口的子系统。工程师可以将空子系统与外部VHDL实体或Verilog模块相关联。我们使用黑盒将Sandia的SpaceWire IP与我们的Simulink模型连接起来,以开发完整的JPP和JRDDP协议接口金宝app。我们还使用黑盒来测试Simulink生成的JPP接口与Sandia手工编码金宝app的JPP协议实现的对比。
验证与测试
在Simulink中开发协议提供了几个好处,特别金宝app是能够在非常高的级别上测试协议。在这个级别上进行调试比在硬件或硬件模拟器中进行调试更便宜、更容易和更快。我们分五个步骤完成了验证:
- 我们在Simulink中模拟了消息的传输和接收。金宝app为此,我们在statflow中创建了SpaceWire接口的功能模型。金宝appSimulink允许在块级、statflow状态和状态转换期间设置用户断点,从而实现高级调试。此外,Simulink支持金宝app状态转换的动画,提供模型按预期行为的可视化验证。
- 我们使用HDL Verifier™与Simulink模型共同模拟生成的VHDL,以证明从Simulink生成的VHDL产生与原始金宝appSimulink模型相同的结果。为此,HDL验证器自动比较结果并绘制错误。在这一步中,我们使用statflow来模拟SpaceWire接口;我们并没有使用SpaceWire的IP。
- 我们再次使用了联合模拟,用Sandia的IP替换了SpaceWire接口的功能模型。我们将联合仿真模型应用于ModelSim中的测试输入,并在Simulink中捕获结果。金宝app
- 我们用Sandia手工编码的JPP接收器实现替换了接收器。
- 我们用Sandia VHDL JPP接收机代替了在Simulink和Stateflo金宝appw中开发的JPP接收机,并进行了另一次联合仿真测试。测试证实了两个JPP接收器是可互换的。
结论
该项目证实了基于模型的设计可以用于软件和硬件中建模和实现高级协议。Simulink和Stateflow中的建模金宝app协议有几个好处。首先,该模型为协议提供了明确的可执行规范。第二,自动生成C/ c++和HDL有助于快速开发参考实现。
基于模型的设计的另一个重要好处是能够在高级软件环境中调试和验证实现。金宝appSimulink和Stateflow允许在块级和信号级上设置状态断点和状态转换。状态流还通过使状态转换动画化来方便调试分层状态机。经过高层调试,联合仿真和fpga在环仿真对设计进行了调试和验证。
对于JPP的实现,在ML507(一个Virtex®5-based board)的比例约为1%。对于JRDDP协议,两个端点实现的资源利用率约为10%。进一步的优化和调优将进一步降低资源利用率。不可能与手工编码的实现进行直接比较,因为手工编码的版本没有为Xilinx实现®但基于Simulink和Stateflow模型生成的HDL的资源利用率对于Sandia来说是可以接受的。金宝app
在基于模型的设计中,同一个Simulink模型可以生成用于部署在金宝app处理器上的C/ c++和用于部署在硬件(FPGA或ASIC)上的HDL。HDL和C/ c++都可以从同一个模型中生成,但是Simulink模型必须通过使用Simulink特性(如可变子系统)对每个实现分金宝app别进行优化。对于基于处理器的实现,用户应用程序可能会创建一个数据帧并将其传递给协议层,协议层将作为一个整体处理帧,而不是作为字节流处理。基于硬件的实现以硬件的时钟频率一次一个字节接收来自用户应用程序的数据。
用高级语言(如Simulink和Stateflow)建模允许非硬件专家的工程师创建硬金宝app件实现。但是,我们建议请硬件专家来优化设计,并在目标硬件上进行最终集成。