一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2959|回复: 5
收起左侧

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

[复制链接]
发表于 2013-10-30 13:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2013-10-30 13:28 编辑
1 ^6 f! N# N* c( ]" L( j2 A% v8 \7 ?/ y0 d1 \
所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行。这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时间无关。这样,在理想的流水操作状态下,其运行效率很高。
! U# Z) Z9 v- G3 s  如果某个设计的处理流程分为若干步骤,而且整个数据处理是单流向的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以采用流水线设计方法来提高系统的工作频率。
; y9 A' w: S# K) ]  下面用8位全加器作为实例,分别列举了非流水线方法、2级流水线方法和4级流水线方法。
(1)非流水线实现方式
module adder_8bits(din_1, clk, cin, dout, din_2, cout);
% A4 e7 @( O1 d& k) o4 b' L    input [7:0] din_1;
5 X7 Q* E8 ]1 @9 A* M: N; J    input clk;% s& V& k5 C% h  Q, }6 Z6 v$ L( h; L
    input cin;
$ p! k7 ~  O$ @4 l* d9 e    output [7:0] dout;# y7 h* k2 {' g
    input [7:0] din_2;* E8 D7 y7 l( S
    output cout;
1 S, y$ m" C3 P: l5 a: l/ w      3 m+ N6 i( F0 T+ P+ J7 L/ ^
     reg [7:0] dout;& r' o% |# @& F3 L. x
     reg       cout;5 O4 @9 K; r" M- R8 x' S( Z# C, b) u) |
      / p0 f; l5 c" m, o6 r) u
     always @(posedge clk) begin
5 q  P( X0 }, }2 n6 f5 i/ S        {cout,dout} <= din_1 + din_2 + cin;. b; I& e4 k( R0 m3 \: w8 c
     end. l  D# t- ?6 B+ @( x% d, R
, t" y( ?' g/ g! q! c' T
endmodule  L) F* \) ?& D) L7 {3 h& l
 楼主| 发表于 2013-10-30 13:31 | 显示全部楼层
(2)2级流水线实现方式
' T. n/ U8 v1 P; cmodule adder_4bits_2steps(cin_a, cin_b, cin, clk, cout, sum);
& ?1 l* z  @! f/ r* n/ U, ~    input [7:0] cin_a;. W3 J  l6 Q% }
    input [7:0] cin_b;
1 z2 t* Z: A' P    input cin;6 N( d# U2 O8 I5 J0 W% O0 O
    input clk;
* z- }3 p0 c$ |& n# _) C    output cout;& f" f; B' j. `/ H3 @  b! X5 _. h$ f
    output [7:0] sum;" _/ M8 z+ @" P" R, J' F; ]
      
; S6 X' H8 J# P, d7 ]     reg cout;9 b) y0 p) p$ Q* t+ b
     reg cout_temp;
% I8 `" W6 j' R' y1 Y0 W1 f, T     reg [7:0] sum;$ B4 ^4 z" Y; B+ I0 u1 U8 x. i, p
     reg [3:0] sum_temp;
1 X! m2 W$ j! S, M1 v3 ^  }; [      
5 L- M$ \% p( Q2 c     always @(posedge clk) begin8 E' b; s8 a: D: y1 Q) l
        {cout_temp,sum_temp} = cin_a[3:0] + cin_b[3:0] + cin;
8 F  y' _4 V1 P' h* M. {, G* i0 W     end( v2 z0 S' x' p9 i/ ~3 @: q+ K
      . Y; P6 ]: ?; v0 \
     always @(posedge clk) begin+ @- l* a" f" `% A5 l( |% a( ]& E
        {cout,sum} = {{1'b0,cin_a[7:4]} + {1'b0,cin_b[7:4]} + cout_temp, sum_temp};7 w8 z4 I( E. j3 E7 u# f
     end
8 W' _) R7 l# ]& |* j4 C) z, h# P' gendmodule
 楼主| 发表于 2013-10-30 13:34 | 显示全部楼层
注意:这里在always块内只能用阻塞赋值方式,否则会出现逻辑上的错误!(3)4级流水线实现方式:( x6 w7 |, O  A" v
module adder_8bits_4steps(cin_a, cin_b, c_in, clk, c_out, sum_out);  }$ J& |6 c1 ]  g  w7 ~1 C% c
    input [7:0] cin_a;- ^. [7 [- ?  A- F, a, I7 O5 V: J4 N
    input [7:0] cin_b;
* G6 V9 ?6 [* H    input c_in;4 q- t" P2 q! T% B  b" x2 r
    input clk;+ I1 H+ J4 H+ k. c) V5 W
    output c_out;6 ^' L1 E2 r0 e6 y% h2 \8 T  q  H' U- O
    output [7:0] sum_out;
2 o+ K" y& S/ }6 ~: F8 K6 l# N% K        ~" W# X: m' H% V5 v3 U" h  \
     reg c_out;
- U+ X  ]/ g( g* Z* a  h  i8 L     reg c_out_t1, c_out_t2, c_out_t3;. u$ ?; X( U4 a3 d
      # o, _" C+ A) C9 r- r: C
     reg [7:0] sum_out;% @# A, O! _, M" e: g9 w7 T
     reg [1:0] sum_out_t1;0 E6 ]. |# Q& ?% U
     reg [3:0] sum_out_t2;# E  R5 W5 ^/ m) Q9 U( `$ \
     reg [5:0] sum_out_t3;* |  U, h/ W# K2 W; h, k
      
2 l0 z1 y3 q5 }* C1 ]     always @(posedge clk) begin
5 `- a5 }# K& J9 e: @        {c_out_t1, sum_out_t1} = {1'b0, cin_a[1:0]} + {1'b0, cin_b[1:0]} + c_in;
7 u" b+ x6 s1 F, O: [     end! Y8 \+ {: B* q0 e: H) D( |; C
      * m  `1 m8 W0 D3 `
     always @(posedge clk) begin
: v2 D" t8 E0 |3 Z. a  g$ B/ }$ u) S9 E        {c_out_t2, sum_out_t2} = {{1'b0, cin_a[3:2]} + {1'b0, cin_b[3:2]} + c_out_t1, sum_out_t1};6 u# K7 a8 }6 C, b
     end" ]' g8 t% v. N3 y/ C
      
# j. ^: \* Z% @; g     always @(posedge clk) begin8 A/ t4 Q: }0 [& M1 i
        {c_out_t3, sum_out_t3} = {{1'b0, cin_a[5:4]} + {1'b0, cin_b[5:4]} + c_out_t2, sum_out_t2};
8 \8 d) D+ _' z- @# S# M     end' P& l9 g& t+ b0 i& A1 E
      4 Q# T) ?; t. P; ?) H! g3 F) R
     always @(posedge clk) begin
, R7 F. E0 v2 K        {c_out, sum_out} = {{1'b0, cin_a[7:6]} + {1'b0, cin_b[7:6]} + c_out_t3, sum_out_t3};
/ S% ~( y, \+ D+ U* d. A8 w     end
+ F& Z$ y+ y! c% l) o$ x( H8 o: B/ T4 v8 M% P6 T: D

2 w: G9 o" B+ d5 O6 X2 Eendmodule4 W3 z1 r* G/ U
, O( ^6 w7 ]2 ]8 H
 楼主| 发表于 2013-10-30 13:35 | 显示全部楼层
总结:利用流水线的设计方法,可大大提高系统的工作速度。这种方法可广泛运用于各种设计,特别是大型的、对速度要求较高的系统设计。虽然采用流水线会增大资源的使用,但是它可降低寄存器间的传播延时,保证系统维持高的系统时钟速度。在实际应用中,考虑到资源的使用和速度的要求,可以根据实际情况来选择流水线的级数以满足设计需要。
6 t: H# D: R/ [4 I3 R4 {, S  这是一种典型的以面积换速度的设计方法。这里的“面积”主要是指设计所占用的FPGA逻辑资源数目,即利用所消耗的触发器(FF)和查找表(LUT)来衡量。“速度”是指在芯片上稳定运行时所能达到的最高频率。面积和速度这两个指标始终贯穿着FPGA的设计,是设计质量评价的最终标准。
 楼主| 发表于 2013-10-30 15:11 | 显示全部楼层
流水线乘法1 u/ @1 I% E# s; H* G4 a

5 B1 G3 o+ B' {. d# lmodule multi_4bits_pipelining(mul_a, mul_b, clk, rst_n, mul_out);
% J* `$ D0 o3 v. O     
4 Q6 ^' e9 c" M7 H7 v0 i    input [3:0] mul_a, mul_b;2 A1 g! W; U( M- w5 f7 l' a
    input       clk;; a% V  Y8 g% H5 B9 a% y
    input       rst_n;8 R- D9 ]2 D  H! V+ C1 [3 x
    output [7:0] mul_out;
- [* [/ K" Q% l  U$ T6 @+ `6 Y9 u 3 k/ r) b5 r/ G  u
    reg [7:0] mul_out;
& }# o1 l8 a) `5 H 3 M9 O# Y2 j- H' ?
    reg [7:0] stored0;
- v6 X7 \4 S+ b* j" y    reg [7:0] stored1;
( ~4 J$ P! q/ |; a    reg [7:0] stored2;
5 a( [3 s* q2 G  q% p, V    reg [7:0] stored3;
- _/ G" I7 K$ B$ I
* U/ d# h2 Y5 o; E& A4 x    reg [7:0] add01;+ Y0 V6 g9 m; A( Y. k9 ]
    reg [7:0] add23;4 B0 D: r- C8 `( v9 D9 S1 c5 r

) A6 E' {- p7 K/ Q  |    always @(posedge clk or negedge rst_n) begin
' a, i+ s4 P. ^0 x  ~: B        if(!rst_n) begin. x; U$ X2 m3 y. F' t
            mul_out <= 0;
" T" Z9 e' t/ ~* }7 b# x5 V" S5 B            stored0 <= 0;; c3 G' \5 Y+ b2 U+ F0 q
            stored1 <= 0;! f- e7 I+ m) D/ l$ Y6 U* ?# A1 z
            stored2 <= 0;* l  T( X3 S4 C6 n9 D
            stored3 <= 0;
& a" f& ^* X9 \: x: R& V9 x            add01 <= 0;2 Q7 U# C  H1 d% w/ B4 H3 `' Z( K" _
            add23 <= 0;- ]- H4 r+ W% A  B' F! `
        end) A  r- z6 Z0 O" l" f6 ~
        else begin
: a% {) p$ a  L! V            stored0 <= mul_b[0]? {4'b0, mul_a} : 8'b0;
6 j9 F( A$ r0 u% L3 H            stored1 <= mul_b[1]? {3'b0, mul_a, 1'b0} : 8'b0;* K; \7 a, b5 J
            stored2 <= mul_b[2]? {2'b0, mul_a, 2'b0} : 8'b0;$ O7 p8 c9 t4 p6 r
            stored3 <= mul_b[3]? {1'b0, mul_a, 3'b0} : 8'b0;: S( C: \1 j& U( D# J" e, p
, b  e% s; o/ P7 G0 ]' y! c2 D
            add01 <= stored1 + stored0;- Y# |# ~8 [" P+ |6 t; s. H
            add23 <= stored3 + stored2;. v1 n0 @) f! u1 d
1 i2 h& A% W9 G, l' X  u/ a. H% V
            mul_out <= add01 + add23;
( W. o3 O0 ^; }0 O* L6 A6 Q! o        end
/ [( u& z# ~8 B" U    end2 H: t# m5 C% J9 j. Z' |

  B' H* |: N  ~endmodule
发表于 2013-10-30 16:06 | 显示全部楼层
实话,看不懂,楼主厉害' P; T% E1 D4 {+ l
我以为是生产线上的流水线呢
# |  I+ [% S% E4 I佩服有技术的人

本版积分规则

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

GMT+8, 2024-5-21 04:29 , Processed in 0.065739 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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