首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

宏架构说明

宏架构说明

宏架构说明
代码重构的最重要部分是重写C/C++代码,以描述可有效实现特定功能的宏架构。换句话说,设计人员负责宏架构说明,而高级综合工具负责宏架构的生成。这类代码重组对得到的吞吐量和质量结果具有重大影响。就球形解码器而言,有几个这类代码重组的实例。例如,为了满足信道排序模块的高吞吐量要求,设计人员应使用C/C++来描述图2所示的宏架构。
这类C/C++代码由几个以数组为传递参数的函数构成。该高级综合工具可自动调用乒乓缓冲器中的数组,以实现在流
水线中并行执行多个矩阵计算模块。本级代码重组的另一个实例是决定特定模块的TDM结构中所使用信道的数量(例如,信道矩阵重排序模块使用5条信道,修正后的实部QR分解模块使用15条信道)。
图6是宏架构说明的一个实例。图3为描述球形检测器的C++代码片段框图。我们注意到图中有一条调用9个函数的流水线,其中每个函数代表图3中的一个模块。函数之间的通信通过传递数组来完成,这些数组被第5行和第7行的适当指令 (pragmas) 映射至数据流接口(不是 FPGA 嵌入式 BRAM 存储器)。

图 6 球形检测器宏架构描述
参数化的重要性
参数化是代码重写的另一个关键实例。我们广泛利用C++模板函数来表示架构中的参数化模块。在球形解码器的实现过程中,该类代码重写有几个不同实例。一个具体实例是应用于信道重排序模块的不同类型矩阵操作。图2所示的矩阵计算模块(4×4, 3×3与2×2)就包含不同类型的矩阵操作,例如矩阵求逆或矩阵相乘。将这些模块进行编码并作为 C++ 模板函数,模板参数即矩阵的行数与列数。
图7为矩阵相乘的C++模板函数。除了矩阵行数和列数这两个参数之外,该模板函数还有第三个参数,即MM_II(矩阵相乘初始化间隔),该参数用于指定二次连续循环迭代之间的时钟周期数量。第 9 行的指令 (pragma)用于对具体实例所需吞吐量进行参数化。这是一项很重要的功能,原因是它可对生成的微体系架构产生重要影响—也就是高级综合工具具备充分利用资源共享的能力,从而可以减少用于具体实现中的 FPGA 资源数量。例如,高级综合工具仅仅通过修改初始化间隔 (Initiation Interval) 参数并使用相同的 C++ 代码,即可在执行不同矩阵求逆(4×4, 3×3, 2×2) 模块的过程中自动实现不同层面的资源共享。

图 7 代码参数化实例
FPGA最优化
FPGA最优化是代码重写的最后一个实例。设计人员可以重写C/C++代码,以更高效地利用特定FPGA资源,从而可以改善时序并减小存储区域的使用。该类最优化方面的两个具体实例是比特宽度最优化与嵌入式DSP模块 (DSP48) 的高效使用。高效利用DSP48可以改善时序并提高FPGA资源利用率。
我们利用内置C/C++数据类型(例如short、int)来编写C/C++参考代码,同时利用18位定点数据类型来表示矩阵元素。我们已经利用C++模板类来表示任意精度的定点数据类型,因此可减少FPGA资源的使用并将时序影响最小化。
图8是一个先执行乘法后执行减法的C++模板函数,而输入操作数宽度是需要设置的参数。可将这两个运算操作映射至嵌入式DSP48模块中。在图8中,有两条指令指示高级综合工具用最多两个时钟周期来调度这些操作并使用寄存器来存储输出返回值。
返回列表