一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3976|回复: 5

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

[复制链接]
发表于 2013-10-30 13:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2013-10-30 13:28 编辑 1 o( H( Q, M# H2 x( J- Y& d

/ \' M! r% ]& {9 \  }
所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行。这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时间无关。这样,在理想的流水操作状态下,其运行效率很高。
, ^( }7 L. H2 ^/ g3 m" L8 w  如果某个设计的处理流程分为若干步骤,而且整个数据处理是单流向的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以采用流水线设计方法来提高系统的工作频率。
8 ]0 N; Z" x% \- L5 @6 Q, k$ V  下面用8位全加器作为实例,分别列举了非流水线方法、2级流水线方法和4级流水线方法。
(1)非流水线实现方式
module adder_8bits(din_1, clk, cin, dout, din_2, cout);
+ I3 `; |3 R5 e; N; A% j    input [7:0] din_1;* {: f2 h& [' E: |( q( y  Q7 |
    input clk;$ P( C0 d0 Y+ Y, v
    input cin;
$ w( p2 m, H2 y5 [    output [7:0] dout;
: K# @7 j3 C( M1 l. L. j    input [7:0] din_2;% T& s" f3 T2 K  H/ u. n- D' {# C- n
    output cout;
; l1 O4 R2 N, G. \* E      / h, K7 I  q+ C7 S  D6 Y1 H0 N  |
     reg [7:0] dout;
. d; j. f8 a2 F     reg       cout;
5 c6 _) `, g1 |. R      6 ^# R0 m7 b# `+ _5 C
     always @(posedge clk) begin' Q; ^6 P8 Q  O6 j) }3 g
        {cout,dout} <= din_1 + din_2 + cin;
: R1 D! [+ ^: v0 X/ n7 V" P     end
; V4 ?: I1 C; m7 o8 E! s- A$ P9 O9 ~+ {. w
endmodule% a, a) M4 z8 p- j7 P
 楼主| 发表于 2013-10-30 13:31 | 显示全部楼层
(2)2级流水线实现方式, S$ }: Y" i/ }: J
module adder_4bits_2steps(cin_a, cin_b, cin, clk, cout, sum);
) l! j; U- h) f- V! s) U  H    input [7:0] cin_a;
, y( `1 h+ I9 r& X, h0 B5 ~0 B    input [7:0] cin_b;
9 c  Q& `9 R  M1 `7 m    input cin;
% a2 a7 I- \& K1 D) P6 G5 E3 ^    input clk;
: b2 |$ M' _* V    output cout;
9 T7 G: C3 @% t$ v, T& L: F3 O    output [7:0] sum;; Y( S8 H9 G$ Y: p" M; P, g
      
3 X3 X! Q3 t4 U% M     reg cout;. x7 y! b" n1 n7 W) B6 l7 I
     reg cout_temp;& }; r9 F; m6 j, X
     reg [7:0] sum;1 u5 W9 o7 s, O& N2 H* J# d0 @
     reg [3:0] sum_temp;
0 i+ P5 A* _6 d+ [0 ~& E. ]' ^9 ]      $ M3 i) C; `" n; T) p8 x4 p4 I
     always @(posedge clk) begin
+ v' q$ `2 g4 Z2 A: f; j        {cout_temp,sum_temp} = cin_a[3:0] + cin_b[3:0] + cin;
# _7 X* @0 m* X1 {6 W2 Q5 S     end& C( `9 j$ Z  J0 t$ V9 P
      / y( Y/ {$ J0 p  p! |: C% w
     always @(posedge clk) begin7 @9 \+ `8 ]' ^! y/ y) q
        {cout,sum} = {{1'b0,cin_a[7:4]} + {1'b0,cin_b[7:4]} + cout_temp, sum_temp};
: S( @# _2 z$ r0 D/ D) W     end% V9 [7 ~5 n6 j  t4 a$ D1 W+ U( c
endmodule
回复

使用道具 举报

 楼主| 发表于 2013-10-30 13:34 | 显示全部楼层
注意:这里在always块内只能用阻塞赋值方式,否则会出现逻辑上的错误!(3)4级流水线实现方式:
3 u' E9 e$ l- ~. p. D6 Gmodule adder_8bits_4steps(cin_a, cin_b, c_in, clk, c_out, sum_out);
3 z. M0 H8 D' R; y' U( X7 r# X    input [7:0] cin_a;
  E. o- }% I: F; [, Z5 s    input [7:0] cin_b;, G( p& N+ N/ N% K
    input c_in;
/ x1 F- b/ {& r! V. Y+ `, Q    input clk;
7 P3 l6 @% k; t1 Z    output c_out;. a- o: j) ?6 Z6 @; b; q# C0 B4 b
    output [7:0] sum_out;2 b. f  `: C: ?( O, z0 B  k9 Z
      
! x" u( [0 B6 Q3 _     reg c_out;& q, I5 i: W' s7 {" g8 E9 i
     reg c_out_t1, c_out_t2, c_out_t3;
" Y3 v. o$ h4 ], E6 k      
  W2 B# h  [/ \6 L6 W     reg [7:0] sum_out;# v$ V/ J+ W" Q( W1 H7 {7 E: M
     reg [1:0] sum_out_t1;4 o& D/ X. N5 O4 P" N; m- }
     reg [3:0] sum_out_t2;
) G& w/ U8 g2 v5 a. \; a2 n' }) ^% A     reg [5:0] sum_out_t3;- v1 K' e! o* e8 J6 |
      ) \7 ]% n8 w  Q* S9 i
     always @(posedge clk) begin
* [! N, P% y; |" E1 K0 c1 `* @        {c_out_t1, sum_out_t1} = {1'b0, cin_a[1:0]} + {1'b0, cin_b[1:0]} + c_in;
& n) k$ x/ X" G; H0 p' o     end$ F. s5 T( Q" d1 [+ }0 s2 A
      
6 S) O" c: t- m! g     always @(posedge clk) begin7 e1 R5 e; a6 R3 B
        {c_out_t2, sum_out_t2} = {{1'b0, cin_a[3:2]} + {1'b0, cin_b[3:2]} + c_out_t1, sum_out_t1};
* ?0 g; D( I) S     end# n; O: ]6 {5 A
      4 B  Z4 B1 g0 ]9 Y$ B, ~
     always @(posedge clk) begin
. T: m6 j  X6 S8 G5 m  ]  C        {c_out_t3, sum_out_t3} = {{1'b0, cin_a[5:4]} + {1'b0, cin_b[5:4]} + c_out_t2, sum_out_t2};) ]; H( B7 s5 B( K6 O9 y
     end2 ^1 u- O8 G6 G7 l0 T  I4 U
      
7 t" N! n* |, `* @  g' f     always @(posedge clk) begin
) o' C3 W0 @/ e7 S0 x, W$ J  n        {c_out, sum_out} = {{1'b0, cin_a[7:6]} + {1'b0, cin_b[7:6]} + c_out_t3, sum_out_t3};9 a3 h1 x: y/ |8 ~
     end
( W4 X5 _5 J$ V7 g4 H' B1 A6 F9 ~3 I* Z1 h
; U+ }+ E! Y; p9 A6 P2 A
endmodule
. ?3 w. Q. A+ E5 K8 b* a% R0 X, C, m/ o/ W, [$ J6 o" h
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2013-10-30 15:11 | 显示全部楼层
流水线乘法
, P1 e/ \: A. w; V* U9 A
4 p+ x7 a# W. Jmodule multi_4bits_pipelining(mul_a, mul_b, clk, rst_n, mul_out);
9 W5 R6 @; w+ H0 y     7 E# S" P- n0 N- f0 Q& c
    input [3:0] mul_a, mul_b;$ T4 _" J- B7 u4 e* {* G7 [
    input       clk;" W' G* M1 S' F/ s2 @6 ]
    input       rst_n;& L) m2 `/ m  u  P1 s  A& O
    output [7:0] mul_out;( P+ I* B9 Y; y. f, B. F6 o

& w+ U  B7 @' m3 u/ o    reg [7:0] mul_out;
6 t5 [0 n5 H8 ^0 ~) W1 y( Y! z   p: X  @' }5 z
    reg [7:0] stored0;
/ m' M* _3 K9 j    reg [7:0] stored1;9 W: W, J" ]' ?- C6 \
    reg [7:0] stored2;: V8 g, E4 E  ^3 P% i
    reg [7:0] stored3;. J5 n% j  {4 [" N3 Z

$ B1 j8 k0 @1 B3 A    reg [7:0] add01;
4 ~2 s6 c* Q; p' C" R) y    reg [7:0] add23;
4 D& ^5 @4 ~3 c
! }& L2 f# r( |7 }    always @(posedge clk or negedge rst_n) begin
. k' J% [# h( a9 a+ K- h        if(!rst_n) begin
# ^# U+ Z& q: `& T$ D2 j            mul_out <= 0;
( ~4 ~* R/ d7 e- e            stored0 <= 0;
8 z0 s0 a; V% }            stored1 <= 0;
1 |1 n- m6 b) }/ u# c8 X) R) [) F            stored2 <= 0;
, {" Z+ Y& S% X& @; q; I            stored3 <= 0;9 D. M/ o% ^3 e5 X& `- p
            add01 <= 0;7 B) I8 K; g& B( F' @% v
            add23 <= 0;+ \8 L6 E; ~1 n, e( g  |. b
        end
' {3 M5 O- L$ ~: c( N3 _/ \        else begin( o5 l# J5 B! r1 Q. d! \' w$ `# k" q* Z
            stored0 <= mul_b[0]? {4'b0, mul_a} : 8'b0;& ?. {2 |' \+ ]- N% M$ P
            stored1 <= mul_b[1]? {3'b0, mul_a, 1'b0} : 8'b0;, O6 f$ g8 l9 `' }7 d$ x8 F1 J$ z
            stored2 <= mul_b[2]? {2'b0, mul_a, 2'b0} : 8'b0;# l  y  D$ k) J! C
            stored3 <= mul_b[3]? {1'b0, mul_a, 3'b0} : 8'b0;
) Z/ D) I# D7 a& W$ ~- H
( b5 d- h0 ?. }% J  @" G2 C% {3 _            add01 <= stored1 + stored0;5 v) H; D3 ~  _1 t+ r& p' \
            add23 <= stored3 + stored2;
4 r& z2 t( t  r  g& Y/ n+ ~ / u# Z& p# C% @2 [- p+ ]2 d
            mul_out <= add01 + add23;
1 o& T8 U. v3 z; j& p        end- ?2 n1 S3 y- @! m" S* E
    end
6 }8 W! U& Q# ~' D7 x3 g8 ? 1 Y  X+ _- x; m% C  L
endmodule
回复

使用道具 举报

发表于 2013-10-30 16:06 | 显示全部楼层
实话,看不懂,楼主厉害  a$ S# {; `* |+ H; L, e
我以为是生产线上的流水线呢3 ?7 y6 d, c- u" A7 U2 y
佩服有技术的人
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-2-25 15:06 , Processed in 0.031850 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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