大家好,又见面了,我是你们的朋友全栈君。
流水线设计的思想来源是高流量,也就是说时间延迟固定的情况下尽可能的产生高的流量,使得整体的信号传输速率得到提升。
这一概念我是最早在《高级FPGA设计——结构、实现和优化》(Steve Kilts)一书中接触到的。作者在书中提到,高流量设计的抽象术语就是“流水线”。
作者指出:流水线设计的优越性是新数据在前面的数据完成之前就可以进行处理。并给出一个例子,硬件实现计算一个数的三次方。
这给出设计代码,用于下文分析比较。
1.类似于软件的递归算法实现(非流水线结构)
代码语言:javascript复制`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/01/21 15:59:20
// Design Name:
// Module Name: test
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies: 实现计算一个数的三次方,采用非流水线的方式
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module power3(
output reg [7:0] XPower,
output finished,
input [7:0] X,
input clk, start //the duration of start is a single clock
);
reg [7:0] ncount;
assign finished=(ncount==0);
always@(posedge clk)
if (start) begin
XPower <=X;
ncount<=2;
end
else if (!finished) begin
ncount<=ncount-1;
XPower <=XPower*X;
end
endmodule
2.流水线结构
代码语言:javascript复制module power3(
output reg [7:0] XPower,
input clk,
input [7:0] X
);
reg [7:0] XPower1, XPower2;
reg [7:0] X1, X2;
//两级流水操作
always@(posedge clk) begin
// Pipeline stage 1
X1 <= X;
XPower1<= X;
// Pipeline stage 2
X2 <= X1;
XPower2<= XPower1*X1;
// Pipeline stage 3
XPower<= XPower2*X2;
end
endmodule
有了设计代码,下面就是比较分析,在硬件层面上究竟两者有啥区别呢?速度?占用资源?是否有差别呢?
在vivado中将两者综合并分析比较。
图一:非流水线设计RTL连线图
图二:非流水线设计资源报告
图三:流水线设计RTL连线图
图四:流水线设计资源报告
比较1:可以看到,非流水线设计中存在较多组合逻辑,而触发器和乘法单元相对较少;在流水线设计中,触发器和乘法单元用的更多。这是不是所谓的“面积”上的区别
图五:非流水线设计时序报告
图六:流水线设计时序报告
比较2:可以看到,在相同的时钟约束下,流水线设计所能达到的最大频率更高(1/(4 0.185)),也就是速度更快。
这是我们通过综合工具得出的结论,Steve Kilts在书中用更抽象的参数描述了两者的区别。
非流水设计:
流量=8/3,或者2.7位/时钟
时滞=3时钟
时序=关键路径中的一个乘法延时
流水设计:
流量=8/1,或者8位/时钟
时滞=3时钟
时序=关键路径中的一个乘法延时
个人思考:
那么这上述流量判定的依据是什么呢?一开始我也困惑,后来慢慢体会给出了自己的思考。
在非流水设计中,最终的输出须等到三次运算都完成后,才能输出,所以输出8位数据需要3个时钟周期,而在流水设计中呢?
我们回到开头“流水线设计的优越性是新数据在前面的数据完成之前就可以进行处理”,抓住“新”一词,其中应强调数据的变化性,就能体会到流水线设计的特征。当数据变化时,在最后一级处理的同时“新数据”已经在处理了,只需“再”一个时钟周期,8位的“新”数据又可以输出了,所有此时流量为8/1。
这里强调数据变化,若是数据不变,或者在第一个数据处理时,流水线的这种优越性将很难让人体会的到。
那么流水线处理的本质依据是什么呢?答案是FPGA的并行性。这一点在Donald G.Bailey 的《基于FPGA的嵌入式图像处理系统设计》中提到过。作者指出,流水性设计,就是将系统整体操作拆解成若干操作步骤进行处理。我们可以看出,上述三次乘方计算中,就是将其拆解成X*X*X来处理。
综合起来,我们可以得出这样的结论:流水线设计单个模块而言,由于插入了若干级寄存器,使得
其时钟频率增加;对于系统级设计而言,流水线设计又能减少模块间的传输延迟。
所以,流水线设计用起来吧!下一步研究怎么样应用吧。
我是fpga小白,写博客只为分享和记录。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170396.html原文链接:https://javaforall.cn