一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3641|回复: 5

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

[复制链接]
发表于 2013-10-30 13:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2013-10-30 13:28 编辑
& d& P/ A# l- c5 V  z- p! d; c1 M% ]! Y9 w8 r
所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行。这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时间无关。这样,在理想的流水操作状态下,其运行效率很高。
: z2 }7 F2 y1 d% d, p6 o  如果某个设计的处理流程分为若干步骤,而且整个数据处理是单流向的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以采用流水线设计方法来提高系统的工作频率。& `' T; L3 V' E( ^$ L
  下面用8位全加器作为实例,分别列举了非流水线方法、2级流水线方法和4级流水线方法。
(1)非流水线实现方式
module adder_8bits(din_1, clk, cin, dout, din_2, cout);  H$ s$ E: x, j$ _/ T/ I' x5 `6 }
    input [7:0] din_1;
2 l- }) z& L- N( }7 a7 r4 y4 d& C    input clk;- J7 K4 a5 \0 |0 l, Y
    input cin;
5 {* Z! ~3 E: i+ U3 x; z    output [7:0] dout;9 q; d8 `& U( g3 l; ?& h6 v
    input [7:0] din_2;: {: a' A  u5 h% ?
    output cout;. @+ F. ]. N$ Z( F6 p' h' }. R- d) z# A
      
! j' c# y# [& g8 `3 c( p     reg [7:0] dout;2 a! V5 x- p+ a' O: p0 i7 W
     reg       cout;
2 H" X- f& r8 O( [3 u      " Y+ H6 W; O" ^0 S" T, Z
     always @(posedge clk) begin4 G# \9 C5 v" R/ x) f
        {cout,dout} <= din_1 + din_2 + cin;8 U' @# a, Q, @5 d4 g
     end5 Z# X0 }5 [( A: q

/ O6 ~( s% K) ?endmodule. S& q! J, K+ M) a* O+ f& n
 楼主| 发表于 2013-10-30 13:31 | 显示全部楼层
(2)2级流水线实现方式
/ D6 T- f3 W( T# Wmodule adder_4bits_2steps(cin_a, cin_b, cin, clk, cout, sum);& d! t8 k& d9 C4 {
    input [7:0] cin_a;
5 n" F) ^/ H" _+ f    input [7:0] cin_b;
. V* P! c: p5 ~8 I6 {    input cin;
! i  I$ c7 M0 x5 M6 w( P4 l    input clk;+ H; s* j9 K& C$ x* U3 z! ~
    output cout;
4 o! g% t9 o$ W4 G: D    output [7:0] sum;7 j9 n5 n8 w6 t0 V* x
      
& A( g1 z' i0 ~# _5 }3 q5 j8 P1 o     reg cout;
# p5 {9 [# w% e6 h     reg cout_temp;
5 C" h- `7 M/ U, f+ b4 k0 r     reg [7:0] sum;
4 D; `0 @7 ~0 D, c! Z; A     reg [3:0] sum_temp;
$ b3 o* A; y9 Q      1 l4 m9 K- h8 l" i/ U
     always @(posedge clk) begin. `% L2 a' \$ T& h* S- R
        {cout_temp,sum_temp} = cin_a[3:0] + cin_b[3:0] + cin;
0 `9 M. G, y! z     end4 N9 L5 a+ N2 e& G4 K0 b4 F% p6 E! I; L
      * U) Z+ q) b8 d* {, x3 C
     always @(posedge clk) begin
1 z: o! K& r8 I& J$ Q        {cout,sum} = {{1'b0,cin_a[7:4]} + {1'b0,cin_b[7:4]} + cout_temp, sum_temp};
$ S( \9 a, e% i% U! I  I2 }& S0 k* |     end5 m* E' Y4 k+ K) e
endmodule
回复

使用道具 举报

 楼主| 发表于 2013-10-30 13:34 | 显示全部楼层
注意:这里在always块内只能用阻塞赋值方式,否则会出现逻辑上的错误!(3)4级流水线实现方式:
5 I, j; W5 y3 w5 S7 y) E; Rmodule adder_8bits_4steps(cin_a, cin_b, c_in, clk, c_out, sum_out);. E8 _9 _& k& ]/ s
    input [7:0] cin_a;8 n) n, K, a0 @3 w) C6 I% T" U
    input [7:0] cin_b;
: {  e; x& ?( o    input c_in;
! [% ~- T5 m: ~    input clk;0 }( s0 J  q8 T% f  I4 v. x
    output c_out;4 P" s: U, e) w% a0 V% E# R
    output [7:0] sum_out;2 ?3 r1 E' D! e: W# b' a- b0 G
      
# w: Z' h9 m1 h( o  y* }     reg c_out;. Q# i& Z6 g: e
     reg c_out_t1, c_out_t2, c_out_t3;
; m) F% k. z# N* Z$ _      ' J6 _  O  \- [6 ?
     reg [7:0] sum_out;- R# c4 s9 X: l$ `( }% z- |- _+ Z
     reg [1:0] sum_out_t1;2 ?: k% x6 ]  H( c
     reg [3:0] sum_out_t2;
# {, R4 Y0 \$ F  Z# m& B5 t4 \     reg [5:0] sum_out_t3;5 F9 U2 W. E9 z' Q4 w% m! h# p
      , D8 M) ^# Q) P6 b
     always @(posedge clk) begin; ^7 l' T8 R4 h7 N. ~& w
        {c_out_t1, sum_out_t1} = {1'b0, cin_a[1:0]} + {1'b0, cin_b[1:0]} + c_in;, I4 j* M1 d: a/ u( B. @
     end( o! U, X% q/ n! D
      + j% f6 b2 c, Z; z$ l/ c* r
     always @(posedge clk) begin7 @  @! I' O9 Q+ N; L4 a- ]. N
        {c_out_t2, sum_out_t2} = {{1'b0, cin_a[3:2]} + {1'b0, cin_b[3:2]} + c_out_t1, sum_out_t1};
4 e! l2 N1 a( z9 d* L; N     end
8 W" w* p8 q& o3 s      
6 b: {% ~, C6 |     always @(posedge clk) begin
* J8 |5 ^. V% D% d& @, `& w        {c_out_t3, sum_out_t3} = {{1'b0, cin_a[5:4]} + {1'b0, cin_b[5:4]} + c_out_t2, sum_out_t2};
4 B) ^; J7 o0 U; |9 d* r     end
0 h9 l, v. |5 ]. H* s. M7 b      ! ?( ?5 N( w# D" _# ?# j8 W
     always @(posedge clk) begin& H0 {! R4 }4 {
        {c_out, sum_out} = {{1'b0, cin_a[7:6]} + {1'b0, cin_b[7:6]} + c_out_t3, sum_out_t3};
6 ]) a; U0 C/ |% A4 h/ W  i     end  [2 X% }7 P# u% Y) k

" C8 [0 R% ~$ k( q2 u- h: E7 P, R; s7 }+ E7 [: \, f7 z- _
endmodule
: y+ [+ I) j5 K# }3 e0 Z" V7 {3 O- F) K( v0 ^$ c: X: v' z5 P
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2013-10-30 15:11 | 显示全部楼层
流水线乘法" p2 q) g' O$ @% z
" [: |0 O# s* C& M6 m5 X1 [
module multi_4bits_pipelining(mul_a, mul_b, clk, rst_n, mul_out);# \% S$ z; b9 ]0 ~, s) O
     5 f7 X0 J% _9 s& r4 S  }& H
    input [3:0] mul_a, mul_b;9 e4 c: C: _# i4 E* T  Z
    input       clk;
9 y5 Z  S9 F. w8 K" j    input       rst_n;3 w% N9 \6 C9 I. g: p4 P2 }
    output [7:0] mul_out;1 h) Y. S( l; d, F4 |  u

' h4 v6 z* x! N4 p2 V    reg [7:0] mul_out;, a" [! @- s! ]+ `
9 t3 m0 u% s, j8 d
    reg [7:0] stored0;7 ?3 B/ r  ~( D0 x9 F
    reg [7:0] stored1;
( `9 ?2 P  t, S; \; q    reg [7:0] stored2;, ~5 z' J5 d2 e! u0 F; y( C( J- k
    reg [7:0] stored3;
/ f) q4 E% _, w, Y. a ) l* g, T1 @1 {! C
    reg [7:0] add01;
  P# z- B. z2 Y. B/ P" [+ S7 Z# C) e    reg [7:0] add23;
% v+ n5 M0 S3 j$ w; \7 K9 u: [3 N* C , d+ D5 Y& v- {3 _: \. n0 Z
    always @(posedge clk or negedge rst_n) begin5 B! z' s9 R: Z+ J4 E$ K1 U
        if(!rst_n) begin- z1 R  j" O3 g$ m! c# ]' }
            mul_out <= 0;8 E# R1 h: O% ^8 W$ z) B+ ^
            stored0 <= 0;
* m: Y1 l8 W0 U5 E! k            stored1 <= 0;  T" \5 M" q( J. L4 z2 W6 P
            stored2 <= 0;  `' z6 H( [& d) F# \3 u6 C+ r  X
            stored3 <= 0;
, D; R0 d0 ?/ P+ e9 M            add01 <= 0;
9 M3 j% e/ x3 V+ x* ~' a            add23 <= 0;
" K: t, M; T  [- N+ e0 R* ^        end
# v! T4 Z# W7 A5 E4 _7 \* s        else begin8 o+ M5 c( ~: H. O- y
            stored0 <= mul_b[0]? {4'b0, mul_a} : 8'b0;
: K  Q9 w' |1 K8 \            stored1 <= mul_b[1]? {3'b0, mul_a, 1'b0} : 8'b0;' h* D/ E' v  c1 K2 c2 o
            stored2 <= mul_b[2]? {2'b0, mul_a, 2'b0} : 8'b0;
8 L. f* K# q# [6 ^1 D1 ]            stored3 <= mul_b[3]? {1'b0, mul_a, 3'b0} : 8'b0;$ s/ T8 @7 U% b5 e
, v$ `, Q  P/ v# n7 l6 a# Q. K$ s
            add01 <= stored1 + stored0;% V$ t# o3 n. r
            add23 <= stored3 + stored2;- N( ?' D# @' b
4 s3 \' o$ _( I; u
            mul_out <= add01 + add23;
1 q2 F5 Z- y. j/ c        end4 a, U$ p1 p3 Z0 s
    end
+ i1 f8 h5 ^+ `+ _ ' ?. A' ?6 P, }
endmodule
回复

使用道具 举报

发表于 2013-10-30 16:06 | 显示全部楼层
实话,看不懂,楼主厉害
7 u4 z6 ]: ], S4 }我以为是生产线上的流水线呢
9 k, w$ ~2 C5 t% `& {佩服有技术的人
回复

使用道具 举报

本版积分规则

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

GMT+8, 2025-8-20 15:42 , Processed in 0.038130 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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