 
- UID
- 1029342
- 性别
- 男
|
六、FPGA编程时的流水线使用
如上所述,如果单周期定时循环内部代码执行所需的时间超出了定时时钟限定的范围,比如100MHz的时钟限定了单周期定时循环每次执行的时间为10ns,那么程序在编译过程中就会报出定时错误。消除这种错误的方法就是减少关键路径所占用的时间(关键路径是代码中需要时间最长的一条代码路径)。那如何消除?使用流水线。
流水线的编程方法就是人为地在关键路径(最长执行时延的路径)中插入一些寄存器。这些寄存器可以将联合的路径拆分开,这一点与普通循环中系统自动添加的寄存器的作用是一致的。但在普通循环中,每个时钟周期只执行一个函数,后续的函数虽然占用着硬件的资源,但由于没有接收到前端的有效数据所以不会开始执行。因此,整个循环的代码的执行时间是几乎函数个数的总和。但是,既然各个函数都有各自预留的硬件资源,那为什么不能让所有的函数在同一时间并行执行呢?这就是流水线的含义。而在单周期定时循环内部,在每个时钟周期内,每一个流水线节点都从各自的起始点开始执行。
上图分别展示了普通的循环、普通的单周期定时循环以及具有流水线的单周期定时循环对于同一个程序的执行流程。对于流水线的单周期定时循环,前两个周期的输出数据是无效的,从第三个周期开始输出了第一个有效的数据,此后每个周期都会输出一个有效的数据。所以,带流水线的单周期定时循环的执行效果只是会引入一定的输出数据时延,其他方面没有任何不同。而带流水线的单周期定时循环,由于使用了人为加入的反馈节点或者移位寄存器,将原来的关键路径拆分成了好几个部分,因此,一方面不容易在编译时出现定时错误,另一方面由于缩短了关键路径使得可以使用更高的时钟频率。具体编程时,请在时延和最高可达的时钟频率之间做一个权衡。
一些简单的流水线编程技例子如下:
 |
|