流水线的设计,就是指对延时较大的组合逻辑,插入寄存器,把较大的组合逻辑拆分成几个时钟周期来完成,以提高系统的最大时钟频率。但是这样做,会导致数据输出的延时,假若插入一个寄存器,则数据输出就到产生一个时钟周期的延时,假若插入N个寄存器,就会产生N个时钟周期的延时,下面我们用一幅图来描述这种关系。
上图的总延时等于max{2,3} + 4 = 7ns;系统的时钟周期必须要大于7ns。当经过流水线改造之后,如下图所示:
经过流水线改造之后,总延时等于max{2,3} + 1 + 4 = 8ns;但是系统的时钟周期只要大于4ns即可,总处理数据的吞吐量增加了。
下面我们用一个很简单的例子来实现以下流水线改造,假若我们现在要实现(4*a+6*b)-10。现在我们使用原理图的方法来实现这一算法。
首先像以往一样,新建一个项目;
新建一个项目之后,我们就不需要建verilog HDL file,而是新建一个Block Diagram / Schematic File,如下图所示:
然后我们在新建的原理图里面,双击一下鼠标左键,然后在左上角的library里面找到lpm_mult,如下图所示:
点击OK,选择一下程序保存的路径然后选择next,如下图所示:
按next之后,会弹出配置乘法器的选项,如下图所示:
这里是选择乘法器的位宽,直接按next得到下图所示:
如上图所示,选择让输入的数据乘以一个常数,然后按finish;同理再新建一个输入的数据乘以常数6的乘法器。
现在我们已经实现了4*a与6*b,接下来我们新建一个加法器双击原理图,在library里面找到lmp_add_sub,然后点击OK,选择好程序保存的路径之后,就会出现配置加法的选项,如下图所示:
选择仅仅使用加法,而且把位宽调到16位,就可以按finsh了。然后我们现在就完成了(4*a + 6*b),现在我们来新建一个减法,就如新建加法一样,双击原理图,在library里面找到lmp_add_sub,然后点击OK,选择好程序保存的路径之后,就会出现配置减法的选项,如下图所示:
选择仅仅使用减法,而且把位宽调到16位,然后按next如下图所示:
选择输入的数据减去一个固定的常数,然后选择finish即可。接着我们新建一个Verilog HDL File文件,写一个16位的寄存器组;
代码如下:
接着我们选择左上角的File,然后选择Creat/Updata,再选择CrearSymbol File
然后我们回到原理图的文件里面,双击原理图,在左上角的library里面会多出一个projet,然后在projet里面找到刚才写的寄存器,然后双击放进原理图里面,然后我们用一样的方法,再新建一个8位位宽的寄存器组,然后放进原理图里面,完成之后把线连接好,如下图所示:
然后还没有接线的模块,可以选择右键,选择Generate Pins forSymbol Ports
然后再把未接上的线给全部接上,如下图所示:
把所以先接上之后,可以按crtl+l,进行全编译,查看静态时序分析,观察系统时钟最大频率是多少。如下图所示:
由上图可知,在还未改造成流水线结构的时候,系统时钟的最大频率是166.58Mhz,然后我们现在开始改造流水线结构,看看系统时钟最大频率能上升多少,改流水线结构,如下图所示:
在改造流水线之后,我们可以再一次全编译(ctrl + k),之后我们再继续查看静态时序分析报告,观察系统时钟频率的最大值,如下图所示:
经过流水线改造之后,系统时钟的最大频率由166.58Mhz提升至了332.45Mhz,提升了2倍系统时钟频率。