|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
" R3 |% I( H: \- M
* J4 J1 Q- @* q1 c' S
4 q% j( V1 A$ I. i3 P0 [0 J; b; x7 @. B: p
1 V+ ]! ]* V I: o4 U; ^, B* u$ Y7 v
本文讨论的四种常用 FPGA/cpld设计思想与技巧: 乒乓操作、 串并转换、 流水线操作、 数据接口同步化, 都是 FPGA/CPLD 逻辑设计的内在规律的体现, 合理地采用这些设计思想能在FPGA/CPLD设计工作种取得事半功倍的效果。FPGA/CPLD的设计思想与技巧是一个非常大的话题, 由于篇幅所限, 本文仅介绍一些常用的设计思想与技巧, 包括乒乓球操作、 串并转换、 流水线操作和数据接口的同步方法。 希望本文能引起工程师们的注意, 如果能有意识地利用这些原则指导日后的设计工作, 将取得事半功倍的效果!
7 _0 f, V! I }! v8 E) S0 N6 X* t) p8 ~- f* J( N
& _& B5 X' V* Z2 D: P' \3 Z
# c+ ?( O7 H, j4 b一、乒乓操作5 k0 b- i+ e' G5 [/ I$ u
9 G. I* O' m* ~- j3 F# x7 A+ V. e/ X8 v+ P- g2 F1 _
% d P0 j, ?3 _8 p: a
“ 乒乓操作” 是一个常常应用于数据流控制的处理技巧, 典型的乒乓操作方法如图 1 所示。
$ P; I- B0 u; ~5 [+ f$ u
6 ]' e: F3 `' |+ A; i- G" H$ ?
, }3 {) }+ J4 Y- _) s
! i* J$ g) o. B6 d
8 S* g+ k, \9 J0 m
8 G+ j7 W& o0 U4 R5 @ b* p 乒乓操作的处理流程为:输入数据流通过“ 输入数据选择单元” 将数据流等时分配到两个数据缓冲区, 数据缓冲模块可以为任何存储模块, 比较常用的存储单元为双口RAM(DPRAM)、单口RAM(SPRAM)、FIFO等。" }) {7 ^' e+ W2 y8 k/ q
8 d O4 B6 Y/ w4 S
1 |2 x( X; R+ c5 x/ R0 P& j/ F1 \; X: }* r$ I# y5 n
在第 1个缓冲周期,将输入的数据流缓存到“ 数据缓冲模块1” ;( W; u: Y% H5 \( \4 I, J3 C" T+ d
' c- n# x8 E$ y6 p* h6 L 在第2 个缓冲周期, 通过“ 输入数据选择单元” 的切换, 将输入的数据流缓存到“ 数据缓冲模块2” , 同时将“ 数据缓冲模块1” 缓存的第1 个周期数据通过“ 输入数据选择单元” 的选择, 送到“ 数据流运算处理模块” 进行运算处理; % \# |0 |* h" N- _
# q8 w J0 l; o! F) V: n
在第3 个缓冲周期通过“ 输入数据选择单元” 的再次切换,将输入的数据流缓存到“ 数据缓冲模块1” ,同时将“ 数据缓冲模块2”缓存的第2 个周期的数据通过“ 输入数据选择单元” 切换,送到“ 数据流运算处理模块” 进行运算处理。 如此循环。2 d4 P5 [6 e' U: U2 D
5 J8 R" Z9 Q# W+ |; x) Z
4 d1 W* Z! f+ K$ X
! c. \# l% F; f# ~. i# k- \ 乒乓操作的最大特点是通过“ 输入数据选择单元” 和“ 输出数据选择单元” 按节拍、相互配合的切换, 将经过缓冲的数据流没有停顿地送到“ 数据流运算处理模块” 进行运算与处理。
" B$ q9 l+ B4 z2 s1 H" p# O( _: }: T
* m7 E# Z' B: S+ x \/ Z* n) z
" `& D, r m5 I 把乒乓操作模块当做一个整体, 站在这个模块的两端看数据, 输入数据流和输出数据流都是连续不断的, 没有任何停顿, 因此非常适合对数据流进行流水线式处理。 所以乒乓操作常常应用于流水线式算法, 完成数据的无缝缓冲与处理。0 s) P/ w9 C" e8 s$ }1 c! Q0 Z9 W1 f
. V. n% P: {2 X
. I( c: |6 Z* ]& A1 B' I
8 c" e/ a& e% Z1 Z( S 乒乓操作的第二个优点是可以节约缓冲区空间。 比如在WCDMA 基带应用中,1 个帧是由15个时隙组成的, 有时需要将1 整帧的数据延时一个时隙后处理, 比较直接的办法是将这帧数据缓存起来, 然后延时1 个时隙进行处理。 这时缓冲区的长度是1 整帧数据长, 假设数据速率是3.84Mbps,1 帧长10ms, 则此时需要缓冲区长度是38400 位。 % P0 s/ J7 O4 j$ `, ?* ?. F
& s" a G: e# M2 ~# V* l, n7 Z; A8 h+ }) f ~$ v$ z% w4 ^: t
( [- r' y4 T" W, Y 如果采用乒乓操作, 只需定义两个能缓冲1 个时隙数据的 RAM(单口 RAM 即可)。 当向一块RAM 写数据的时候, 从另一块 RAM 读数据, 然后送到处理单元处理, 此时每块 RAM 的容量仅需2560 位即可,2块 RAM 加起来也只有 5120 位的容量。
* H" f1 [; G. J/ V8 Z4 K) h, d$ g: z1 f) X3 Q
( @4 \+ p9 h( z% K4 h: K+ h
! t" s7 {% Q" q; V/ J 另外, 巧妙运用乒乓操作还可以达到用低速模块处理高速数据流的效果。 如图2所示, 数据缓冲模块采用了双口 RAM, 并在 DPRAM 后引入了一级数据预处理模块, 这个数据预处理可以根据需要的各种数据运算, 比如在WCDMA 设计中, 对输入数据流的解扩、 解扰、去旋转等。 假设端口 A 的输入数据流的速率为 100Mbps, 乒乓操作的缓冲周期是 10ms。 以下分析各个节点端口的数据速率。: O0 d8 j5 g1 e. j; z5 H+ n
7 _4 w) W7 O* R1 p
6 {$ c0 d2 a2 W6 f0 E
4 P* u4 [$ Q I3 y$ j- w& N( I5 @
3 i- F, g2 ^7 F ~, W
9 G8 V3 s! o- x9 G. y/ s, s+ ~* o 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 可以进行读操作;
% A. u; c! w. T( q9 y
* | D- X7 G2 S; V) ~5 t! w j
1 W: d9 v y+ c# S; B 另外, 在第 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。) ~& \7 B! N- ?! C8 p; i9 T/ }, e
/ @6 l8 i+ v. Z9 s' f( ?, ~- x5 i
4 v" W9 M% {5 \
- v# `/ J6 w3 x6 V4 n% c 通过乒乓操作实现低速模块处理高速数据的实质是:通过DPRAM 这种缓存单元实现了数据流的串并转换, 并行用“ 数据预处理模块1” 和“ 数据预处理模块2” 处理分流的数据, 是面积与速度互换原则的体现!$ v' v% S; o/ _+ ^; t0 y# z6 i! B
4 @; q6 F- O$ t* w [9 b
# w. l3 R/ r" {- D1 O. H9 `2 \3 L, d3 `) d
二、单RAM实现乒乓操作(原创)6 J. ~# c; R- R3 ^( D& F
3 |1 v/ f8 Q- A& l" @+ T0 `( V, c) b+ R6 ~. k1 b$ d
- p6 g% Y' ]. z' \. B; g1 I
先简单说一下乒乓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运算来说已经足够。
( o3 E) I& X# _2 i' {# U8 K5 v. |. v+ T+ z. [& \
/ ]; I: ~* _& K6 P
' @* {. P) C% R) a. e图1 传统的双RAM操作框图9 X) B: x1 ]+ W1 P0 O$ l4 T
& m2 {1 m0 R' p# J4 t) A
但是,采用传统的双RAM块进行操作时也会存在一定的缺陷,比如,采用两块RAM会占用比较大的面积,这对集成电路的小型化发展带来不利,所以,考虑以上原因,现利用一块RAM完成双RAM乒乓操作的功能。将原来的两个RAM块合成一块,大小变为128*16bit,前64个数据存入地址为0-63的单元里,后64个数据存入64-127的单元中。结构如下图所示。
4 |: n! @% z2 W/ [: l ?3 c4 J U/ K$ d: c }) D! m9 @) ~
( U- ^4 y9 D9 u8 w* v: x {9 U
图2 一片RAM实现双RAM乒乓操作结构图' m& `5 s5 j3 w0 f+ {
6 v( s5 U( E; z4 z' X/ g- ^ 下图是利用ISE软件仿真的逻辑功能图
' |# p- x) C% z0 K3 x
0 k. Z' B% [+ {2 j5 N. o4 U
+ t( U% i) P! z# z7 p' ?4 w
% a' W/ C1 t7 B; E7 z4 c图3 功能仿真图6 C: B2 V1 [/ U- M. U
! g9 W: c, n w( {" E
如上图所示,写地址线的操作只受输入数据的影响,而读地址线则受输入数据个数的影响,当第64个数据到来时,读地址线便从0变到63,并且将64个数据全部送入FFT处理器时,FFT处理器便在系统时钟下进行工作,当写地址线变到0时,便对64-127单元里的数据进行操作,如此循环,便实现一片RAM的双RAM乒乓操作功能。5 J; k) L, D4 I9 e* i5 [
2 W" S% j% A1 O J
+ D! H; Y% v, _. \9 W! b5 ]
|
|