|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
0 v# V) P' h( [" z7 \, B4 x+ y: j/ Y) Q( z H4 X& u
$ S N# h n) \4 z* [' I& D' o0 z, y( v1 l4 W% B5 m
+ i1 d- C* H' Z, F" @ 本文讨论的四种常用 FPGA/cpld设计思想与技巧: 乒乓操作、 串并转换、 流水线操作、 数据接口同步化, 都是 FPGA/CPLD 逻辑设计的内在规律的体现, 合理地采用这些设计思想能在FPGA/CPLD设计工作种取得事半功倍的效果。FPGA/CPLD的设计思想与技巧是一个非常大的话题, 由于篇幅所限, 本文仅介绍一些常用的设计思想与技巧, 包括乒乓球操作、 串并转换、 流水线操作和数据接口的同步方法。 希望本文能引起工程师们的注意, 如果能有意识地利用这些原则指导日后的设计工作, 将取得事半功倍的效果!# S& Z+ R/ i* L) m# j+ O
& o# Q/ [6 h% j" H- \5 L
) Z7 a9 [" M1 P0 a
! S, l8 L& N* X9 v& x& @3 C一、乒乓操作7 B7 }( ^- D: r. v, S
3 O5 Q/ v2 y4 ~2 Q' e! ~* M \8 i
5 _9 v0 y. [, J m @. R “ 乒乓操作” 是一个常常应用于数据流控制的处理技巧, 典型的乒乓操作方法如图 1 所示。6 j7 k4 X& w) w7 G* Z
# T. w% g% A) _4 k, Z
7 p6 B* b0 T0 F' p8 M! }, L
% W) h; |, X) w# N( y; w' s( C9 O& b8 r5 f
* z9 X: k) @3 |* _8 r 乒乓操作的处理流程为:输入数据流通过“ 输入数据选择单元” 将数据流等时分配到两个数据缓冲区, 数据缓冲模块可以为任何存储模块, 比较常用的存储单元为双口RAM(DPRAM)、单口RAM(SPRAM)、FIFO等。% g: s0 }( C+ a4 e; f% J' T& D
# L$ l: \/ R8 E& t7 a) s6 J+ L
1 D0 E3 q4 r) V" p: O4 M; L1 c% d; i G& z
在第 1个缓冲周期,将输入的数据流缓存到“ 数据缓冲模块1” ;3 h9 O$ L: M% Z* r% E- C/ V" l
- D) n; G: g2 B: Z7 d 在第2 个缓冲周期, 通过“ 输入数据选择单元” 的切换, 将输入的数据流缓存到“ 数据缓冲模块2” , 同时将“ 数据缓冲模块1” 缓存的第1 个周期数据通过“ 输入数据选择单元” 的选择, 送到“ 数据流运算处理模块” 进行运算处理; , c( V" f; ~ j( ]8 `4 m- L
2 U% U! V* E& r4 E' `. Y m
在第3 个缓冲周期通过“ 输入数据选择单元” 的再次切换,将输入的数据流缓存到“ 数据缓冲模块1” ,同时将“ 数据缓冲模块2”缓存的第2 个周期的数据通过“ 输入数据选择单元” 切换,送到“ 数据流运算处理模块” 进行运算处理。 如此循环。' U. N6 q% D( S+ C- q
( A; p2 o% h+ f) }2 O+ ~
* a" R' g- f$ n% }
- Q9 ?7 d/ o; f& i' O3 H 乒乓操作的最大特点是通过“ 输入数据选择单元” 和“ 输出数据选择单元” 按节拍、相互配合的切换, 将经过缓冲的数据流没有停顿地送到“ 数据流运算处理模块” 进行运算与处理。
& e& ~3 T4 q* `3 A9 ?8 v- I1 [& R' B
9 |3 Y4 V5 o$ i" \( }* D
. G7 _3 ~. V% w8 A% B
3 t! I8 N% d0 M6 l2 w c" O' W 把乒乓操作模块当做一个整体, 站在这个模块的两端看数据, 输入数据流和输出数据流都是连续不断的, 没有任何停顿, 因此非常适合对数据流进行流水线式处理。 所以乒乓操作常常应用于流水线式算法, 完成数据的无缝缓冲与处理。
, B+ e) p% d4 x b0 h# ]
2 u# ~1 T+ k$ y9 ~) t
6 j" f8 I" f0 e5 V6 T1 N8 J$ I) C! m5 r2 _
乒乓操作的第二个优点是可以节约缓冲区空间。 比如在WCDMA 基带应用中,1 个帧是由15个时隙组成的, 有时需要将1 整帧的数据延时一个时隙后处理, 比较直接的办法是将这帧数据缓存起来, 然后延时1 个时隙进行处理。 这时缓冲区的长度是1 整帧数据长, 假设数据速率是3.84Mbps,1 帧长10ms, 则此时需要缓冲区长度是38400 位。 5 ]9 S! s+ `% ]+ n, k
9 B/ e# B" x9 S' E# ?
6 ~& |5 x; \; K7 p J
- N( @- N; q4 ^ 如果采用乒乓操作, 只需定义两个能缓冲1 个时隙数据的 RAM(单口 RAM 即可)。 当向一块RAM 写数据的时候, 从另一块 RAM 读数据, 然后送到处理单元处理, 此时每块 RAM 的容量仅需2560 位即可,2块 RAM 加起来也只有 5120 位的容量。; L3 y1 R/ d1 z" E3 L6 V+ O; e
$ _ o- }8 q9 N# B* R
; F( d# I5 p4 P9 ]' d# Z7 @* t: g4 O s) V/ N5 f( J( l: X9 R2 m7 L
另外, 巧妙运用乒乓操作还可以达到用低速模块处理高速数据流的效果。 如图2所示, 数据缓冲模块采用了双口 RAM, 并在 DPRAM 后引入了一级数据预处理模块, 这个数据预处理可以根据需要的各种数据运算, 比如在WCDMA 设计中, 对输入数据流的解扩、 解扰、去旋转等。 假设端口 A 的输入数据流的速率为 100Mbps, 乒乓操作的缓冲周期是 10ms。 以下分析各个节点端口的数据速率。2 C! ~/ q+ b/ s9 a u' U) |, w
& y( j# V) V( |2 u7 ?7 m1 X5 b, q* J2 I7 o! I! F) A
) e5 l! k2 }6 }5 s o
; h F. \+ g) T% ?5 C# u+ l6 l
* \+ ~0 D5 A$ I* A A 端口处输入数据流速率为 100Mbps, 在第1 个缓冲周期10ms 内, 通过“ 输入数据选择单元” , 从B1 到达DPRAM1。B1 的数据速率也是100Mbps,DPRAM1 要在10ms 内写入1Mb 数据。同理, 在第2 个 10ms, 数据流被切换到DPRAM2, 端口 B2 的数据速率也是 100Mbps, DPRAM2在第 2 个 10ms 被写入 1Mb 数据。 在第 3 个 10ms, 数据流又切换到 DPRAM1, DPRAM1 被写入1Mb数据。仔细分析就会发现到第 3 个缓冲周期时,留给 DPRAM1 读取数据并送到“ 数据预处理模块 1”的时间一共是 20ms。 有的工程师困惑于 DPRAM1 的读数时间为什么是 20ms, 这个时间是这样得来的: 首先, 在在第 2 个缓冲周期向DPRAM2 写数据的 10ms 内, DPRAM1 可以进行读操作;8 }0 J; r; d6 w4 ^, k
, u$ x1 n/ e$ Y; }
) [1 Y* |& s& D& s) m+ _' V
) ~% V: F2 R. d) x 另外, 在第 1 个缓冲周期的第 5ms起(绝对时间为5ms 时刻),DPRAM1 就可以一边向500K 以后的地址写数据, 一边从地址0 读数, 到达10ms 时,DPRAM1 刚好写完了1Mb 数据, 并且读了500K 数据, 这个缓冲时间内DPRAM1 读了5ms; 在第3 个缓冲周期的第5ms 起(绝对时间为35ms 时刻), 同理可以一边向500K 以后的地址写数据一边从地址0 读数, 又读取了5 个ms, 所以截止DPRAM1 第一个周期存入的数据被完全覆盖以前,DPRAM1 最多可以读取20ms时间, 而所需读取的数据为1Mb, 所以端口C1 的数据速率为:1Mb/20ms=50Mbps。 因此, “ 数据预处理模块1” 的最低数据吞吐能力也仅仅要求为50Mbps。 同理, “ 数据预处理模块2”的最低数据吞吐能力也仅仅要求为50Mbps。 换言之, 通过乒乓操作, “ 数据预处理模块”的时序压力减轻了, 所要求的数据处理速率仅仅为输入数据速率的1/2。
0 {( b) ?9 X3 B. y
1 y. L0 w3 t( d* L; T- f$ v1 b- u2 ^: u( \5 s" s
) b/ O* h7 n N4 [9 q
通过乒乓操作实现低速模块处理高速数据的实质是:通过DPRAM 这种缓存单元实现了数据流的串并转换, 并行用“ 数据预处理模块1” 和“ 数据预处理模块2” 处理分流的数据, 是面积与速度互换原则的体现!" b1 ?5 j, H2 L% @1 A
) ^9 _* m5 `5 W0 j
3 X2 t8 n8 o( s1 o3 L n
# j$ `, M0 A, z8 W3 [
二、单RAM实现乒乓操作(原创)
9 g( l7 r: x+ t. K! h$ f) e2 G4 @) m7 w w+ j* \- F+ D( A
0 Q4 A% C7 S4 ~7 r0 U# H
: E2 M. m& O# X. P9 M6 R
先简单说一下乒乓RAM操作的应用场合,当对数据进行处理时,如果数据来的速率比较快,而处理数据的速率相对较慢,并且在进行数据处理的时候是需要先对进来的数据做一缓冲,等数据量达到一定的程度时再集中对数据进行处理,比如FFT运算就是一个典型的例子。现拿一个64点的FFT运算来举例外说明:假设输入的原始数据的速率是5M,而ADI信号处理器的工作时钟为100M,而每处理一次64点的FFT运算需要30个系统时钟(系统时钟频率是数据速率的20倍),假如现在输入数据数已经达到64个,则信号处理器需要进行FFT运算,当FFT运算结束时,下一个数据有可能已经过了,如果不采取缓存措施,则有可能会导致数据丢失,所以,为了防止上述情况发生,可采用双RAM操作,即:用两块64个存储单元的RAM,当数据来时先对数据进行一下缓存,比如,当前64个数据来时,先把数据缓存在第一块RAM里,当第一块RAM存储满时,这时便以系统时钟速率将第一块RAM的数据给FFT信号处理器,让其完成FFT去处,并将以后的数据缓存到第二块RAM里,由于系统时钟的速率是数据速率的20倍,当第二块RAM里的数据存储满后,FFT处理器有64*20=1280个系统时钟的工作时间,对于处理仅需94(30(FFT运算处理时间)+64(从RAM块里读出64个数据给FFT运算处理器所需的时间))个系统时钟的FFT运算来说已经足够。5 _! ?1 D) O: f1 T
/ l4 h* F1 f$ E: g n
( K' M9 n% ^) x) N7 i- @2 Z4 m
" ^" w- h" L3 @0 \: K+ Z9 ~
图1 传统的双RAM操作框图1 V* x: T3 s% L$ r0 [
5 b7 x- W8 V# _# d
但是,采用传统的双RAM块进行操作时也会存在一定的缺陷,比如,采用两块RAM会占用比较大的面积,这对集成电路的小型化发展带来不利,所以,考虑以上原因,现利用一块RAM完成双RAM乒乓操作的功能。将原来的两个RAM块合成一块,大小变为128*16bit,前64个数据存入地址为0-63的单元里,后64个数据存入64-127的单元中。结构如下图所示。
& |- ~0 c7 @; n/ s4 t% j
- ~% t! A0 e1 L* _1 h. L
9 L, x/ X& @) x+ L% U3 I% c" \0 [; y8 X: B ]8 C b6 v6 k3 C) i% c7 e; y
图2 一片RAM实现双RAM乒乓操作结构图. s# `+ K3 q" n9 f% q
: }$ S# \: c# l1 ?/ A+ Y3 m L
下图是利用ISE软件仿真的逻辑功能图( T' q y. f. y7 Q d" A5 d8 ]( d6 ^
& f( I0 _" Y2 K# U
; c8 D! \, g2 U E5 |
/ D# {4 c: {! V4 x: P" O8 z. h, D& u图3 功能仿真图
; J& M5 n% a( `! s5 d( h) A* U) J
5 X- d) E$ N, W3 ` 如上图所示,写地址线的操作只受输入数据的影响,而读地址线则受输入数据个数的影响,当第64个数据到来时,读地址线便从0变到63,并且将64个数据全部送入FFT处理器时,FFT处理器便在系统时钟下进行工作,当写地址线变到0时,便对64-127单元里的数据进行操作,如此循环,便实现一片RAM的双RAM乒乓操作功能。. N$ L S" w( g$ N9 p
' C4 _- ]) p2 P& |1 \
$ d5 l- X" J# u
|
|