找回密码
 注册
关于网站域名变更的通知
查看: 589|回复: 3
打印 上一主题 下一主题

FPGA流水线设计

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-8-2 09:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
发表于 2021-8-2 10:52 | 只看该作者
理想的流水操作状态下,其运行效率很高
. T: U$ Z+ |" K( U5 T; W

该用户从未签到

3#
发表于 2021-8-2 13:13 | 只看该作者
利用流水线的设计方法,可大大提高系统的工作速度
5 k# ?7 H3 z" z& o3 d8 k! m

该用户从未签到

4#
发表于 2021-8-2 13:24 | 只看该作者
面积和速度这两个指标始终贯穿着FPGA的设计,是设计质量评价的最终标准。- q% J6 Y" D! s! M2 f
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-4 19:23 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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