EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行。这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时间无关。这样,在理想的流水操作状态下,其运行效率很高。) i; j5 J. n7 Y
如果某个设计的处理流程分为若干步骤,而且整个数据处理是单流向的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以采用流水线设计方法来提高系统的工作频率。1 V# z7 s! X! T' `; S: h% g( b
下面用8位全加器作为实例,分别列举了非流水线方法、2级流水线方法和4级流水线方法。(1)非流水线实现方式module adder_8bits(din_1, clk, cin, dout, din_2, cout);1 x* c2 n! H9 h. ^% E
input [7:0] din_1;
& o/ Y* H/ M% W3 {. W7 }( w- q+ M9 L+ d input clk;
0 \! x$ Q5 Y( _4 W+ @# r- { input cin;
, J: o4 s+ D( H2 ^ output [7:0] dout;
- t$ t* V' q+ f y: l input [7:0] din_2;% g7 e/ Z& f5 g: F/ C* _
output cout;
5 e% A/ y/ g% t0 a8 W! d
3 D/ R% m! r. E1 V+ @! m" R2 `3 L reg [7:0] dout;9 V- e3 O' m5 j/ T( m* X! y
reg cout;3 {' D/ p) z- w6 D: L- L
+ O; v1 }0 ~" P4 ]+ j* t# }, l: O6 ~
always @(posedge clk) begin5 }, s% H! H4 R, {
{cout,dout} <= din_1 + din_2 + cin;
3 G2 X' A. n9 M0 ?# e1 |# M end
; L0 a) h9 i7 [! s3 B! J7 t% t+ l# }- ]( g
endmodule0 i% Z5 e, }1 X A" O: Z
(2)2级流水线实现方式: module adder_4bits_2steps(cin_a, cin_b, cin, clk, cout, sum);
; _( ^5 S% |: T0 D3 n! j2 w I input [7:0] cin_a;' d' D$ ]% r& ^9 O& M C
input [7:0] cin_b;
2 m6 V2 Q L$ s4 t# t input cin;
4 J' A1 F9 L8 e. \+ b input clk;
) s. u5 S/ |. o1 b; d output cout;3 S; l% F7 ^, b7 V
output [7:0] sum;" d B. i& c- b. f! w7 M: H
* G$ z- v. u6 A' B
reg cout;& m7 }% {4 l( B2 J9 X l5 | ?
reg cout_temp; i0 {. n) P$ p5 }
reg [7:0] sum;% |2 w Z- {: k
reg [3:0] sum_temp;3 Z: ^9 _- n& n) Z$ F$ {9 I
8 X. h* e8 v6 E) b9 O
always @(posedge clk) begin& `3 }# e0 c( I, V
{cout_temp,sum_temp} = cin_a[3:0] + cin_b[3:0] + cin;
; g: y7 v; M' R& G0 t# z end7 H5 ], p9 I( u1 K1 m% ]. g
+ o+ s, { N! d/ ^# `0 G& W always @(posedge clk) begin, H% X% ` ^/ i7 ?
{cout,sum} = {{1'b0,cin_a[7:4]} + {1'b0,cin_b[7:4]} + cout_temp, sum_temp};
0 ]* O# H4 Y( b7 F8 Y end
! v3 X) Z$ l; u9 P w; k7 D/ e3 kendmodule
0 W! t9 S3 M* g5 T: w! ?注意:这里在always块内只能用阻塞赋值方式,否则会出现逻辑上的错误! (3)4级流水线实现方式: module adder_8bits_4steps(cin_a, cin_b, c_in, clk, c_out, sum_out);
4 D' n+ m+ G( H5 ~& ]% A input [7:0] cin_a;
! w( e5 ]' c: ^ l X. B" ]# F input [7:0] cin_b;% ~* x: a/ r3 v8 X
input c_in;, I; } D3 d4 b+ t
input clk;
9 l- P" Z4 F0 ^! R output c_out;& A0 @9 |+ ~$ f' t* W3 S
output [7:0] sum_out;' v+ o% w* X8 R Z+ @7 R9 {
; I7 Y( I" c9 r6 A5 Y& a
reg c_out;2 S# s$ {" ^9 T$ k
reg c_out_t1, c_out_t2, c_out_t3;
$ ~$ c3 G+ B! R7 P) }+ W% m & K) ?7 m8 g: F$ y @, U, u
reg [7:0] sum_out;
7 h4 _- A }0 C/ Z% ^9 ]. f7 p% n M1 R reg [1:0] sum_out_t1;( s! S* ?+ X6 _( i, {& D" A C
reg [3:0] sum_out_t2;
% i' z! D2 o/ h6 D" g9 s6 ^0 [ reg [5:0] sum_out_t3;
" J: N' L7 e6 w6 c1 a3 x# D7 U 9 W# ]0 m: T: V+ [; e% q) d
always @(posedge clk) begin0 @ q9 I, Q6 L: C5 M% h
{c_out_t1, sum_out_t1} = {1'b0, cin_a[1:0]} + {1'b0, cin_b[1:0]} + c_in;
! o) f% ?' u8 r$ [; z+ k end+ b0 a% A! m, u8 }, f
' @7 C7 \2 ~+ T* B! Z$ u always @(posedge clk) begin
% {5 J& v8 Y0 M, h {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 w* `7 k( f& f: h C; T* \% r
end9 g+ Z) X6 H8 R& f2 P* X
( I( S# o; ~/ y( }8 ?7 r- S1 L always @(posedge clk) begin
# o5 f9 [- p6 o1 ~ {c_out_t3, sum_out_t3} = {{1'b0, cin_a[5:4]} + {1'b0, cin_b[5:4]} + c_out_t2, sum_out_t2};
) D# Z0 t1 }, }! ~6 e end
/ b: P' [: ~7 f5 F7 p/ E* P
: p" C) h1 u! j8 P' _- [' b7 V always @(posedge clk) begin- |3 ]0 Z, S3 l7 Y4 z
{c_out, sum_out} = {{1'b0, cin_a[7:6]} + {1'b0, cin_b[7:6]} + c_out_t3, sum_out_t3};
. Q; t/ \$ m! Q1 {/ s) h/ D) F* u end3 Q- p6 M4 i# i% H: F
1 n4 D# |. q2 S. n
* M, Y; e6 C4 V2 v( L% g. \4 @9 eendmodule& V% H$ P3 y8 r3 d+ C/ y
总结:利用流水线的设计方法,可大大提高系统的工作速度。这种方法可广泛运用于各种设计,特别是大型的、对速度要求较高的系统设计。虽然采用流水线会增大资源的使用,但是它可降低寄存器间的传播延时,保证系统维持高的系统时钟速度。在实际应用中,考虑到资源的使用和速度的要求,可以根据实际情况来选择流水线的级数以满足设计需要。! K, y. L* `7 h6 u1 ^
这是一种典型的以面积换速度的设计方法。这里的“面积”主要是指设计所占用的FPGA逻辑资源数目,即利用所消耗的触发器(FF)和查找表(LUT)来衡量。“速度”是指在芯片上稳定运行时所能达到的最高频率。面积和速度这两个指标始终贯穿着FPGA的设计,是设计质量评价的最终标准。
5 Q* H/ J8 k! c7 j, ^. E |