搜索
bottom↓
回复: 29

请教:流水线为什么不可以加反馈呢???

[复制链接]

出0入0汤圆

发表于 2012-3-4 09:34:06 | 显示全部楼层 |阅读模式
很多资料都是这么写的:流水线处理是高速设计中的一个常用设计手段。如果某个设计的处理流程分为若干步骤,而且整个数据处理是“单流向”的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计方法来提高系统的工作频率。

想不明白为什么不能加反馈?

比如说:我要实现  C=A+B  D=D+C ; 这算不算反馈呢?

代码:
module liushui
(
        CLK,RSTn,A,B,C,D
);

        input CLK;
        input RSTn;
        input [7:0] A;
        input [7:0] B;
        output [7:0] C;
        output [7:0] D;
       
/***********************************************/       

        reg [7:0] rC;
        reg [7:0] rD;       
        always@(posedge CLK or negedge RSTn)
                if(!RSTn) begin
                        rC <= 8'd0;
                        rD <= 8'd0;
                end
                else begin
                        rC <= C;
                        rD <= D;
                end       
       
/***********************************************/       

        assign C = A + B;
        assign D = rD + rC;
       
/***********************************************/       
endmodule

仿真:


(原文件名:fz.jpg)

RTL:


(原文件名:zh.jpg)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-3-4 10:39:54 | 显示全部楼层
严格的说你这不个不算是流水线,只是一个同步加法器级联一个累加器

出0入17汤圆

发表于 2012-3-4 10:40:53 | 显示全部楼层
没有人说不可以,FIR/IIR都是这样做的。

出0入0汤圆

 楼主| 发表于 2012-3-4 10:47:41 | 显示全部楼层
回复【1楼】mitchell
严格的说你这不个不算是流水线,只是一个同步加法器级联一个累加器
-----------------------------------------------------------------------

您好,我确实是对流水线理解不好,我是想举个简单的例子来理解一下 流水线 和 流水线为什么不能加反馈,还在困惑,您能不能给个带反馈的算式啥的,谢谢

出0入0汤圆

 楼主| 发表于 2012-3-4 10:55:13 | 显示全部楼层
回复【2楼】Nuker
没有人说不可以,fir/iir都是这样做的。
-----------------------------------------------------------------------

但是好多资料都是说不可以用迭代反馈的:
“如果某个设计的处理流程分为若干步骤,而且整个数据处理是“单流向”的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计方法来提高系统的工作频率。”
http://www.eeworld.com.cn/gykz/2008/0328/article_714.html

Altera FPGA-CPLD设计 高级篇 P22

(原文件名:altera.jpg)

出0入17汤圆

发表于 2012-3-4 11:14:00 | 显示全部楼层
经常被用来产生伪随机数的LFSR就是典型的反馈流水线,只不过没人称它为流水线而已。

出0入17汤圆

发表于 2012-3-4 11:19:34 | 显示全部楼层
看图

(原文件名:lfsr6.PNG)

编辑原因:图片格式不对

出0入0汤圆

发表于 2012-3-4 11:50:39 | 显示全部楼层
回复【5楼】Nuker  
经常被用来产生伪随机数的lfsr就是典型的反馈流水线,只不过没人称它为流水线而已。
-----------------------------------------------------------------------

不要混淆了移位寄存器和流水线。照你这个说法,任何RTL电路都是流水线了?

流水线的关键点是,把某一个数据处理的流程,分成若干个短小的步骤去完成。是通过插入流水线寄存器来实现的,去掉流水线寄存器就变成原有的非流水线的流程。LFSR显然不满足这个要求,它根本没有非流水线的版本。

出0入0汤圆

发表于 2012-3-4 11:57:53 | 显示全部楼层
补充一下: 如果原有的非流水线版本的数据处理流程本身包含反馈通路,那么是无法直接改造成流水线结构的。

出0入17汤圆

发表于 2012-3-4 12:21:21 | 显示全部楼层
回复【7楼】mitchell
-----------------------------------------------------------------------
是的,你理解的是狭义的数据处理流水线,但是广义的流水线就是同步RTL电路。至于LZ提出来的问题,流水线是否可以反馈取决于数据处理的流程和规则。
在现代RISC设计中,CPU的流水线普遍加入了forawding和bypassing功能,从RTL结构上来讲,就是加入了有后级到前级的反馈,以及跳过中间某级的逻辑。

出0入0汤圆

发表于 2012-3-4 12:33:23 | 显示全部楼层
回复【9楼】Nuker  
-----------------------------------------------------------------------

你认为lz在讨论广义的流水线么?
我认为lz正在学习和理解常规意义的流水线。

出0入0汤圆

发表于 2012-3-4 12:58:44 | 显示全部楼层
回复【12楼】mitchell  
-----------------------------------------------------------------------
mark

出0入0汤圆

 楼主| 发表于 2012-3-4 16:52:13 | 显示全部楼层
@mitchell  @Nuker  两位大侠稍安勿躁 可能是我问题表述不清

我又考虑了一下 我理解的是引入流水线会增加延时

比如用流水线实现带反馈的1阶 IIR

y(n)=x(n)*a(0)+x(n-1)*a(1)+y(n-1)*b(1)

假如x(n)*a(0)+x(n-1)*a(1)部分用2级流水线实现
乘加为一级 那么输出会有两个延时吧 也就是
x(n-2)*a(0)+x(n-3)*a(1)
那么反馈部分只有是 y(n-3)*b(1) 时
整个系统的输出才为 y(n-2)=x(n-2)*a(0)+x(n-3)*a(1)+y(n-3)*b(1)
也就是说反馈部分不能再有其他延时了 假如反馈为 y(n-4)*b(1) y(n-5)*b(1) 加上前面的 x(n-2)*a(0)+x(n-3)*a(1)
输出为:x(n-2)*a(0)+x(n-3)*a(1)+y(n-4)*b(1) 或者 x(n-2)*a(0)+x(n-3)*a(1)+y(n-5)*b(1) 都不能输出正确结果
所以反馈部分不能用流水线了 这样理解对吗?


(原文件名:gs.jpg)

出0入0汤圆

发表于 2012-3-4 17:16:51 | 显示全部楼层
回复【14楼】zhanshenguilai  
-----------------------------------------------------------------------

你的说法是对的。
流水线一定要在RTL上来理解。流水线就是在并行的前馈路径上插入流水线寄存器,将步骤细分。如果有并列的反馈路径,从原理上就不可行了。
你可以试试设计一个32bit的加法器,并在cyclone上综合到400MHz,手工画画RTL的图,对比流水线和非流水线,瞬间就理解了。

出0入17汤圆

发表于 2012-3-5 02:12:40 | 显示全部楼层
并列的反馈路径从原理上讲是可行的。重要的是设计者的控制,设计者必须知道在什么时候选择什么样的反馈路径,可以达到等待比传统方法更少的latency,同时又不会产生harzard。

(原文件名:pipecontrol.jpg)

出0入17汤圆

发表于 2012-3-5 02:19:05 | 显示全部楼层
上图Z4/Z5到ALU的路径就是反馈路径,设计者必须保证Z4/Z5得到正确的结果的情况下将它们直接反馈给ALU的输入,从而省掉Z4/Z5回写,以及regfile的读出时间,但是控制模块极为关键,就是图中的hazard detection and forward unit。

出0入0汤圆

发表于 2012-3-5 03:04:21 | 显示全部楼层
回复【17楼】Nuker  
-----------------------------------------------------------------------

“Z4/Z5得到正确的结果的情况下将它们直接反馈给ALU的输入,从而省掉Z4/Z5回写”

严格起来,这里有两种理解:(1)这个部分只算作RTL不能算流水线结构:反馈只是在某一特定时候的一个路径选择,把流水线部分看成一个独立的数据处理流程,反馈部分是在流水线结构外面的东西。(2)这是一个变结构的流水线:在反馈通路被选中时,Z4/Z5已经和ALU独立开(不再是后级的流水线寄存器,功能已经变化),这个时候如果把Z4/Z5看做ALU的前一级,那么这两条反馈通路实际就是前馈通路,符合了严格的流水线的定义。

我们没有必要再争论“广义流水线”、“狭义流水线”、“RTL”的区别和联系了,根本没有什么本质的分歧。

你要明白发帖人的出发点,不必在这里高谈阔论。

出0入17汤圆

发表于 2012-3-5 11:15:53 | 显示全部楼层
上图这只是一个实际的5级流水线的RISC CPU的结构。
只不过很反感书上那些绝对的文字描述而已,很容易误导初学者,LZ在这里要是现IIR算法,所以一定会用到时间反馈,那么按照书上的说法就不可以用流水线实现了。实际上LZ的目标就可以用相似的方法做到,并不应该纠结于是否采用了流水线。

出0入17汤圆

发表于 2012-3-5 11:29:13 | 显示全部楼层
忽然发现,mitchell也是夜猫子一只。

出0入0汤圆

发表于 2012-3-5 12:13:43 | 显示全部楼层
回复【19楼】Nuker  
-----------------------------------------------------------------------

好!我们就具体问题讨论:
如果加法器的时延是8ns,乘法器是8ns,寄存器的Ts和Th都是0,不考虑布线和寄存器的时延,要实现一个100MHz的IIR滤波器:
y(n) = b1 * y(n - 1) + a0 * x(n)

你按照你的说法,给个“相似的方法”来实现一下?

出0入17汤圆

发表于 2012-3-5 17:38:47 | 显示全部楼层
如果仅仅是为了达到100MHz的指标,因为最慢的路径就是乘+加,将乘法器和加法器用寄存器break down成2级,即乘法器的输出加一级锁存,然后输出给加法器。
但是问题在于引入了反馈,所以必须等等最后一级加法器得到正确结果的时候才允许y寄存器锁存。所以可以将这个流水线分解为2个phase,phase0:乘法运算;phase1:加法运算
在phase1结束后的下个时钟沿更新x,同时锁存y,提升频率的代价是每2个时钟才能做一次完整运算。

出0入0汤圆

发表于 2012-3-5 18:16:45 | 显示全部楼层
根据y(n) = b * y(n - 1) + a * x(n)和y(n - 1) = b * y(n - 2) + a * x(n - 1)得y(n) = b * b * y(n - 2) + a * b * x(n - 1)  + a * x(n)。

反馈通道上面由原来的1级延时增加到2级延时,这两级延时可以分别人肉retiming到乘法器和加法器的输出上,兼做流水寄存之用。

出0入0汤圆

 楼主| 发表于 2012-3-5 19:57:13 | 显示全部楼层
回复【23楼】at90s 子非鱼
根据y(n) = b * y(n - 1) + a * x(n)和y(n - 1) = b * y(n - 2) + a * x(n - 1)得y(n) = b * b * y(n - 2) + a * b * x(n - 1)  + a * x(n)。
反馈通道上面由原来的1级延时增加到2级延时,这两级延时可以分别人肉retiming到乘法器和加法器的输出上,兼做流水寄存之用。

-----------------------------------------------------------------------

貌似是这种方法,是叫做弛豫超前吧:


(原文件名:iir.jpg)

出0入0汤圆

 楼主| 发表于 2012-3-5 20:13:09 | 显示全部楼层
其实俺的目的不是做 IIR, 俺是想做LMS自适应滤波器,想流水线实现,无奈有两个反馈,搞的晕乎乎的

找了一种叫DLMS的方法:

还在验证中,大侠们要是有更好的方法望不吝赐教


(原文件名:ls2.jpg)

出0入0汤圆

发表于 2012-3-5 20:20:06 | 显示全部楼层
回复【22楼】Nuker  
如果仅仅是为了达到100mhz的指标,因为最慢的路径就是乘+加,将乘法器和加法器用寄存器break down成2级,即乘法器的输出加一级锁存,然后输出给加法器。
但是问题在于引入了反馈,所以必须等等最后一级加法器得到正确结果的时候才允许y寄存器锁存。所以可以将这个流水线分解为2个phase,phase0:乘法运算;phase1:加法运算
在phase1结束后的下个时钟沿更新x,同时锁存y,提升频率的代价是每2个时钟才能做一次完整运算。

-----------------------------------------------------------------------

"每2个时钟才能做一次完整运算"和50MHz有何区别? 这里要求的就是100MHz的吞吐量

出0入0汤圆

发表于 2012-3-5 20:21:14 | 显示全部楼层
回复【23楼】at90s  子非鱼
根据y(n) = b * y(n - 1) + a * x(n)和y(n - 1) = b * y(n - 2) + a * x(n - 1)得y(n) = b * b * y(n - 2) + a * b * x(n - 1)  + a * x(n)。
反馈通道上面由原来的1级延时增加到2级延时,这两级延时可以分别人肉retiming到乘法器和加法器的输出上,兼做流水寄存之用。

-----------------------------------------------------------------------

新引入了一次加法,流水线的长度还要+1,所以还是不能实现。

出0入0汤圆

发表于 2012-3-6 09:07:09 | 显示全部楼层
回复【27楼】mitchell
-----------------------------------------------------------------------

我们可以在滤波器的输入加入两级延时(这个延时大部分情况下在系统级上看来是没影响的),所以y(n) = b * y(n - 1) + a * x(n)变为y(n) = b * y(n - 1) + a * x(n - 2),再变换后为y(n) = b * b * y(n - 2) + a * b * x(n - 3)  + a * x(n - 2),这样前馈通道上就有2级寄存器可以用来retiming了,将这两级寄存器分别放到前馈通道的乘法器和加法器后面即可。

出0入0汤圆

 楼主| 发表于 2012-3-6 09:41:55 | 显示全部楼层
看大侠们在这里讨论受益匪浅啊,我也插两句,通过这几天学习关于流水线 是不是可以这样总结:

1.一般来说流水线中是不能用反馈的,因为他会引入延时,导致算法迭代错误。
  但是也有特定的算法就是需要反馈延时的,这时很适合用流水线

2.对于不能直接用流水线的带反馈算法,我们可以想办法改变算法结构,使其能够应用流水线,比如采用“弛豫超前”
  “近似”来重新构建算法结构
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 11:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表