首页 / 资讯中心 / 文章详情

数字IC前端学习笔记:脉动阵列的设计方法学(一)

数字IC前端学习笔记:脉动阵列的设计方法学(一) ★ FEATURED ARTICLE
相关阅读数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482引言脉动结构也称为脉动阵列表示一种有节奏地计算并通过系统传输数据的处理单元(PEs)网络。这些处理单元有规律地泵入泵出数据以保持规则的数据流。因此脉动阵列的特征是模块化和规则化这对于VLSI设计来说是一个重要的性质。脉动阵列可以作为与主机配合的协处理器从主机接收数据进行计算并将最终结果返回主机。这个操作类似心脏的血液流动因此被称为“脉动”。典型情况下脉动阵列的所有处理单元是相同的且全流水的即PE包含触发器等延时单元通常只包含局部互联。然而为了增加脉动阵列的实用性一些设计也存在放宽。这些放宽包括不仅使用局部互连还使用邻近接近但不是最近的互连使用数据广播操作以及在系统中使用不同的处理单元特别是在边界处。通过这些放宽措施可以为数字信号处理(DSP)应用设计一系列模块化、规则和高效的数据驱动阵列架构。本文以串行FIR滤波器为例介绍了脉动阵列设计方法学其中可以使用线性映射或投影技术为任何给定的规则迭代算法设计多种流线架构。脉动阵列设计方法学流线架构是通过在规则依赖图上使用线性映射技术来设计的。依赖图中的边表示前置约束。一个依赖图(DG)如果在任何节点中某个方向上的边的存在意味着在依赖图中的所有节点在同一方向上都有相应的边那么该依赖图被称为规则依赖图。作为一个例子考虑如下所示的3抽头FIR滤波器的依赖图如图1所示。图1 FIR滤波器的依赖图空间表示这个依赖图有3个基本的边用表示输入用向上的边用向量表示为(0, 1)系数用向右的边用向量表示为(1, 0)输出用下右下角移动的边用向量表示为(1, -1)。由于依赖图中的所有节点都包含这3种边因此该依赖图是规则的。该依赖图对应于一个空间表示因为其中没有为任何计算分配时间不。映射技术将空间表示转换为空间-时间表示在空间-时间表示中每个节点被映射到某个处理单元并且被调度到某个时间步。脉动阵列设计方法学将一个N维的依赖图映射到一个低维的脉动阵列。在本文中只考虑一级映射即将一个N维的依赖图映射到一个(N-1)维的脉动阵列对于FIR滤波器而言是将2维依赖图映射到1维脉动阵列。下面定义脉动阵列设计中的基本向量投影向量也称迭代向量如果两个节点间的距离为投影向量的整数倍则他们由同一个处理单元计算。处理器空间向量任何坐标为的节点由处理单元计算。调度向量任何坐标为的节点在时间步计算。硬件利用率这是因为同一个处理单元的两次计算相隔。对于给定的问题可以通过选择不同的投影向量、处理器空间向量和调度向量来设计多种脉动阵列但这些向量必须满足以下推导出的两个可行性约束。1、处理器空间向量和投影向量必须彼此正交内积为0。如果节点A和B间的距离等于投影向量的整数倍即则这两个节点由同一个处理单元计算所以即。2、如果节点A和B被映射到同一个处理器那么不能同时计算所以即。另外将空间表示转换为空间-时间表示时引入处理器轴时间步轴。 将依赖图映射到脉动阵列时每个依赖图中的边对应脉动阵列中的一个延时边方向延时值为。设计1输入广播、权重保持、输出移动设计1通过选择如下投影向量、处理器向量和调度向量得到可以很容易地验证这些向量满足提到的两个可行性约束并且可得到任何坐标为的节点由处理单元计算即同一条水平线上的节点由同一个处理单元计算。任何坐标为的节点在时间步计算。硬件利用率为。在空间-时间表示中处理器轴对应空间表示中的轴时间步轴对应空间表示中的轴如图2所示。图2 FIR滤波器的空间-时间表示由图2可以看出输入在同一时间步会被广播到所有的处理单元权重会保持在相应处理单元中而输出则出现在不同的处理单元和时间步。将依赖图映射到脉动阵列时边映射的情况如表1所示。表1 设计1的边映射情况方向延迟输入: (0, 1)(0, 1)(1, 0)10权重: (1, 0)01输出: (1, -1)-11图3给出了设计1的脉动阵列框图其中D代表有延时单元如触发器的边。图3 设计1的脉动阵列框图设计1的具体实现如图4所示。图4 设计1的具体实现Verilog实现module PE #( parameter WEIGHT 8shA5 // 定义参数默认为8位有符号常数A5 )( input wire clk, // 时钟信号 input wire rst, // 重置信号 input wire signed [7:0] data_in, // 8位有符号输入数据 input wire signed [31:0] sum_in, // 32位有符号加法输入值 output wire signed [31:0] sum_out // 32位有符号输出结果 ); reg signed [7:0] weight WEIGHT; // 使用参数传递的值来代替内部常数 reg signed [31:0] mul_result; // 存储乘法结果 reg signed [31:0] add_result; // 存储加法结果 reg signed [31:0] reg_out; // 存储输出寄存器的值 // 乘法操作组合逻辑 always (*) begin mul_result data_in * weight; // 乘法操作乘以PE内部的常数值 end // 加法器操作 always (*) begin add_result mul_result sum_in; // 乘法结果与加法输入相加 end // 输出寄存器 always (posedge clk or posedge rst) begin if (rst) begin reg_out 32b0; // 复位时清零输出寄存器 end else begin reg_out add_result; // 输出加法器的结果 end end // 输出信号 assign sum_out reg_out; endmodule module FIR_ststolic_arrays ( input wire clk, // 时钟信号 input wire rst, // 重置信号 input wire signed [7:0] data_in, // 顶层输入数据 output wire signed [31:0] sum_out // PE0的输出 ); // 中间信号 wire signed [31:0] sum_out_1_wire; // PE1的sum_out连接到PE0的sum_in wire signed [31:0] sum_out_2_wire; // PE2的sum_out连接到PE1的sum_in // 实例化PE0 PE #( .WEIGHT(8shA5) // 设置PE0的weight值 ) PE0 ( .clk(clk), .rst(rst), .data_in(data_in), // 顶层的data_in连接到PE0的data_in .sum_in(sum_out_1_wire), // PE0的sum_in连接到PE1的sum_out .sum_out(sum_out) // PE0的sum_out输出到顶层sum_out_0 ); // 实例化PE1 PE #( .WEIGHT(8shB7) // 设置PE1的weight值 ) PE1 ( .clk(clk), .rst(rst), .data_in(data_in), // 顶层的data_in连接到PE1的data_in .sum_in(sum_out_2_wire), // PE1的sum_in连接到PE2的sum_out .sum_out(sum_out_1_wire) // PE1的sum_out输出到PE0的sum_in ); // 实例化PE2 PE #( .WEIGHT(8shC3) // 设置PE2的weight值 ) PE2 ( .clk(clk), .rst(rst), .data_in(data_in), // 顶层的data_in连接到PE2的data_in .sum_in(32b0), // PE2的sum_in设为0 .sum_out(sum_out_2_wire) // PE2的sum_out输出到PE1的sum_in ); endmodule下一章数字IC前端学习笔记脉动阵列的设计方法学二https://blog.csdn.net/weixin_45791458/article/details/144472419本文参考《VLSI Digital Signal Processing Systems Design and Implementation》作者为Keshab K.Parhi。
阅读完成 · 觉得有帮助?
咨询建站