流水线概述
如下图为工厂流水线,工厂流水线就是将一个工作(比如生产一个产品)分成多个细分工作,在生产流水线上由多个不同的人分步完成。这个待完成的产品在流水线上一级一级往下传递。![图片[1] - IC设计技巧-流水线设计 - 我的学记|刘航宇的博客 图片[1] - IC设计技巧-流水线设计 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/63e3b2834757feff33b9e73b.jpg)
比如完成一个产品,需要8道工序,每道工序需要10s,那么流水线启动后,不间断工作的话,第一个产品虽然要80s才完成,但是接下来每10s就能产出一个产品。使得速度大大提高。当然这也增加了人员等资源的付出。
对于电路的流水线设计思想与上述思想异曲同工,也是以付出增加资源消耗为代价,去提高电路运算速度。
流水线设计实例
这里以一个简单的8位无符号数全加器的设计为实例来进行讲解,实现
assign {c_out,data_out [7:0]} = a[7:0] + b[7:0] +c_in
c_out 为进位位。如果有数字电路常识的人都知道,利用一块组合逻辑电路去做8位的加法,其速度肯定比做2位的加法慢。因此这里可以采用4级流水线设计,每一级只做两位的加法操作,当流水线一启动后,除第一个加法运算之外,后面每经过一个2位加法器的延时,就会得到一个结果。
整体结构如下,每一级通过in_valid,o_valid信号交互,分别代表每一级的输入输出有效信号。![图片[2] - IC设计技巧-流水线设计 - 我的学记|刘航宇的博客 图片[2] - IC设计技巧-流水线设计 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/63e3b30f4757feff33badf0d.jpg)
第一级:做最低两位与进位位的加法操作,并将运算结果和未做运算的高六位传给下一级。![图片[3] - IC设计技巧-流水线设计 - 我的学记|刘航宇的博客 图片[3] - IC设计技巧-流水线设计 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/63e3b33a4757feff33bb1c31.jpg)
第二级:做2,3两位与上一级加法器的进位位的加法操作,并将本级运算结果和未做运算的高4位传给下一级。![图片[4] - IC设计技巧-流水线设计 - 我的学记|刘航宇的博客 图片[4] - IC设计技巧-流水线设计 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/63e3b3654757feff33bb6704.jpg)
第三级:做4,5两位与进位位的加法操作,并将运算结果和未做运算的高2位传给下一级。![图片[5] - IC设计技巧-流水线设计 - 我的学记|刘航宇的博客 图片[5] - IC设计技巧-流水线设计 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/63e3b3b94757feff33bbf9a8.jpg)
第四级:做最高两位与上一级加法器输出的进位位的加法操作,并将结果组合输出。![图片[6] - IC设计技巧-流水线设计 - 我的学记|刘航宇的博客 图片[6] - IC设计技巧-流水线设计 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/63e3b4134757feff33bcdcbb.jpg)
仿真结果如下
如图,当整体模块in_valid有效时,送进去的数据a=1,b=5,c_in=1;故经过四个周期后,o_valid信号拉高,同时获得运算结果data_out=7。(本设计的流水线每级延时为一个时钟周期)后续输出信号7、9、10显然是间隔2个周期延迟,而不是延迟4周期、8周期逐个输出![图片[7] - IC设计技巧-流水线设计 - 我的学记|刘航宇的博客 图片[7] - IC设计技巧-流水线设计 - 我的学记|刘航宇的博客](https://pic.imgdb.cn/item/63e3b58b4757feff33bf66ff.jpg)
总结
流水线就是通过将一个大的组合逻辑划分成分步运算的多个小组合逻辑来运算,从而达到提高速度的目的。
在设计流水线的时候,我们一般要尽量使得每级运算所需要的时间差不多,从而做到流水匹配,提高效率。因为流水线的速度由运算最慢的那一级电路决定。