一种模型驱动开发FPGA多时钟设计方法
作者简介:
孙宇明,男,北京航空航天大学信号与信息处理专业博士,高级工程师,中国空间技术研究院FPGA验证领域专家,主要研究方向为FPGA设计缺陷静态分析和动态硬件仿真加速。自2010年从事型号FPGA第三方验证工作以来,先后负责并参与完成载人航天、探月工程等多个国家重点型号,涵盖雷达、通信、图像处理、接口控制等方向。
摘要:使用Matlab公司的Simulink和HDLCoder工具来实现模型驱动开发FPGA设计,是现行模型驱动FPGA设计开发的有效手段。Simulink模型的计算顺序是按照时间的顺序执行的,HDLCoder将Simulink模型 转化为FPGA代码。整个模型系统都是在同一采样时间下进行的,与实际FPGA多时钟使用的场景存在差异,为模型驱动FPGA开发带来问题。为解决这一问题,提出了一种使用Simulink和HDLCoder进行模型驱动FPGA开发的多时钟设计方法,通过增加跨时钟域同步模块、跨时钟域缓存和近似等效频率仿真的手段,实验表明,该方法有效解决模型驱动FPGA开发多时钟设计问题。
关键词:模型驱动;Simulink;FPGA;多时钟设计
引 言
Simulink是基于模型设计的核心开发工具,提供了一个动态系统建模、仿真和综合分析的集成环境,是MATLAB最重要的组件之一。能够描述线性系统、非线性系统,能够支持单速率或多速率任务,并可以对连续系统、离散系统或者混合系统建模和仿真。Simulink以模块为功能单位,通过信号线进行连接,用户通过GUI调配每个模块的参数,仿真的结果以数值和图形等形象化方式具现出来。HDL Coder将MATLAB函数、Simulink模型和状态流图转化为能用于FPGA编程或者ASIC设计的VHDL和Verilog代码。在Simulink模型与VHDL和Verilog代码之间提供可追述的接口。MATLAB集成环境包含丰富可以转化为HDL语言的Simulink库,为设计师实现自己的算法意图提供了便捷条件。因此,Simulink和HDLCoder在模型驱动开发FPGA设计中得到了广泛的应用,其应用方式具有一定的研究意义。
时钟是FPGA等同步时序设计逻辑电路工作的核心。自动生成代码的时钟是通过对Simulink建模系统采样时间分析得来的。Simulink模型的计算顺序是基于时间采样和信号流向的,即按照时间的顺序执行。每个采样点时间,模型中所有模块的状态和输入/输出值都要计算并更新一下,每个模块的输出值都通过信号连接传递给下一个模块输入。系统采样时间由解算器类型和步长共同决定,并且作为Simulink模型仿真的最小粒度。由于FPGA设计输入频率的多样性,在Simulink模型模型中按照真实的频率大小模拟系统执行情况,对于大多数FPGA设计来说是有很大的难度。同样,对于多个驱动时钟之间有不确定的相位偏差的设计实现,有很大的困难。因此,需要研究解决多时钟设计的方法。
本文提出了一种基于模型驱动的FPGA多时钟设计方法,按照模块化的思想,将每个时钟域设置为一个子系统,子系统之间经过数据的同步化处理,并且借鉴相对频率概念近似等效频率,解决多时钟设计问题,实验表明,该方法能够有效隔离时钟域消除亚稳态影响并且完整接收数据同时兼顾了设计便利性和有效性,解决了多时钟设计问题。
01数学模型
对于一个FPGA设计来说,可以借鉴软件无线电的理论,数字系统是模拟系统的离散化处理。因此,使用连续时间系统表征再对其进行离散化表征。
1.1 连续模型
对于任意一个FPGA设计来说,输出y(t)可以表征为输入信号x(t)经过FPGA处理函数f(x)的输出,即:
y(t)=f(x(t))...........(1)
其中,f(x)函数包含所有线性和非线性处理,y(t)、x(t)为矢量函数。
1.2 离散化模型
现在对f(x)进行分类,按照线性处理、非线性处理,各个离散周期处理,在不考虑跨时钟域冲突的情况下,可以将公式(1)离散化为:
其中,表示非线性处理,表示线性处理,表示FPGA的k个时钟域中,第p个时钟周期。
考虑到只有做了跨时钟域处理之后,设计才会按照预先设计的处理函数进行工作。考虑到需要对在每个时钟域均对离散化的信号进行相应的同步化处理,同时同步化处理的本质是时钟节拍的延迟即线性处理且只在各个函数执行之前处理,因此可以将系统模型公式改写为如下形式:
其中,表示对第个时钟进行同步化处理的函数。
02跨时钟域处理
现在对f(x)进行分类,按照线性处理、非线性处理,各个离散周期处理,在不考虑跨时钟域冲突的情况下,可以将公式(1)离散化为:
2.1 亚稳态隔离同步
针对亚稳态隔离的情况,Simulink的HDLCoder库实现如图1所示,同时可以将同步化模型抽象为下面公式(4):
其中,为同步到周期为时钟域的数据。
图1 亚稳态隔离同步化器
2.2 数据完整性同步
考虑到数据完整性和有效性,采样时钟域的数据速率一定要不低于被采样时钟域的数据速率。一种可靠的方式是通过缓存的方式来连接,缓存模型抽象为下面公式,数据完整性同步化实现模型利用双口ram实现,如图2所示,inclkdomain和outclkdomain分别为输入时钟域操作逻辑和输出时钟域操作逻辑,输出时钟域操作逻辑通过比对当前存储数据是否为空来判定是否输出缓存数据。
其中,为同步到周期为时钟域的数据,fifonum为缓存深度,实现模型如下所示。
03多时钟域设计
在triggered subsystems中,使用trigger模块作为时钟,能够在被生成的代码中设计多个不同的时钟域。能够覆盖下列场景:
1) 工作在相同频率不同相位的异步时钟;
2) 被一个外部其他时钟或者内部信号分频的时钟域;
3) 时钟频率不是互为整数倍的两个时钟域;
4) 内部生成的时钟;
5) 为了低功耗而设计的门控时钟。
每个时钟域离散后的数据可以看成是当前时钟域的一个数字序列。当该时钟域的频率升高整数倍的时候,整数倍数字序列时之前地速序列的数据保持扩展。找到各个时钟域的最小公倍数,就能有效模拟各个时钟域的操作。有些设计存在频率值不能被除尽或者最小公倍数有效位数已经超过采样频率所能表达的情况,这样就需要一种折中的方式来解决该问题。归功于FPGA同步时钟设计是序列操作,在模型实现阶段主要关注的是本时钟域处理信号的先后次序,对于较差时钟域信号设计中已经考虑到数据超前或者延时的因素。因此,可以将系统频率设定为至少4倍以上各个时钟域时钟的频率,使用直接频率合成的方式生成各个时钟域所需要的频率进行模型验证[3]。
综上所述,设计流程如下:
1) 确定模型系统最高工作频率;
2) 使用直接频率合成的手段获得各个时钟域频率;
3) 使用triggered subsystems模块来搭建各个时钟域模型;
4) 在每个模型的输入接口采用第三章所述述的亚稳态隔离或者保证数据完整性的同步方式解决跨时钟域问题;
5) 在HDL工作流助手( HDL Workflow Advisor)的“HDL Code Generation > Set Code Generation Options > Set Advanced Options”条目中,勾选“Use trigger signal as clock”。
6) 生成设计代码。
04实 现
为了验证这一方法的正确性,下面设计两个差分BPSK调制器比较结果。两个差分调制器分别为单时钟域调制器和多时钟域调制器。单时钟域调制器最高工作频率为512Hz,输入数据速率为1Hz,两时钟同源,数据常发。多时钟域调制器最高工作频率为512Hz,输入数据速率为10Hz两时钟异步,每隔100s发送100bit数据。这样,只要输入数据内容一样。最后输出的调制结果也一直。建模后的单时钟域调制器和多时钟域调制器设计分别如图3和图4所示。
图3单时钟域调制器
图4 多时钟域调制器
通过生成波形比对两组信号结果模型结果可知,输出波形完全一致,只是多时钟域延时稍大,如图5所示。
图5调制器输出波形比较
综上,实现表明,单时钟域输出波形和多时钟域输出一致,该方法能够完成多时钟域设计。
05结 语
本文提出了一种基于模型驱动的FPGA多时钟设计方法,首先,确定系统最高工作频率,其次,使用直接频率合成完成多时钟域建模,再次按照模块化的思想,将每个时钟域设置为一个子系统,最后,子系统之间经过数据的同步化处理,实验表明,该方法能够有效隔离时钟域消除亚稳态影响并且完整接收数据,采用图形化的设计方法是设计师便利,同时生成结果和单频率期望模型一致,解决了多时钟设计问题。
-End-