天天看点

【FPGA】流水线学习笔记

所谓流水线设计实际上就是把规模较大、层次较多的组合逻辑电路分为几个级,在每一级插入寄存器组暂存中间数据。K 级的流水线就是从组合逻辑的输入到输出恰好有 K 个寄存器组(分为 K 级,每一级都有一个寄存器组)上一级的输出是下一级的输入而又无反馈的电路。

【FPGA】流水线学习笔记

图 5.6 表示了如何将把组合逻辑设计转换为相同组合逻辑功能的流水线设计。这个组合逻辑包括两级。第一级的延迟是 T1 和 T3 两个延迟中的最大值;第二级的延迟等于 T2 的延迟。为了通过这个组合逻辑得到稳定的计算结果输出,需要等待的传播延迟为[max(T1,T3)+T2]个时间单位。在从输入到输出的每一级插入寄存器后,流水线设计的第一级寄存器所具有的总的延迟为 T1 与 T3 时延中的最大值加上寄存器的 Tco(触发时间)。同样,第二级寄存器延迟为 T2 的时延加上 Tco。采用流水线设计为取得稳定的输出总体计算周期为:

max(max(T1,T3)+Tco,(T2+Tco))

流水线设计需要两个时钟周期来获取第一个计算结果,而只需要一个时钟周期来获取随后的计算结果。开始时用来获取第一个计算结果的两个时钟周期被称为采用流水线设计的首次延迟(latency)。

对于 CPLD 来说,器件的延迟如 T1、T2 和 T3 相对于触发器的 Tco 要长得多,并且寄存器的建立时间 Tsu 也要比器件的延迟快得多。只有在上述关于硬件时延的假设为真的情况下,流水线设计才能获得比同功能的组合逻辑设计更高的性能。

采用流水线设计的优势在于它能提高吞吐量(throughput)。假设 T1、T2 和 T3 具有同样的传递延迟 Tpd。对于组合逻辑设计而言,总的延迟为 2*Tpd。对于流水线设计来说,计算周期为(Tpd+Tco)。前面提及的首次延迟(latency)的概念实际上就是将(从输入到输出)最长的路径进行初始化所需要的时间总量;吞吐延迟则是执行一次重复性操作所需要的时间总量。在组合逻辑设计中,首次延迟和吞吐延迟同为 2*Tpd。与之相比,在流水线设计中,首次延迟是 2*(Tpd+Tco),而吞吐延迟是 Tpd+Tco。如果 CPLD 硬件能提供快速的Tco,则流水线设计相对于同样功能的组合逻辑设计能提供更大的吞吐量。典型的富含寄存器资源的 CPLD 器件(如 Lattice 的 ispLSI 8840)的 Tpd 为 8.5ns,Tco 为 6ns。

流水线设计在性能上的提高是以消耗较多的寄存器资源为代价的。对于非常简单的用于数据传输的组合逻辑设计,例如上述例子,将它们转换成流水线设计可能只需增加很少的寄存器单元。随着组合逻辑变得复杂,为了保证中间的计算结果都在同一时钟周期内得到,必须在各级之间加入更多的寄存器。如果需要在 CPLD 中实现复杂的流水线设计,以获取更优良的性能,具有丰富寄存器资源的 CPLD 结构并且具有可预测的延迟这两大特点的 FPGA是一个很有吸引力的选择。

具体的案例我就不举例了,因为我看不懂!

下面直接给结论:

改为流水线结构是提高组合逻辑吞吐量从而增强计算性能的一个重要办法。为获取高性能所付出的代价是要使用更多的寄存器。要实现这样大规模的运算部件,只含少量寄存器资源的普通 PLD 器件是无法办到的,必须使用拥有大量寄存器资源的 CPLD 或 FPGA 器件或设计专用的 ASIC。

当用 Verilog 语言描述流水线结构的运算部件时,要使用结构描述,才能够真正综合成设计者想要的流水线结构。简单的运算符表达式只有在综合库中存有相应的流水线结构的宏库部件时,才能综合成流水线结构从而显著地提高运算速度。(希望综合库中有吧) 从这一意义上来说,深入了解和掌握电路的结构是进行高水平 HDL 设计的基础。

最后给出一个纯英文的文档,我还没耐心去读,应该还不错:http://www-inst.eecs.berkeley.edu/~cs61c/sp15/lec/13/2015Sp-CS61C-L13-kavs-Pipelining-1up.pdf