基于数据帧驱动的软件综合方法转让专利

申请号 : CN201210394330.4

文献号 : CN102855123B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王坚李玉柏范玉衡李桓

申请人 : 电子科技大学

摘要 :

本发明提供了一种基于数据帧驱动的软件综合方法。本发明将数据流图中每个循环结构封装成一个模块;建立一个模块队列,简化数据流图;并从头部开始依次取出模块进行分析,获取原始数据流图的完整调度队列;为调度队列中的每个模块的每个输出端口创建一个输出数据缓冲区,并完成数据流图代码的自动生成。通过上述方案本发明有效解决了一个上游模块所产生的数据被下游模块重复使用的情况,并且支持数据流图的代码自动生成的情况,非常适用于工程实践中。

权利要求 :

1.基于数据帧驱动的软件综合方法,其特征在于,包括以下步骤:(1)分析数据流图,将其中每个循环结构封装成一个模块,确定简化后数据流图中每个模块的深度;

(2)将模块按照深度从小到大依次排列,建立一个模块队列,从该模块队列的头部取出一个模块;

(3)如果该模块是循环结构封装模块,则执行第(4)步;如果该模块是用户设计的子系统封装模块,则跳转到第(5)步;若既非循环结构封装模块,又非用户设计的子系统封装模块,则跳转到第(6)步;

(4)通过分析得到该循环结构的完整调度队列,将其加入到该循环结构封装模块所属的调度队列中,并跳转到第(7)步;

(5)通过分析得到该子系统封装模块所代表的子系统的完整调度队列,并将其加入到该子系统封装模块所属的调度队列中,并跳转到第(7)步;

(6)将该模块加入到该模块所属的调度队列中,并进入下一步;

(7)取出下一个模块,重复执行第(3)步,直至取空模块队列,便得到第(1)步所述简化前数据流图的完整调度队列;

(8)从该完整调度队列中从头到尾依次取出一个模块,并将其数据输出到缓冲区,直至取空该数据流图的完整调度队列,完成数据流图的仿真;

(9)完成数据流图代码的生成;

所述步骤(4)中具体实现方式如下:

(4a)该循环结构中包含“延时”模块,从“延时”模块处打破该循环结构;

(4b)从第(1)步开始分析,直至得到该循环结构的完整调度队列;

(4c)将得到的该循环结构的完整调度队列加入到该循环结构封装模块所属的调度队列中。

2.根据权利要求1所述的基于数据帧驱动的软件综合方法,其特征在于,所述步骤(1)中所述模块深度为模块数据深度,根据数据帧驱动关系确定。

3.根据权利要求2所述的基于数据帧驱动的软件综合方法,其特征在于,所述步骤(9)主要实现方式如下:(9a)生成数据流图中代表该模块功能的函数,并为每个模块的输出端口创建一个数据缓冲区;

(9b)根据得到的该数据流图的完整调度队列,从头到尾依次取出模块,并将与之对应的功能函数写入主函数当前代码的尾部;

(9c)在取空该数据流图的完整调度队列后,完成数据流图代码的生成。

4.根据权利要求1~3任一项所述的基于数据帧驱动的软件综合方法,其特征在于,所述步骤(5)中,分析该子系统封装模块时,对该子系统封装模块的子系统数据流图进行分析,即嵌套步骤(1)~(7),直至得到该子系统封装模块所代表的子系统的完整调度队列,再将其加入到该子系统封装模块所属的调度队列中,并跳转到第(7)步。

说明书 :

基于数据帧驱动的软件综合方法

技术领域

[0001] 本发明属于软件综合领域,具体的讲,涉及一种基于数据帧驱动的软件综合方法。

背景技术

[0002] 现有技术中的软件综合方法均基于数据量或Kahn处理网络进行,Kahn处理网络(Kahn process networks, KPN)是一个流行的并行计算模型,它包含一组确定性的线性任务进程,通过先进先出管道进行数据交互,显式地表达了任务的数据依赖和并行结构。所述数据量和Kahn处理网络均遵循数据守恒原理,即所有模块产生的数据量与所有模块消耗的数据量相同。
[0003] 但是现阶段一个上游模块所产生的数据被同一个下游模块重复使用,导致其不满足数据守恒原理,因此数据量或者Kahn处理网络并不适用于一个上游模块所产生的数据被同一个下游模块重复使用的情况。

发明内容

[0004] 本发明的目的在于克服现有技术不适用于一个上游模块所产生的数据被下游模块重复使用的情况,提供一种基于数据帧驱动的软件综合方法,使其适用于一个上有模块所产生的数据能被下游模块重新使用,解决上述缺陷。
[0005] 本发明采用的技术方案如下:
[0006] 基于数据帧驱动的软件综合方法,包括以下步骤:
[0007] (1)分析数据流图,将其中每个循环结构封装成一个模块,确定简化后数据流图中每个模块的深度;
[0008] (2)将模块按照深度从小到大依次排列,建立一个模块队列,从该模块队列的头部取出一个模块;
[0009] (3)如果该模块是循环结构封装模块,则执行第(4)步;如果该模块是用户设计的子系统封装模块,则跳转到第(5)步;若既非循环结构封装模块,又非用户设计的子系统封装模块,则跳转到第(6)步;
[0010] (4)通过分析得到该循环结构的完整调度队列,将其加入到该循环结构封装模块所属的调度队列中,并跳转到第(7)步;
[0011] (5)通过分析得到该子系统封装模块所代表的子系统的完整调度队列,并将其加入到该子系统封装模块所属的调度队列中,并跳转到第(7)步;
[0012] (6)将该模块加入到该模块所属的调度队列中,并进入下一步;
[0013] (7)取出下一个模块,重复执行第(3)步,直至取空模块队列,便得到第(1)步所述简化前数据流图的完整调度队列;
[0014] (8)从该完整调度队列中从头到尾依次取出一个模块,并将其数据输出到缓冲区,直至取空该数据流图的完整调度队列,完成数据流图的仿真;
[0015] (9)完成数据流图代码的生成。
[0016] 为了使上有数据能够充分被下游模块重复使用,所述步骤(1)中所述模块深度为模块数据深度,根据数据帧驱动关系确定。
[0017] 进一步的,所述步骤(4)中具体实现方式如下:
[0018] (4a)该循环结构中包含“延时”模块,从“延时”模块处打破该循环结构;
[0019] (4b)从第(1)步开始分析,直至得到该循环结构的完整调度队列;
[0020] (4c)将得到的该循环结构的完整调度队列加入到该循环结构封装模块所属的调度队列中。
[0021] 再进一步的,所述步骤(9)主要实现方式如下:
[0022] (9a)生成数据流图中代表该模块功能的函数,并为每个模块的输出端口创建一个数据缓冲区;
[0023] (9b)根据得到的该数据流图的完整调度队列,从头到尾依次取出模块,并将与之对应的功能函数写入主函数当前代码的尾部;
[0024] (9c)在取空该数据流图的完整调度队列后,完成数据流图代码的生成。
[0025] 为了得到该子系统的完整调度队列,所述步骤(5)中,分析该子系统封装模块时,对该子系统封装模块的子系统数据流图进行分析,即嵌套步骤(1)~(7),直至得到该子系统封装模块所代表的子系统的完整调度队列,再将其加入到该子系统封装模块所属的调度队列中,并跳转到第(7)步。
[0026] 与现有技术相比,本发明具有以下有益效果:
[0027] (1)本发明采用基于数据帧驱动的软件综合方法,有效的解决了软件综合中,一个上游模块所产生的数据被同一个下游模块重复使用所导致的不满足数据守恒定理数据流图的问题,在不满足数据守恒的条件下,现阶段一个上游模块所产生的数据能被下游模块重新使用。
[0028] (2)本发明中所述模块深度为模块数据深度,根据数据帧驱动关系确定,且本发明还支持基于数据帧驱动的数据流图的代码自动生成,通过这种方法使本发明特别适于工程应用,可靠性高。
[0029] (3)本发明中若取出的模块为用户设计的子系统模块,会嵌套前面的算法对该子系统模块进一步的进行分析,在得到该子系统封装模块所代表的子系统的完整调度队列前不断嵌套前面的步骤,实现算法的重复利用,这样能够缩短整个流程的步骤,减少了计算量,使子系统模块能以较快的速度被分析得到其完整的调度队列。
[0030] (4)本发明中在得到该数据流图的完整调度队列后,在其头部取出一个模块,并将模块的数据输出到缓冲区中,因此在调用下游模块时,只是读取了上游模块输出数据的一个副本,并未将上游模块输出缓冲区中的数据删除。因此上游模块的输出数据仍然能被下游模块重复使用,直至上游模块更新输出数据为止。

附图说明

[0031] 图1为本发明实施例中调度队列获取算法的流程图。
[0032] 图2为本发明实施例中Turbo码译码的数据流图。
[0033] 图3为图2中循环结构的数据流图。
[0034] 图4为图3所示循环结构打破后的数据流图。

具体实施方式

[0035] 下面结合附图与实施例对本发明作进一步说明,本发明的实施方式包括但不限于下述实施例。实施例
[0036] 如图2所示,该图为Turbo码译码示意图,Turbo码能够巧妙地将两个简单分量码通过伪随机交织器并行级联来构造具有伪随机特性的长码,并通过在两个软入/软出(SISO)译码器之间进行多次迭代实现了伪随机译码。性能远远超过了其他的编码方式,因此图2还包括SISO译码器1和SISO译码器2,相互配合实现多次迭代译码。
[0037] 图2中“SISO译码器1”模块、“交织”模块、“SISO译码器2”模块、“解交织”模块和“延时”模块构成一个循环结构,并在“延时”模块中设置了迭代次数为6。
[0038] 其中本实例得到图2所示数据流图的调度队列为:
[0039] “数据源”;
[0040] “Turbo帧数据提取”;
[0041] for(i=0;i<6;i++)
[0042] {
[0043] “SISO译码器1”;
[0044] “交织”;
[0045] “SISO译码器2”;
[0046] “解交织”;
[0047] “延时”;
[0048] }
[0049] “硬判决”;
[0050] “显示”;
[0051] “Turbo帧数据提取”模块的输出数据被重复使用了6次。在仿真过程中,“SISO译码器1”模块和“SISO译码器2”模块每次迭代都要使用“Turbo帧数据提取”模块的输出数据。
[0052] 其中该调度队列获取算法流程如图1所示,其具体步骤如下:
[0053] 第1步:检查数据流图是否具有循环结构。如果具有循环结构,将其封装成循环结构封装模块,否则执行第2步。本实例中,将“SISO译码器1”模块、“交织”模块、“SISO译码器2”、“解交织”模块和“延时”模块封装成1个循环结构封装模块,编号为循环结构封装模块1。
[0054] 第2步
[0055] 将第1步经过封装得到的循环结构封装模块与其他模块组合,简化数据流图,并根据数据帧驱动关系确定每个模块的数据深度。根据数据帧驱动关系,如果1个模块只有1个上游模块,且该上游模块数据深度为N,则该模块数据深度为N+1;如果1个模块具有多个上游模块,且所有上游模块中数据深度最大为N,则该模块数据深度为N+1;如果该模块没有上游模块,则其数据深度为1。
[0056] 按照数据深度从小到大的顺序依次排列每个模块,建立一个模块队列,使队列前面的模块深度始终小于或等于其后面模块的数据深度。在本实例中,得到的模块队列中的模块依次为:“数据源”模块、“Turbo帧数据提取”模块、循环结构封装模块1、“硬判决”模块、“显示”模块。该模块队列中的模块,均所属于附图2所示数据流图的调度队列。
[0057] 第3步
[0058] 从第2步得到的模块队列的头部取出一个模块,确定该模块性质,其中:
[0059] 如果该模块是循环结构封装模块,则执行第4步;
[0060] 如果该模块为用户设计的子系统封装模块,则执行第5步;
[0061] 如果不是上述两种情况,则执行第6步。
[0062] 第4步
[0063] 该循环结构封装模块所代表的循环结构由“SISO译码器1”模块、“交织”模块、“SISO译码器2”、“解交织”模块和“延时”模块组成,得到由上述模块组成的循环结构数据流图,如图3所示。
[0064] 从图3中的“延时”模块处打破该循环结构,得到如图4所示的循环结构打破后的数据流图。再从第1步开始,对图4所示数据流图进行分析,直至得到图4所示数据流图的完整调度队列,并将得到的调度队列加入到该循环结构封装模块所属的调度队列中。
[0065] 跳转到第7步。
[0066] 第5步
[0067] 该模块为用户设计的子系统封装模块,从第1步开始,对用户设计的该子系统封装模块所代表的子系统数据流图进行分析,直至得到该子系统数据流图的完整调度队列,并将得到的调度队列加入到该子系统封装模块所属的调度队列中;这种方法为嵌套调用图1所示的算法,即重复第1~8步,若中间步骤中再取出一个子系统封装模块,则再嵌套调用图1所示的算法,一直进行分析,直至得到子系统数据流图的完整调度队列。
[0068] 跳转到第7步。
[0069] 第6步
[0070] 将该模块加入到该模块所属的调度队列中。
[0071] 执行下一步。
[0072] 第7步
[0073] 重复执行第3步,直至取空模块队列,即取出所有模块,获得附图2所示数据流图的完整调度队列。
[0074] 在获得图2所示数据流图的调度队列后,即完成了如图1所示的调度队列算法获取流程。
[0075] 第8步
[0076] 根据得到图2所示数据流图的完整调度队列,从其头部取出一个模块,调用该模块,并将数据输出到缓冲区中。
[0077] 因此在调用下游模块时,只是读取了上游模块输出数据的一个副本,并未将上游模块输出缓冲区中的数据删除,直至该上游模块再次被调用更新输出数据为止。
[0078] 第9步
[0079] 重复第8步,直至取空图2所示数据流图的完整调度队列,完成数据流图的仿真。
[0080] 第10步
[0081] 生成图2所示数据流图中每个模块的功能函数,并为模块的每个输出端口创建一个输出数据缓冲区。
[0082] 第11步
[0083] 根据得到的图2所示数据流图的完整调度队列,从其头部依次取出模块,并将第10步生成的与之对应的功能函数写入主函数当前代码的尾部。直至取空图2所示数据流图的完整调度队列,完成代码的自动生成。
[0084] 按照上述实施例,便可很好的实现本发明。