一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 3640|回复: 5

流水线技术原理和Verilog HDL实现

[复制链接]
发表于 2013-10-30 13:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2013-10-30 13:28 编辑
- B; p# V/ S$ @2 I
# V* f1 I2 r: @. t; b
所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行。这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时间无关。这样,在理想的流水操作状态下,其运行效率很高。
' \7 K5 Y; G. c0 D" W  如果某个设计的处理流程分为若干步骤,而且整个数据处理是单流向的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以采用流水线设计方法来提高系统的工作频率。
5 f' B+ c, H; Q  H6 P  下面用8位全加器作为实例,分别列举了非流水线方法、2级流水线方法和4级流水线方法。
(1)非流水线实现方式
module adder_8bits(din_1, clk, cin, dout, din_2, cout);
- G: |+ z( Y1 M' ]2 B. V    input [7:0] din_1;" t# M+ h9 ]! A6 }& q
    input clk;- b" h/ _% p2 ~/ t& X, [
    input cin;
+ G3 v% Y6 e6 n# Q  C3 p    output [7:0] dout;
/ t2 b& K4 [9 m$ J" F: |    input [7:0] din_2;
! {8 o2 h: U7 |    output cout;
) ~- o2 o2 Q8 X1 ^$ {      6 b  f1 J) u# x5 a
     reg [7:0] dout;& _. b7 `. a* N# ]! o
     reg       cout;  H, W4 n" G% a+ j3 C
      
# x2 V& D! n( z- _$ j3 e; R     always @(posedge clk) begin
7 `4 G7 ]  K6 t        {cout,dout} <= din_1 + din_2 + cin;
# r0 e3 B% _0 ~6 R1 f     end9 B  n9 Y$ \5 B6 f  _" x1 s
- ~9 L. f6 h4 D: X' Z: q* K9 ~
endmodule
9 o% i0 [3 Y) Z3 e
 楼主| 发表于 2013-10-30 13:31 | 显示全部楼层
(2)2级流水线实现方式
) R# u) \* p, G% s8 x) m: Gmodule adder_4bits_2steps(cin_a, cin_b, cin, clk, cout, sum);* ]0 i# v2 u& p  a2 g' M
    input [7:0] cin_a;1 W/ d  g) f( W5 Z  x6 o4 y
    input [7:0] cin_b;+ M' S% `) {0 i' u3 T( k! P
    input cin;6 e# X- g( ~" V0 p. U
    input clk;
5 H; Y9 n3 E: y: E+ {" d    output cout;
0 r1 C# d- g4 u& S1 h) C$ M" q    output [7:0] sum;! r* M' [3 r, Q. T8 z. n5 G
      
. s/ R/ x& I* F, ^& |+ @* V( _5 H6 {     reg cout;  S7 ^( j+ A9 ?' B! |
     reg cout_temp;
' D0 \9 Y* ]: ~/ I     reg [7:0] sum;
6 }; }# N1 s, b% N% H     reg [3:0] sum_temp;
5 |3 Q9 a% a8 d      
% w8 x4 c+ T: c3 b% }- y     always @(posedge clk) begin, g! K) }" l3 \3 s
        {cout_temp,sum_temp} = cin_a[3:0] + cin_b[3:0] + cin;
- S& D$ Q/ `8 p" v( A' R     end
0 y2 g: `$ ], ]- \. s  V0 C      0 U7 @; }5 ^0 W
     always @(posedge clk) begin6 J8 Q% n: i! G7 j
        {cout,sum} = {{1'b0,cin_a[7:4]} + {1'b0,cin_b[7:4]} + cout_temp, sum_temp};
. f4 E2 H0 l" n6 J( s     end; E" ]1 S# N( N  I8 u
endmodule
回复

使用道具 举报

 楼主| 发表于 2013-10-30 13:34 | 显示全部楼层
注意:这里在always块内只能用阻塞赋值方式,否则会出现逻辑上的错误!(3)4级流水线实现方式:
# J- H' K9 Z' \% w( \; ^" p/ xmodule adder_8bits_4steps(cin_a, cin_b, c_in, clk, c_out, sum_out);8 _3 v4 P: ]3 V% f
    input [7:0] cin_a;+ G; y: A$ M9 C/ r* g) N! P3 a
    input [7:0] cin_b;1 A/ V1 A/ p0 R, E1 S7 P/ e
    input c_in;
3 M" k5 }+ L5 s: ?. w) t/ p    input clk;
6 L% h2 `1 f* B' t$ ^9 `    output c_out;1 E/ B- e3 b  }
    output [7:0] sum_out;* ^: Q, r) S* M
      5 B/ J6 [$ K) o5 G; {
     reg c_out;, n; f! K- m, ?/ u" ]4 C6 {6 F
     reg c_out_t1, c_out_t2, c_out_t3;
/ {- @! b  F, ~3 M1 f      
7 _3 |2 D, n$ Q     reg [7:0] sum_out;
+ G. j5 t8 A7 `: o( z9 z     reg [1:0] sum_out_t1;
+ X( Y0 H0 t  F  [  N2 O2 @' |: j     reg [3:0] sum_out_t2;
0 F1 u9 ~6 F4 a& m: y     reg [5:0] sum_out_t3;7 M: D8 R3 s3 h' W" E0 s4 G) x  h' j
      & v$ s" G& Z1 l; t- q, A
     always @(posedge clk) begin0 R; J7 M  R" |: C3 w
        {c_out_t1, sum_out_t1} = {1'b0, cin_a[1:0]} + {1'b0, cin_b[1:0]} + c_in;
1 w3 a/ j) d) N: U; u     end7 b2 ^9 N0 e( ]# i3 p& y* `
      
6 A4 t, W1 K9 W( d+ v- S     always @(posedge clk) begin
# N1 t* ^6 u5 Y" W        {c_out_t2, sum_out_t2} = {{1'b0, cin_a[3:2]} + {1'b0, cin_b[3:2]} + c_out_t1, sum_out_t1};' q0 K1 Q) O7 Z3 `5 l! D$ T
     end
/ l/ w% K" Q5 S+ I  A, s      
3 w, H! ~! T6 X/ V/ D$ a2 ~# F     always @(posedge clk) begin& J2 n- @7 ]6 S! u4 A# B
        {c_out_t3, sum_out_t3} = {{1'b0, cin_a[5:4]} + {1'b0, cin_b[5:4]} + c_out_t2, sum_out_t2};
; \" a3 ]" A) k$ F! L     end
2 l  C( F5 t( y- j      
( f4 V- y* R. H0 w9 E" f( [6 O     always @(posedge clk) begin
- @4 ^9 _: z2 q/ `        {c_out, sum_out} = {{1'b0, cin_a[7:6]} + {1'b0, cin_b[7:6]} + c_out_t3, sum_out_t3};# k9 y% U) F' `
     end
! i6 ?9 f4 T4 m9 `( R
  M0 P& I$ S/ z$ W1 \, e' O9 i8 |2 D9 ?9 [
endmodule4 e2 d* a% Q8 d! {; e* S
+ k1 R$ d2 J& P5 l5 a
回复

使用道具 举报

 楼主| 发表于 2013-10-30 13:35 | 显示全部楼层
总结:利用流水线的设计方法,可大大提高系统的工作速度。这种方法可广泛运用于各种设计,特别是大型的、对速度要求较高的系统设计。虽然采用流水线会增大资源的使用,但是它可降低寄存器间的传播延时,保证系统维持高的系统时钟速度。在实际应用中,考虑到资源的使用和速度的要求,可以根据实际情况来选择流水线的级数以满足设计需要。; z6 p$ `2 L/ V- i, m/ Y
  这是一种典型的以面积换速度的设计方法。这里的“面积”主要是指设计所占用的FPGA逻辑资源数目,即利用所消耗的触发器(FF)和查找表(LUT)来衡量。“速度”是指在芯片上稳定运行时所能达到的最高频率。面积和速度这两个指标始终贯穿着FPGA的设计,是设计质量评价的最终标准。
回复

使用道具 举报

 楼主| 发表于 2013-10-30 15:11 | 显示全部楼层
流水线乘法
; x( @8 A. R- V* k6 \2 t
  F" \  D$ e4 Y9 n; e/ |- J% S! zmodule multi_4bits_pipelining(mul_a, mul_b, clk, rst_n, mul_out);$ e: D- D/ n4 I' h- W3 ?
     $ f: [6 f! t9 `  s# V0 ?
    input [3:0] mul_a, mul_b;" ]7 {5 m, L+ Q
    input       clk;
) i) o' W. K0 G% P9 }0 e3 G    input       rst_n;
9 o4 ~3 I) K2 V! w    output [7:0] mul_out;( W+ R2 \  _+ b9 {1 E

+ i# g, Q1 v' B* T6 m5 v5 R    reg [7:0] mul_out;
" \8 O5 s$ s5 c" o- `0 Z/ c9 O. \ 1 T( J; X0 p1 D4 l5 `% i; s
    reg [7:0] stored0;! _: _# t) h6 J) M
    reg [7:0] stored1;- a6 c7 T' n: G- _
    reg [7:0] stored2;$ ^3 G+ [) y# i' A! [# C. r0 i
    reg [7:0] stored3;
- b) L* M1 c8 ?' y  a, A3 {3 w 8 p1 o: k; t9 d- p5 j5 `
    reg [7:0] add01;
7 _* ]" g( j- v3 k: H9 l    reg [7:0] add23;/ u' \, ^+ a. @; G3 Y% p

" w# }; q: l* M5 _3 A    always @(posedge clk or negedge rst_n) begin
/ |0 J" x% M8 F& ]/ i        if(!rst_n) begin* |6 C. h( ~4 m/ p
            mul_out <= 0;
: u% c0 g- v' w  E$ H" m- v            stored0 <= 0;- s. E0 y4 i  \2 D7 l) b6 P
            stored1 <= 0;
/ v: e% m/ h3 e: ]; @8 F3 n            stored2 <= 0;
, ]  J) r- J; ~4 F2 H  U            stored3 <= 0;
8 ^6 {- K5 I# g' t' H& g( ^+ S( `            add01 <= 0;  c; s+ O+ I. K
            add23 <= 0;0 G! A7 v2 B) D2 y  ]- P. V* x
        end
0 x% P! u  J6 i: ~3 K- G' D3 @  E* j        else begin. H( b' {1 u8 u; H# e: k, _4 H8 N
            stored0 <= mul_b[0]? {4'b0, mul_a} : 8'b0;
! v, v3 q! K  N3 y+ S            stored1 <= mul_b[1]? {3'b0, mul_a, 1'b0} : 8'b0;7 |1 F8 l6 q" p
            stored2 <= mul_b[2]? {2'b0, mul_a, 2'b0} : 8'b0;9 x  x( i3 U/ m& P
            stored3 <= mul_b[3]? {1'b0, mul_a, 3'b0} : 8'b0;  }. J; h7 Z3 I1 G

2 ^: T4 @! Y6 A0 Q" k. u# r& c' \            add01 <= stored1 + stored0;$ `6 }; y% V" R% ^  F  n2 m
            add23 <= stored3 + stored2;
) Q1 n1 b- H2 Y# o # d0 V1 G# x' t2 y
            mul_out <= add01 + add23;
  ?/ Y: `; u$ I  q; j* B) S; N& A        end, G$ ?8 `3 S1 W! B* _4 r
    end! R8 w7 E) a, S0 E& P
8 |- k5 d' l5 {+ Q' q9 C
endmodule
回复

使用道具 举报

发表于 2013-10-30 16:06 | 显示全部楼层
实话,看不懂,楼主厉害+ _2 k% u7 S5 Z' _: P! e
我以为是生产线上的流水线呢9 B3 g+ r+ R" k
佩服有技术的人
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-8-20 15:30 , Processed in 0.041617 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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