一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3765|回复: 5

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

[复制链接]
发表于 2013-10-30 13:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2013-10-30 13:28 编辑 * P; M1 n0 R8 E" G" i9 D

& A" w; @& m4 l
所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行。这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时间无关。这样,在理想的流水操作状态下,其运行效率很高。2 n- {, Q% @/ s8 ~# J3 G& p
  如果某个设计的处理流程分为若干步骤,而且整个数据处理是单流向的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以采用流水线设计方法来提高系统的工作频率。
6 c5 `( a, c( l6 j# q/ l/ H  下面用8位全加器作为实例,分别列举了非流水线方法、2级流水线方法和4级流水线方法。
(1)非流水线实现方式
module adder_8bits(din_1, clk, cin, dout, din_2, cout);6 U! R0 p9 Q8 F- O- H
    input [7:0] din_1;
! |: n- o% R% P5 R/ j+ c    input clk;7 U% ~  @- A9 {/ @, [7 k% `
    input cin;# x0 N5 U" D  y2 @# `0 @0 k, \
    output [7:0] dout;
1 |9 c9 B" _- H3 ]7 ?    input [7:0] din_2;
* s$ E+ T8 k0 p: A    output cout;
( P' N$ D/ x+ R% q1 U; C      
% D' D* d  s/ N( [* m7 G     reg [7:0] dout;8 o, n& k8 T2 V1 K  M
     reg       cout;
- J, _$ M' J( [3 X0 `! w+ K      5 g9 h- R; g" r. G- l1 i( M
     always @(posedge clk) begin
5 S9 h5 ^4 |; J* C5 g        {cout,dout} <= din_1 + din_2 + cin;
/ F3 p' A  L, j) R3 \0 |* ~/ I1 H     end; @% `/ p7 z0 ~" B

- [8 N/ g0 @2 u' vendmodule+ _; s( L) t& t
 楼主| 发表于 2013-10-30 13:31 | 显示全部楼层
(2)2级流水线实现方式4 l8 o- P: d6 x! E2 c* }0 Y# i- x4 e
module adder_4bits_2steps(cin_a, cin_b, cin, clk, cout, sum);
8 L) {4 A% e& Q" H  h    input [7:0] cin_a;* _8 U, X& V; p+ d% |! l) N4 G
    input [7:0] cin_b;
. T4 n; S+ L- P! I3 W* h% @8 e- B    input cin;. x9 X) o3 P0 W, r( x" k# v
    input clk;6 f* I2 ^! W# W$ \) k
    output cout;5 I! f( P, a+ P9 H/ s
    output [7:0] sum;
: }) _* j8 s/ |: `7 }/ H      
7 w' S+ H4 C% o, ]" @     reg cout;
0 v) E; S4 @+ W5 \' J  m0 J& b     reg cout_temp;9 _9 e! f: `+ G8 g0 ]1 J
     reg [7:0] sum;
9 h. p9 X  D" ?3 B- O$ r     reg [3:0] sum_temp;
4 V6 d( N, C! {4 D* G" S      9 y# }2 D( h2 O$ c* U8 R( B2 c
     always @(posedge clk) begin
# |$ A7 E5 h3 d% F; a; f        {cout_temp,sum_temp} = cin_a[3:0] + cin_b[3:0] + cin;
$ o' }0 |7 |5 ^     end
5 a$ m- A2 a3 H      3 V3 a- {6 g. l  B) @8 |4 Z$ P
     always @(posedge clk) begin' G5 s! H$ x4 e2 D# T
        {cout,sum} = {{1'b0,cin_a[7:4]} + {1'b0,cin_b[7:4]} + cout_temp, sum_temp};
7 b+ {- n# s8 r# ^     end
" p: V6 |, M+ B0 {: i" {* Gendmodule
回复

使用道具 举报

 楼主| 发表于 2013-10-30 13:34 | 显示全部楼层
注意:这里在always块内只能用阻塞赋值方式,否则会出现逻辑上的错误!(3)4级流水线实现方式:
' y/ o5 @% I( b; h3 n% }6 Bmodule adder_8bits_4steps(cin_a, cin_b, c_in, clk, c_out, sum_out);
$ ?3 I& k8 \8 f    input [7:0] cin_a;0 O9 x; F+ w) @& J8 b
    input [7:0] cin_b;
. U+ ]" ^; s5 n$ O! i    input c_in;
& B- D- W- j" u2 S# R  K) q( R    input clk;' G! ?0 a" e" e$ p% g
    output c_out;2 \  a4 F3 y: `* b( H4 i
    output [7:0] sum_out;8 O) E9 @- q# b9 P0 z3 E9 s
      
$ A. ]% n1 `( T' b" A  n     reg c_out;
& `, _4 E: L8 a- S& T: `     reg c_out_t1, c_out_t2, c_out_t3;
/ k- N5 B2 l; h8 w1 Z; J      6 F% u0 c2 s; W+ }9 J' G
     reg [7:0] sum_out;$ x; G; M% c, X! s7 Z" ?6 @$ b
     reg [1:0] sum_out_t1;9 c) ?: c( Q5 s4 j
     reg [3:0] sum_out_t2;
7 s3 f( V+ E. @+ f     reg [5:0] sum_out_t3;
8 p: {6 l; _$ g) H, x3 ^% v4 ?0 U, l      
) P8 Q8 ^! m8 |  E/ v     always @(posedge clk) begin+ T) ~! I* Z% b' P/ R! r, @( T
        {c_out_t1, sum_out_t1} = {1'b0, cin_a[1:0]} + {1'b0, cin_b[1:0]} + c_in;- N5 j5 }/ C% ]5 E2 D. y" s
     end
5 l, g& n% U( h  `1 z/ r/ c      
2 C8 f+ [3 p5 _* w8 O6 m% Q     always @(posedge clk) begin
; O% H5 g! a1 t$ u6 K        {c_out_t2, sum_out_t2} = {{1'b0, cin_a[3:2]} + {1'b0, cin_b[3:2]} + c_out_t1, sum_out_t1};& S& K6 w$ a# A
     end
% I0 L+ u: g. M      
. ^9 Y: N8 ^% O) v4 J* R2 S) F     always @(posedge clk) begin
; }$ c# D0 S1 w' P        {c_out_t3, sum_out_t3} = {{1'b0, cin_a[5:4]} + {1'b0, cin_b[5:4]} + c_out_t2, sum_out_t2};
5 F  |( A. X" q- L; B     end' f$ M* c, h1 K7 }
      ' X; `: p) M% l8 ^( C5 r% E0 C
     always @(posedge clk) begin" o7 H1 W  N% z8 j8 i
        {c_out, sum_out} = {{1'b0, cin_a[7:6]} + {1'b0, cin_b[7:6]} + c_out_t3, sum_out_t3};
5 I  C! o  X  b6 {" r. a     end
& P! E0 w7 z" ]
7 p+ S( `! s7 w! J' a9 K  c5 r6 Q- z9 `
endmodule' O+ W+ g# ^6 H/ w& C  W& f6 X
( k! p0 i7 j) U2 A8 c8 Q$ l
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2013-10-30 15:11 | 显示全部楼层
流水线乘法
: C, `4 ]# @' E! [  @: A) f; }
6 t, N9 D8 _* N5 Ymodule multi_4bits_pipelining(mul_a, mul_b, clk, rst_n, mul_out);
, o9 {8 a; l; a. G0 w( Q     
9 X# M, I# R" j- R8 |0 F( k3 k    input [3:0] mul_a, mul_b;6 \7 H- t  c7 O$ ]4 D+ q
    input       clk;. z' ?4 G! J! h- @) j2 F6 s
    input       rst_n;
% h- `) ~$ x; ?  [2 [    output [7:0] mul_out;$ D7 A' N0 ]2 @" N, ?5 W
6 o( U3 Y1 E, s. a0 O
    reg [7:0] mul_out;
+ k5 G3 Y+ G3 ?3 ]) d# X1 U% H' x
8 @- d# D4 D( l    reg [7:0] stored0;
9 o$ P5 d' y% f6 f+ S* M    reg [7:0] stored1;
. P; r" _3 {# z3 s: R9 [2 J. c    reg [7:0] stored2;
" B1 C3 I) i1 H0 |& H$ j    reg [7:0] stored3;
& ^. c5 m+ a) U/ J3 n1 I + G' @9 n+ f) o% V8 u! J% Q
    reg [7:0] add01;
; H* K8 W5 M( |- v    reg [7:0] add23;0 o( T" g6 @  x8 a! S

" d" H! ?5 h$ b, l" m2 ^% z' Q    always @(posedge clk or negedge rst_n) begin
% b; V4 S2 n% M7 S# X, x        if(!rst_n) begin
3 y+ _- i' o2 M" ^5 _( M            mul_out <= 0;
3 q2 B: V2 H  L2 l            stored0 <= 0;
( q- O+ N* m' L2 r- l, N" P% E            stored1 <= 0;4 d. |3 m/ m+ {- `( l* s
            stored2 <= 0;- {2 }: T% j, h! P& ?
            stored3 <= 0;
+ y5 i2 t; b' W* {; R            add01 <= 0;
3 V7 a) R& ]+ f4 T& w9 F, `            add23 <= 0;# f! V. `# a" ]2 y# h0 c
        end& N3 A" X  T$ G* W
        else begin
* G) l! K7 k5 e4 J# F3 r            stored0 <= mul_b[0]? {4'b0, mul_a} : 8'b0;
, W) i- w9 h6 _" t4 b            stored1 <= mul_b[1]? {3'b0, mul_a, 1'b0} : 8'b0;
4 @' ^2 G% r3 _2 e; w            stored2 <= mul_b[2]? {2'b0, mul_a, 2'b0} : 8'b0;- I: g) V: U, l6 @/ `
            stored3 <= mul_b[3]? {1'b0, mul_a, 3'b0} : 8'b0;0 O& {6 X/ T( z$ ^9 k
2 W# h9 Z5 A0 c8 S1 t6 b
            add01 <= stored1 + stored0;' Q% O  E! ^8 p5 c
            add23 <= stored3 + stored2;
7 N* g7 ^8 M8 W
& x- q! P- s- {9 \4 f* l3 C            mul_out <= add01 + add23;7 K  S4 r0 m) t, i6 v# g& `1 w
        end
& J, r2 d. W! q- a2 [. q/ b" w    end9 O4 S/ `# B- n+ w% h
6 b* m" ^/ y2 K3 Y6 L
endmodule
回复

使用道具 举报

发表于 2013-10-30 16:06 | 显示全部楼层
实话,看不懂,楼主厉害
& K6 |5 ]3 v- j7 A$ G* }: K6 S$ R我以为是生产线上的流水线呢; V$ }* z+ J- ?8 Y; L/ ~5 c! O
佩服有技术的人
回复

使用道具 举报

本版积分规则

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

GMT+8, 2025-10-28 00:52 , Processed in 0.035794 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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