谢丫丫

FPGA中流水线技术的原因以及解决方法

0
阅读(220) 评论(1)

本文介绍了流水线技术及其对FPGA的影响,即延迟,吞吐量,工作频率变化和资源利用率。

编程的FPGA(现场可编程门阵列)是自定义其资源来执行一个明确的逻辑功能的处理。这涉及使用FPGA的基本构建模块(如可配置逻辑模块(CLB),专用多路复用器等)对程序指令进行建模,以满足数字系统的要求。

在设计过程中,需要考虑的一个重要标准是系统中固有的时间问题,以及用户规定的任何约束。一种可以帮助设计者实现这一目标的设计机制是流水线技术。

 

什么是流水线?

流水线操作是一个能够并行执行程序指令的过程。您可以在下面看到流水线处理器架构的直观表示。 

 

图1.流水线处理器体系结构的可视化表示。每个方块对应一条指令。对于正方形使用不同的颜色表达了指令彼此独立的事实。图片由Colin ML Burnett  [ CC-BY-SA-3.0 ]提供。

 

在FPGA中,这是通过以特定方式排列多个数据处理块来实现的。为此,我们首先将整个逻辑电路分成几个小部分,然后使用寄存器(触发器)将它们分开。

让我们通过考虑一个例子来分析FPGA设计流水线的模式。

 

一个例子

让我们来看一个三次乘法的系统,然后在四个输入数组上加一次。 因此,我们的输出y i将等于(a i × b i × c i)+ d i

 

非流水线设计

创建这样一个系统时想到的第一个设计是乘法器,然后是加法器,如图2a所示。

 

图2a。非流水线FPGA设计的一个例子。由Sneha HL创建的图像

 

在这里,我们期望的操作序列是的乘法  一个我  和  b 我 通过乘法器M数据1,其次是它的产物与乘法  Ç 我  由乘法器中号2  ,最后加入所得到的产物与  d 我  通过加法器A 1。

然而,当该系统被设计成同步的,在第一时钟周期中,只有乘法器M1可以在其输出(产生有效的数据一个1 ×  b 1)。这是因为,此时,与M 2  和A 1不同,只有M 1在其输入引脚上 具有有效数据(a 1  和  b 1)。

在第二个时钟周期中,M 1和M 2 的输入引脚上都有有效数据。但是,现在我们需要确保只有M 2运行而M 1保持其输出的方式。这是因为,在这个时刻,如果M 1进行操作,则它的输出线变为(一个2  ×  2),而不是它的预期值(一个1  ×  1),从而导致错误的中号2输出(一个2  ×  2  ×  ç 1),而不是(一个1  × 1  ×  1)。

当时钟第三次滴答时,所有三个分量都会有有效输入:M 1,M 2和A 1。尽管如此,我们只想加法器,以可操作如我们所期望的输出是  Ý 1 =(一个1  ×  1  ×  c ^ 1  +  1)。这意味着系统的第一个输出将在第三个时钟周期后可用。

接着,作为第四时钟周期到达时,男1可以工作在下一组数据:一个2和2。但就此而言,预计M 2和A 1将处于闲置状态。接下来必须激活M 2 - 只有  M 2 - 在第五个时钟节拍和激活A 1 -  A 1 - 在第六个时钟节拍。这确保了我们的下一个输出,  2  =(2  ×  2  ×  2  +  2)。

当组件遵循类似的激励模式时,我们可以预期下一个输出发生在时钟节拍9,12,15等等(图2b)。

 

图2b。 

 

流水线设计

现在,让我们假设我们在输入(R 1到R 4),M 1和M 2(分别为R 5和R 8)之间以及沿直接输入路径(R 6,R 7,和R 9),如图3a所示。

 

图3a。流水线FPGA设计的一个例子。由Sneha HL创建的图像和表格

 

这里,在第一个时钟周期,有效输入仅出现在寄存器R 1到R 4(分别为1,1,1和1)和乘法器M 1(1和1)。结果,只有这些可以产生有效的输出。此外,一旦M 1产生其输出,它就被传递到寄存器R 5并存储在其中。

在第二时钟周期中,存储在寄存器中的值R 5和R 6(一个1  ×  1和c ^ 1)由显示为输入到M 2这使它能够提供它的输出作为一个1  ×  1  ×  Ç 1,而R的输出4(1)被移位到寄存器R 7。同时,甚至第二组数据(2,2,2和2)进入系统并出现在R 1到R 4的输出端ICfans

在这种情况下,M 1被允许在其输入操作,从而使得其输出线,以从改变一个1  ×  1到一个2  ×  2中,与非流水线设计的情况。这是因为,在这种设计中,M 1输出的任何变化都不会影响M 2的输出。这是因为确保M 2正确功能所需的数据在第一个时钟周期内已经锁存在寄存器R 5中(即使在第二个时钟周期也保持不受干扰)。

这意味着寄存器R 5的插入使M 1和M 2在功能上独立,由此它们可以同时对不同的数据集进行操作。

接下来,当时钟第三次滴答时,寄存器R 8和R 9的输出((1  ×  1  ×  1)和1)作为输入传递给加法器A 1。其结果是,我们得到我们的第一个输出Ŷ 1 =((一个1  ×  1  ×  c ^ 1)+ 1)。然而,在相同的时钟周期,M 1和M 2可以自由操作(3,3)和(2,2,2)。这是可行的,因为存在寄存器R 5将块M 1与M 2隔离,并且R 8将乘法器M 2与加法器A 1隔离。

因此,在第三个时钟周期,除了1之外,我们甚至分别从M 1和M 2得到(3  ×  3)和(2  ×  2  ×  2)。

现在,当第四个时钟周期到来时,加法器A 1  对其输入进行操作以产生第二输出,2 =((2  ×  2  ×  2)+ 2)。另外,M 1的输出从(3  ×  3)变为(4  ×  4),而M 2的输出从(2  ×  2  ×  2)变为(3 ×  b)3  ×  3)。

在遵循相同的操作模式时,我们可以预期从那时开始每个时钟周期出现一个输出数据(图3b),与非流水线设计的情况不同,我们不得不等待三个时钟周期来获得每个时钟周期输出数据(图2b)。

 

 

流水线的后果


潜伏

在所示的示例中,流水线设计显示为从第三个时钟周期开始的每个时钟周期产生一个输出。这是因为每个输入必须通过三个寄存器(构成流水线深度),然后在它到达输出之前进行处理。类似地,如果我们有一个深度为n的流水线,那么有效输出仅在第个时钟周期内每个时钟周期出现一个。

与第一个有效输出出现之前丢失的时钟周期数相关的延迟称为延迟。流水线阶段的数量越多,与之相关的延迟就越大。

 

工作时钟频率增加

图2a所示的非流水线设计显示每三个时钟周期产生一个输出。也就是说,如果我们有一个周期为1 ns的时钟,那么输入需要3 ns(3×1 ns)才能得到处理并显示为输出。

这条最长的数据路径将成为关键路径,它决定了我们设计的最小工作时钟频率。换句话说,所设计系统的频率必须不大于(1/3 ns)= 333.33 MHz,以确保满意的操作。

在流水线设计中,一旦管道填满,每个时钟滴答产生一个输出。因此,我们的工作时钟频率与定义的时钟频率相同(此处为1 / 1ns = 1000 MHz)。

这些数字清楚地表明,与非流水线设计相比,流水线设计大大提高了工作频率。

 

增加吞吐量

流水线设计在每个时钟周期产生一个输出(一旦延迟被克服),而不管设计中包含的流水线级数。因此,通过设计流水线系统,我们可以提高FPGA的吞吐量。

 

更多地利用逻辑资源

在流水线操作中,我们使用寄存器来存储设计各个阶段的结果。这些组件增加了设计使用的逻辑资源,并使其在硬件方面非常庞大。

 

结论

流水线设计的行为非常详尽。您需要在适当的时刻将整个系统划分为单独的阶段,以确保最佳性能。然而,进入它的艰苦工作与它在设计执行时所呈现的优势相当。

  1. 个人觉得Latency还是翻译成迟滞比较合适点,翻译成潜伏总感觉怪怪的……