一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4095|回复: 5

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

[复制链接]
发表于 2013-10-30 13:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2013-10-30 13:28 编辑 $ C7 P1 B9 y) P& Y; f

  p- e" j/ @2 g& i0 @4 y
所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行。这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时间无关。这样,在理想的流水操作状态下,其运行效率很高。9 y  J3 N  e( ]0 r$ i
  如果某个设计的处理流程分为若干步骤,而且整个数据处理是单流向的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以采用流水线设计方法来提高系统的工作频率。9 S. Z% v6 i1 r1 }/ m; M1 y  n
  下面用8位全加器作为实例,分别列举了非流水线方法、2级流水线方法和4级流水线方法。
(1)非流水线实现方式
module adder_8bits(din_1, clk, cin, dout, din_2, cout);, W: N" ^6 C4 o1 f% @$ n% n( Q2 _
    input [7:0] din_1;  G) R( m5 p, y6 _! J% r
    input clk;
" E5 H/ P- @' M5 x) |# `$ t9 L    input cin;3 Q6 n3 H% S* m4 P" S& K, L: J
    output [7:0] dout;
$ ]( d9 l$ a$ M3 K    input [7:0] din_2;
9 {8 J% L0 H' q    output cout;/ ^' n5 i) F) Z5 |# B; A' O) h
      5 T' v& L" B" c9 D/ e
     reg [7:0] dout;
0 k  ~* `& g+ ?$ T' H7 c" [2 D* W6 n5 g& z     reg       cout;) W0 e7 B# W4 r( H
      
* v' l0 h; m4 r" Y- m, `' f     always @(posedge clk) begin
1 Y$ N+ e/ c( o* U9 i( g1 l! O# D        {cout,dout} <= din_1 + din_2 + cin;
# w% ~8 U6 J- I) I8 B6 {     end
! i0 a3 B, i/ {' l. G
' D8 x" B/ p9 d5 b7 V1 K7 `endmodule
2 \* p  g! v5 u2 f" D1 K" t
 楼主| 发表于 2013-10-30 13:31 | 显示全部楼层
(2)2级流水线实现方式
; [$ ?0 I1 o7 {# m, ~module adder_4bits_2steps(cin_a, cin_b, cin, clk, cout, sum);
4 ^4 U3 A, X% H4 V2 F    input [7:0] cin_a;
9 J( ?- t. h- z, G    input [7:0] cin_b;
1 _8 i( g+ t8 X* t" `    input cin;% k- x& X9 i5 h* y0 Y, e! }
    input clk;
( N. P/ r  l! e- {% d' j    output cout;
0 E. c2 v) M! r# o# n8 J5 c& a    output [7:0] sum;
7 q, b3 _7 f% T" f! q6 N; p      
8 h4 }! D/ ?: T  t0 i, c, b     reg cout;! L3 m) P: n2 o! Y7 f0 \
     reg cout_temp;
  P2 B$ O) b) D' u; I     reg [7:0] sum;/ @4 n) z- [+ V
     reg [3:0] sum_temp;' l# Q$ B. v+ D6 y8 T
      5 c9 O6 ~+ z& g7 i
     always @(posedge clk) begin" {5 m- g/ `: |6 |' W) U
        {cout_temp,sum_temp} = cin_a[3:0] + cin_b[3:0] + cin;( g) d# ^6 a& b& ]
     end
9 L$ Y2 O8 t4 N9 p, |( P* Q      2 i9 x7 v  r) T* d5 [  S# v) |) _8 R
     always @(posedge clk) begin
' L% Q" e. g% z' N; [) ]- V6 @/ m0 V        {cout,sum} = {{1'b0,cin_a[7:4]} + {1'b0,cin_b[7:4]} + cout_temp, sum_temp};
6 P3 h% \3 Z8 [+ M1 n, T     end
4 v) S, S1 {3 b3 nendmodule
回复

使用道具 举报

 楼主| 发表于 2013-10-30 13:34 | 显示全部楼层
注意:这里在always块内只能用阻塞赋值方式,否则会出现逻辑上的错误!(3)4级流水线实现方式:
1 J4 Z9 U* H1 p/ B( g7 Z+ b9 smodule adder_8bits_4steps(cin_a, cin_b, c_in, clk, c_out, sum_out);
9 B/ o% d) x5 W7 M- ]7 F# N    input [7:0] cin_a;; ]8 ~* D4 A  ^4 V+ \; a
    input [7:0] cin_b;
- G9 k1 C$ m: b6 J& e& h( ]% W    input c_in;
8 [7 K# A7 R* L  m* d; [    input clk;& b0 e; j( c0 }! ?& O  B- j$ @
    output c_out;" w5 L; T3 k4 f2 x. m
    output [7:0] sum_out;: _7 f' {" D2 y8 W2 r
      
: h+ t' I8 b& U     reg c_out;
; A" }0 A. H2 h, P) N6 m     reg c_out_t1, c_out_t2, c_out_t3;
  P. y1 p- T- @% F* y# J  U3 m: K$ S      
) e" @* M5 \; Z/ e& n( R; Q# H     reg [7:0] sum_out;3 w0 S" ~; A, g) j+ z% l5 o  Z$ S8 f/ B) J
     reg [1:0] sum_out_t1;
1 P5 s& h" _* y, ]     reg [3:0] sum_out_t2;
2 ?/ t5 ^% o7 q. R9 m$ s( r     reg [5:0] sum_out_t3;
! C, v* J4 e6 {8 k      
/ k/ D1 P5 y  R- Z4 R( w# ^4 [8 L0 y  H     always @(posedge clk) begin% j. O& ]2 s; l* a5 k
        {c_out_t1, sum_out_t1} = {1'b0, cin_a[1:0]} + {1'b0, cin_b[1:0]} + c_in;9 a' i2 c2 l. }/ I( \' `
     end1 r! F. l! B) I. U7 j% \( V
      
) s8 e3 Y" P; Z( @; D: q# W     always @(posedge clk) begin
8 M1 T4 R. O, i% ^        {c_out_t2, sum_out_t2} = {{1'b0, cin_a[3:2]} + {1'b0, cin_b[3:2]} + c_out_t1, sum_out_t1};& c3 ^2 R- O' r. P
     end
1 c2 E! N$ K; C: E3 }      , g) U/ F* C3 D4 b+ A
     always @(posedge clk) begin
3 r6 ^0 K/ c  i3 |7 r8 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};$ C9 n3 }- J4 [; I+ u% Q
     end0 x: F! E. o( u; q1 P
      
1 G9 t/ n5 j; L3 G; h* z2 A     always @(posedge clk) begin
  M0 a6 w7 C- O$ _        {c_out, sum_out} = {{1'b0, cin_a[7:6]} + {1'b0, cin_b[7:6]} + c_out_t3, sum_out_t3};4 i9 f4 I! u0 a  R- _
     end
$ l8 t3 z) D- ^8 Z
& }4 X6 ^) n9 K" q) O4 R; L2 N5 x8 k# i' i4 M
endmodule
; [% r+ p4 U! ?1 i+ e) X/ y* L/ Q5 X
! D$ H! u) T& m" y4 z( `
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2013-10-30 15:11 | 显示全部楼层
流水线乘法
/ j! ^4 ?1 y- Z. \. k# R
8 d7 R4 Q5 h" \/ z) B. l7 A% m5 M7 S& nmodule multi_4bits_pipelining(mul_a, mul_b, clk, rst_n, mul_out);# r7 k" N8 c) R# l; _0 m
     9 d. Q  T- A  w6 G3 W, y; O9 k$ o
    input [3:0] mul_a, mul_b;3 R# C. k) ]9 |! \3 Q
    input       clk;
. e' r6 [& D& E9 Y) ^/ y, G    input       rst_n;
$ P6 T+ A' C7 Z- ^- t; O6 X    output [7:0] mul_out;
: p7 [+ [2 y% `( z$ k8 r: O( q; Q
; Y7 \, f& a# V  G9 w( v% h  z    reg [7:0] mul_out;5 ]0 v* ^/ k, Z8 v' C
" ]9 O1 g/ K: \' X
    reg [7:0] stored0;% G; b  z% y# q3 {$ H0 W( w
    reg [7:0] stored1;7 j" i* f4 }! {! G2 U( N) t) }
    reg [7:0] stored2;% z# ]2 C# H5 _- ~. j
    reg [7:0] stored3;: ?+ Q: f/ Y; m& r8 U- a' J/ g0 i8 j

9 B( L+ X: r; v% r  S- Y1 O; U' X) p    reg [7:0] add01;+ C4 r- H) x% T8 T0 {* Z
    reg [7:0] add23;
# e( Y  H/ l( v- B/ T! a' `
6 N  [* @# x2 D2 v8 x    always @(posedge clk or negedge rst_n) begin
& o2 O+ [3 X1 @2 W& b        if(!rst_n) begin
3 E$ a' _0 i* a- w            mul_out <= 0;. h& @  A; Q3 j: w( {$ ~
            stored0 <= 0;$ _% I3 v0 ^! a! @5 j2 C
            stored1 <= 0;
3 Y2 K' ~( k; ?; D; ~( B: {1 |+ A9 [            stored2 <= 0;6 s3 z+ c3 C1 @# y4 l' J- S
            stored3 <= 0;6 ^, [9 u8 o7 C0 s1 A8 |
            add01 <= 0;8 |* q) ^2 A7 m3 _
            add23 <= 0;8 M# l! s8 [. J! d
        end& t$ D3 V$ ]7 g1 G. k& J! W7 k
        else begin
  I" U6 w! y6 \) s            stored0 <= mul_b[0]? {4'b0, mul_a} : 8'b0;# e6 t* c2 D( l% Z
            stored1 <= mul_b[1]? {3'b0, mul_a, 1'b0} : 8'b0;# a/ I/ z/ k# G9 Q
            stored2 <= mul_b[2]? {2'b0, mul_a, 2'b0} : 8'b0;, E! c% L" \# C( G2 s9 I
            stored3 <= mul_b[3]? {1'b0, mul_a, 3'b0} : 8'b0;
2 a' N4 y/ ?4 |" M1 G+ Z. H' [2 h * Z  n. T+ N  p
            add01 <= stored1 + stored0;
- a7 G5 v9 P5 e! B8 T- d            add23 <= stored3 + stored2;% h+ b- C  w4 z2 W% ^
! {5 g- `4 {  L& {! Z9 H* n; O
            mul_out <= add01 + add23;
" P/ q5 B* [$ n0 p        end
2 B' v1 ?0 s1 J' i    end
  [& C, A# m* G; Z ( M1 O8 U2 o6 i) s
endmodule
回复

使用道具 举报

发表于 2013-10-30 16:06 | 显示全部楼层
实话,看不懂,楼主厉害
# v( M3 I, T5 l6 F+ J: @5 I我以为是生产线上的流水线呢; y% v. [9 b$ c1 i* f! {4 U
佩服有技术的人
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-4-21 16:08 , Processed in 0.032268 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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