一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3766|回复: 5

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

[复制链接]
发表于 2013-10-30 13:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2013-10-30 13:28 编辑 * Q/ e) Z; u' H2 g  T& a

1 I/ x0 i. q  P
所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行。这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时间无关。这样,在理想的流水操作状态下,其运行效率很高。
5 j5 l9 A8 s: U, f  如果某个设计的处理流程分为若干步骤,而且整个数据处理是单流向的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以采用流水线设计方法来提高系统的工作频率。' Z$ s0 \4 Q. E) K8 _1 y
  下面用8位全加器作为实例,分别列举了非流水线方法、2级流水线方法和4级流水线方法。
(1)非流水线实现方式
module adder_8bits(din_1, clk, cin, dout, din_2, cout);
/ u+ G0 U/ E+ l7 E( ^    input [7:0] din_1;: M2 u$ }& @4 t: e/ U! b( f
    input clk;
9 ?1 K! M5 }$ t. c( I  T8 r+ ~    input cin;" q/ `6 `9 L7 m1 d% ^2 z
    output [7:0] dout;- Y' \% f. Q% p0 H2 c
    input [7:0] din_2;1 ]1 K3 f& {/ E& U9 f
    output cout;
& K+ K8 ]- Q' w- _7 R7 _      
1 e% `! p& {' Y1 f7 V     reg [7:0] dout;
& `( J3 \. B$ {/ `% A0 ?     reg       cout;
1 R! T& _# K( W7 }/ E, M# T' l& W      ( f4 [% x0 m+ E. I3 I) D
     always @(posedge clk) begin
0 a5 f9 t" n( m$ e2 ~+ c  x5 o        {cout,dout} <= din_1 + din_2 + cin;: Z9 z/ N* S, n
     end8 l: s. D' L* A) r) V: }8 h

3 ]( q# r, f' a( D8 M; k* fendmodule+ z. {# z2 y  p3 D; u% {0 w
 楼主| 发表于 2013-10-30 13:31 | 显示全部楼层
(2)2级流水线实现方式
- I' Y: ~: }1 ?0 M" }8 P' Vmodule adder_4bits_2steps(cin_a, cin_b, cin, clk, cout, sum);# V5 A  y6 \* e- W) R
    input [7:0] cin_a;
% i2 F- \5 w* ~4 b4 M( y    input [7:0] cin_b;; a0 C5 s- E- W" E1 i
    input cin;, H0 w# R/ e5 K6 R, F. A! l
    input clk;, ~1 [+ _% ^; w4 m7 C+ ?
    output cout;
. ?+ @* ]  ^8 I# ?    output [7:0] sum;
  t; Z. ?+ E; o$ N: f! Z# E      ( u- P# d/ v, ~% _2 v
     reg cout;
  G$ H# v: ~5 Q* K% L  T8 `     reg cout_temp;3 @$ w$ c3 S3 c: F# p  o, o0 v' {- [$ u
     reg [7:0] sum;
8 ~+ B3 D+ B0 S$ @     reg [3:0] sum_temp;) e1 ?' N. l1 E$ \+ X% \
      
1 l( K: w% x; S* O0 d4 z     always @(posedge clk) begin6 |3 d8 u! p. a+ |9 x. e
        {cout_temp,sum_temp} = cin_a[3:0] + cin_b[3:0] + cin;5 i4 V: h* M0 o5 L1 }, i
     end
5 J2 Y- G' b. C9 `      8 @( i7 I6 y  N; B; s
     always @(posedge clk) begin# q9 k3 u. E& i$ Z" Q9 ~) S
        {cout,sum} = {{1'b0,cin_a[7:4]} + {1'b0,cin_b[7:4]} + cout_temp, sum_temp};" b% e, O$ [. [+ x+ P7 q
     end: U0 X' t  b+ _! m
endmodule
回复

使用道具 举报

 楼主| 发表于 2013-10-30 13:34 | 显示全部楼层
注意:这里在always块内只能用阻塞赋值方式,否则会出现逻辑上的错误!(3)4级流水线实现方式:
& h+ A; j5 ^% Y. A0 pmodule adder_8bits_4steps(cin_a, cin_b, c_in, clk, c_out, sum_out);4 ]# t; v  g$ S
    input [7:0] cin_a;4 c5 ^0 |1 v& o, ?2 k
    input [7:0] cin_b;6 w) n* r' J3 r3 \: E: _  }
    input c_in;
' I6 Y- a4 G: B$ e    input clk;( n- g  ?# }) ?9 T! ^7 Z( ?
    output c_out;
/ Q( H8 ]% v6 X; m$ }1 p4 q0 I    output [7:0] sum_out;
7 o: T3 E4 ]$ b* m9 W& `, ]5 G9 N      
, }$ h" A" y' O/ R- ~4 s     reg c_out;) l+ `" t( i( T+ Z2 d3 F' I2 A
     reg c_out_t1, c_out_t2, c_out_t3;! j$ s) }$ d* v" x& A% _
      
; \/ Z* H# M! [; e% S- N     reg [7:0] sum_out;( d; K( y& t: B- z
     reg [1:0] sum_out_t1;
- y* F5 ^7 k2 x4 ?1 R     reg [3:0] sum_out_t2;" i% @7 s0 \( p/ ~7 |
     reg [5:0] sum_out_t3;- `; D" q" N5 ?) E' X( I  E
      5 r  x# ]0 f" ^4 I, z# D, }% S0 j
     always @(posedge clk) begin% z3 {$ a7 x1 T/ {
        {c_out_t1, sum_out_t1} = {1'b0, cin_a[1:0]} + {1'b0, cin_b[1:0]} + c_in;
  i- J5 V# R; X# A+ {     end
4 L( M" p3 F9 D- V( Y6 z* P4 {4 G      
$ Z4 v3 k2 M* S1 p% E0 Q" Y" E     always @(posedge clk) begin1 j# D$ [* N% y3 u/ X
        {c_out_t2, sum_out_t2} = {{1'b0, cin_a[3:2]} + {1'b0, cin_b[3:2]} + c_out_t1, sum_out_t1};9 Z+ m; `" J" E0 ~9 t' \
     end
4 `$ C' M. r: g& g- M  G  b3 l$ X      - @: M) G2 k; e; q
     always @(posedge clk) begin
; t0 M  w/ B' R- Y* n        {c_out_t3, sum_out_t3} = {{1'b0, cin_a[5:4]} + {1'b0, cin_b[5:4]} + c_out_t2, sum_out_t2};: |2 I" N' l* u* P) o" c: V& u
     end: Q3 g$ D1 y' w& u
      ) n* l4 ~1 M& r+ v: y0 Q
     always @(posedge clk) begin, M5 B+ R+ H) B& T, C' g) G* E5 \7 g
        {c_out, sum_out} = {{1'b0, cin_a[7:6]} + {1'b0, cin_b[7:6]} + c_out_t3, sum_out_t3};+ ~# _# M: G( w' u2 O% k
     end
  ?6 {4 A$ D4 ^5 o
/ M0 E5 t- j) e' V; c8 h% k' p
+ Z7 u" @6 i+ u- \) ?8 D! t$ Oendmodule
* I$ g5 K9 Y0 \# v+ C1 T# d! d5 r% ~4 y2 x8 ]
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2013-10-30 15:11 | 显示全部楼层
流水线乘法, Y( _& m8 V7 T! R# R* a

' |/ j3 Z$ t/ D: @+ }3 ~module multi_4bits_pipelining(mul_a, mul_b, clk, rst_n, mul_out);7 b, F1 q6 W  k/ N( `; U* `3 r
     
8 r$ `6 o1 f4 L/ }    input [3:0] mul_a, mul_b;
: {5 _$ W4 N0 k' `/ z9 m    input       clk;- @2 Q4 r, Z; x$ V0 S: T
    input       rst_n;
. Y6 I' ?( o6 D. H8 R4 k# q    output [7:0] mul_out;0 n5 x2 `- Z6 M! g# z! [% ^

: t5 ~+ E  R+ [4 j    reg [7:0] mul_out;9 y% m' k9 ?  O+ p. Z

1 }3 U4 C4 O+ O  y5 Q) O6 X( I    reg [7:0] stored0;
4 p2 M6 l" j/ {* j1 x! [* W    reg [7:0] stored1;
: k% n, k* i# v8 k& x    reg [7:0] stored2;3 n  M" M: y0 V' j. ~' e, A& \
    reg [7:0] stored3;3 d2 t$ }+ n" s! V, q
; E6 o% D/ a8 ~8 r1 J
    reg [7:0] add01;
, H6 F( O5 I8 a7 o8 }. `9 Z    reg [7:0] add23;
$ f  B: z. E6 W9 r ! P9 U2 k& L1 I. H/ K
    always @(posedge clk or negedge rst_n) begin
' s" T; t$ x& u6 O        if(!rst_n) begin
7 ~$ {# C! Z( J" S' K            mul_out <= 0;
) I, }( I) z5 h  z6 s& r& H            stored0 <= 0;
2 }9 m, {2 W2 W' u7 G            stored1 <= 0;+ t. T3 [% A' b2 Y) `+ P
            stored2 <= 0;
% L& F4 d1 L- i* P4 d: r            stored3 <= 0;9 ]0 D' n) e/ x, `6 d/ P* X
            add01 <= 0;' P, m' K: s1 q7 f/ N7 [
            add23 <= 0;( {9 s% q# L3 p' c9 k6 v
        end- U5 S5 _6 t0 ~2 J* E1 q
        else begin
: S( w& W3 E. n: \% a            stored0 <= mul_b[0]? {4'b0, mul_a} : 8'b0;% B( s5 D* L/ N( W4 {% k
            stored1 <= mul_b[1]? {3'b0, mul_a, 1'b0} : 8'b0;1 Z. V6 i+ E% a9 A" V1 k% v; n6 P' O% s
            stored2 <= mul_b[2]? {2'b0, mul_a, 2'b0} : 8'b0;
! A" v* f8 l* D! W; n# {            stored3 <= mul_b[3]? {1'b0, mul_a, 3'b0} : 8'b0;
9 Y  f; R& [+ \% O5 Z/ l" {, m 3 o5 h2 V+ f$ `$ N4 P7 p& s  c
            add01 <= stored1 + stored0;& s5 o' s7 D2 L
            add23 <= stored3 + stored2;
8 R3 Q8 e' M$ P, N2 z" {1 X & c/ i$ O/ e: i( }. E% K
            mul_out <= add01 + add23;# O6 V& W" S/ I; l
        end3 D! b1 v' q8 a
    end
6 w3 b* |& M4 j+ w! p& S5 @
. N/ Z1 k7 Y' g) h# O3 [endmodule
回复

使用道具 举报

发表于 2013-10-30 16:06 | 显示全部楼层
实话,看不懂,楼主厉害
7 R# f9 n5 Z$ t$ q, o: a. m' Y我以为是生产线上的流水线呢
3 _7 x$ n" S0 P0 [+ x佩服有技术的人
回复

使用道具 举报

本版积分规则

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

GMT+8, 2025-10-28 01:03 , Processed in 0.032303 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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