一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3977|回复: 5

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

[复制链接]
发表于 2013-10-30 13:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2013-10-30 13:28 编辑 1 C3 U5 ~1 Y- x0 _4 s6 G1 U

5 @) z6 }  G' K' x/ Q# [3 b
所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行。这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时间无关。这样,在理想的流水操作状态下,其运行效率很高。2 y) t. u; q  s. M4 O, r; d
  如果某个设计的处理流程分为若干步骤,而且整个数据处理是单流向的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以采用流水线设计方法来提高系统的工作频率。1 \0 a5 W' M- U3 {5 e4 d* B
  下面用8位全加器作为实例,分别列举了非流水线方法、2级流水线方法和4级流水线方法。
(1)非流水线实现方式
module adder_8bits(din_1, clk, cin, dout, din_2, cout);
1 }' Z, [: k, [2 j  F- P    input [7:0] din_1;
/ v4 ~9 y2 Y. l* S/ W" @9 [6 M    input clk;. D1 O  \# Q" z: F8 g
    input cin;" N; k3 [% W. a* K7 u
    output [7:0] dout;& V* W4 x9 g, Y- n% s, S) \# f3 F
    input [7:0] din_2;
: @+ U+ t: S! b    output cout;' N1 f  r3 a$ i& @2 k4 I1 ]
      
( E( ^6 Y% g( Z+ ^- }6 J. Z     reg [7:0] dout;5 p$ I& G; V5 ]" @2 N: F
     reg       cout;+ j- @9 z# N- _  U! J6 p# b/ {
      6 k6 A& c6 W: h( R% C
     always @(posedge clk) begin
# T0 _. j' J+ r" f1 c9 B0 k        {cout,dout} <= din_1 + din_2 + cin;
- \- _2 h7 d2 I# B$ _4 t" w7 P     end
' q. T- m( _7 J  t9 y) ^7 a( N
7 t0 W1 y( {& m' J2 p; r: Mendmodule' |4 W  A5 j$ E( l" [) b
 楼主| 发表于 2013-10-30 13:31 | 显示全部楼层
(2)2级流水线实现方式6 O8 [4 z: m/ H: O1 o3 N  R' p
module adder_4bits_2steps(cin_a, cin_b, cin, clk, cout, sum);' J: p: T" t# V  S1 v, `6 d
    input [7:0] cin_a;5 d" |/ e3 g8 q9 G
    input [7:0] cin_b;
7 J' a7 A" T. l, X. s  I    input cin;: j- ^# s3 f  E; z! H% w
    input clk;
& h9 Y) X  }) n) r3 |$ r    output cout;) g* K4 F3 O! j& \/ K+ h7 W5 h, l
    output [7:0] sum;
& H2 d- q; k2 p# {( `0 o1 |      
  Q4 Y4 v- \3 H' I     reg cout;
* e% T2 x8 u9 k1 [) w     reg cout_temp;
7 ?0 ?% ^3 |; B  u$ i     reg [7:0] sum;
: m3 s! J7 d6 Z5 Q% N     reg [3:0] sum_temp;
9 U9 t( c" O# t6 e  ?1 p) a      0 z" C6 z3 J2 @
     always @(posedge clk) begin. R+ d7 `. {# ~  I( v/ i0 V
        {cout_temp,sum_temp} = cin_a[3:0] + cin_b[3:0] + cin;6 }" z4 ~3 v' S* y* z
     end
4 l- E- S5 t* V      , c7 f6 [, L9 G/ }! L: A
     always @(posedge clk) begin& N4 T; _" l0 v" E2 T
        {cout,sum} = {{1'b0,cin_a[7:4]} + {1'b0,cin_b[7:4]} + cout_temp, sum_temp};" T1 l- W/ I( W/ W1 Z/ y
     end# K9 w# R: y. m4 [. @
endmodule
回复

使用道具 举报

 楼主| 发表于 2013-10-30 13:34 | 显示全部楼层
注意:这里在always块内只能用阻塞赋值方式,否则会出现逻辑上的错误!(3)4级流水线实现方式:
/ `' {: {( P% L8 n! S4 I; lmodule adder_8bits_4steps(cin_a, cin_b, c_in, clk, c_out, sum_out);& J; v9 H6 A$ H1 n6 {8 z4 y! M
    input [7:0] cin_a;
6 J) q& A8 [8 x: t/ S: l& Z( m    input [7:0] cin_b;
) u5 d) B7 X( K/ V3 ?# k2 G    input c_in;
" a7 W8 r4 j$ W: p    input clk;7 c6 c( O, y- X! p5 F; t/ e+ N+ p
    output c_out;5 O* C  W5 }; Z3 x# L; o
    output [7:0] sum_out;
5 m* A* K* l& b/ ~* G+ ?/ p      ) j( `9 M- ?3 o3 j6 t' V* i+ A
     reg c_out;5 {* l8 j) T# Q( L/ e7 e# W
     reg c_out_t1, c_out_t2, c_out_t3;
9 y" _9 N$ i+ n. N+ O, g5 {      ) l% r) I2 e  L" l( Y& a
     reg [7:0] sum_out;
+ J; J# R7 T: b- k) S+ {; x     reg [1:0] sum_out_t1;! y2 A/ a1 m; c8 L
     reg [3:0] sum_out_t2;9 `; c9 o) ~( j% k* p! [5 |' ]& }
     reg [5:0] sum_out_t3;9 N0 T& A4 N3 I6 J" `! I  `
      ! l5 C" L( L- G
     always @(posedge clk) begin
& x$ |! R2 S4 f/ `. Z! j        {c_out_t1, sum_out_t1} = {1'b0, cin_a[1:0]} + {1'b0, cin_b[1:0]} + c_in;
! b) I; c9 m/ Y8 V. H0 v9 X1 M     end
# z' }( R: k  m/ T: ]      
+ V4 G+ ^' E5 e; W1 l$ m     always @(posedge clk) begin
% }% G  v: U% |' F+ A4 ]        {c_out_t2, sum_out_t2} = {{1'b0, cin_a[3:2]} + {1'b0, cin_b[3:2]} + c_out_t1, sum_out_t1};
, c9 [  U' g  Q, j     end9 w2 V9 d0 `, j8 o2 Y: R, N
      6 q% s, y6 |& w: O3 |& J
     always @(posedge clk) begin
6 h. k5 J' `' x4 R        {c_out_t3, sum_out_t3} = {{1'b0, cin_a[5:4]} + {1'b0, cin_b[5:4]} + c_out_t2, sum_out_t2};
, d7 i: e$ A* C& i6 K" Q6 L     end
3 S1 J. h, s0 Y: B4 g- M      
& R, `! C0 r& d- H. ~3 `     always @(posedge clk) begin
) z9 q/ s5 `& j" O5 Q' Z4 c) V% {        {c_out, sum_out} = {{1'b0, cin_a[7:6]} + {1'b0, cin_b[7:6]} + c_out_t3, sum_out_t3};
# ]# d# z- |( G" t     end( L3 f. H: m" g! D
* d. k. J' o8 l

  j# \8 i# @& J5 c6 a& b. H% w0 _endmodule
: H6 \. i' g' P7 B- i9 L, S3 G5 g
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2013-10-30 15:11 | 显示全部楼层
流水线乘法
: O8 V8 m$ F# Q! \( C
. y) `9 B& m6 a% @) omodule multi_4bits_pipelining(mul_a, mul_b, clk, rst_n, mul_out);+ E- a  g% z8 K* p  R& u
     
' T! i2 B: T0 v" B- x% v    input [3:0] mul_a, mul_b;) o9 I) R- q* h
    input       clk;
1 u3 u( X2 F2 H' e3 H5 O    input       rst_n;
# U3 o$ z. D+ U* R, L$ U7 ~$ h. }    output [7:0] mul_out;* L" X% h: F( R4 W6 z4 I

2 a! ?1 q! F9 I& e% i6 l" M    reg [7:0] mul_out;
8 C( W6 A5 }/ Z, h* M
% Z6 @3 d" p5 {! Z    reg [7:0] stored0;
7 K7 ^; F. w: b3 B7 a7 p5 L; W    reg [7:0] stored1;. j8 o8 M" Z% K# q) s7 C: E0 q! Q
    reg [7:0] stored2;
6 B" c) i: \# _* n  h6 N! V    reg [7:0] stored3;; R$ C, i' v, G' L  O# O
& j/ K$ k- t5 \7 q
    reg [7:0] add01;
& m7 S& {" `6 h3 J! M6 ^    reg [7:0] add23;
' L: r$ b' v8 V( T # N; O% ~) Q: |" N& p/ w+ C% h
    always @(posedge clk or negedge rst_n) begin! Z: r- b4 ]6 [/ v* |0 b
        if(!rst_n) begin7 ^+ ]1 ?, z/ y2 F
            mul_out <= 0;' K: |% i. P& a7 l
            stored0 <= 0;: ?6 t- m, K' {9 W6 p" s
            stored1 <= 0;& _5 b- G/ |2 h% V
            stored2 <= 0;
0 y  k& E# ^$ I1 ~* K. F8 o4 Q            stored3 <= 0;
; J8 r7 f1 y9 J; p! ]9 p( S            add01 <= 0;
- V% B; ~( A  Y# q/ E            add23 <= 0;8 T5 _% c3 M" @9 Q" x
        end
% G; T4 a5 Q; ^# E, |) ]        else begin
& J9 I  ?  H7 }            stored0 <= mul_b[0]? {4'b0, mul_a} : 8'b0;
: J9 O0 J8 R( |4 Z            stored1 <= mul_b[1]? {3'b0, mul_a, 1'b0} : 8'b0;
" z+ e3 `& E# a% ^, I            stored2 <= mul_b[2]? {2'b0, mul_a, 2'b0} : 8'b0;2 M, Z: r- N! m" X
            stored3 <= mul_b[3]? {1'b0, mul_a, 3'b0} : 8'b0;3 t; J$ I  m6 A

8 @! ~2 x' d( `; J            add01 <= stored1 + stored0;
6 S( J3 c# r9 B            add23 <= stored3 + stored2;+ n: }- @9 ~" i& L6 m2 r

4 E5 H7 g6 m; I( h            mul_out <= add01 + add23;
( o+ Y! b* [& }* N; M  `2 V- u        end& `9 n- i. x, Z' A( R" k
    end* g% T. e; j5 s! T' r* q  v

1 e, D$ v4 `# ?" j* pendmodule
回复

使用道具 举报

发表于 2013-10-30 16:06 | 显示全部楼层
实话,看不懂,楼主厉害- A" V& k; S9 |3 ^
我以为是生产线上的流水线呢  H4 {6 n2 F- m  M5 J* J, R
佩服有技术的人
回复

使用道具 举报

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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