项目代码编译后打印如下信息:
% p3 q* [. s9 A
Info: Clock "CLK48M" has Internalfmax of 67.47 MHz between source register "GLUE_LGC:glue|MCLK" anddestination register "img_lgc:img|N2DSP" (period= 14.822 ns) b& ~% `# d% P, u2 S4 V" v
信号由MCLK到N2DSP这条通道限定了时针的最高速度只能到67.47MHz。
+ w* w; l4 ~+ k( i7 {) d5 ~
查看相关代码中存在如下代码段:
* J0 P; Q) k6 calways @( posedge CLK48M )
5 N' b, c9 y; k$ b1 Z; s
begin
; I0 Y1 M; | _- n' p2 }8 \
CLKDIV<= CLKDIV + 1; //clock divider
$ g% K" N' Z/ a0 i; c7 g1 T% K
end
! J3 s) h" h( nalways @(posedge CLKDIV[5])
" }: `# w* q- N; w begin
0 L# o5 ?6 g4 _& }5 I9 ]1 ~1 @
MCLKB3<= MCLK_EXT;
7 n t D" D( \+ V MCLKB2<= MCLKB3;
9 w7 s& x: E3 ?3 S& a* @1 W MCLKB<= MCLKB2;
, W; Y) O2 N' ~) }- P+ a MCLK<= MCLKB | MCLKB2 | MCLKB3;
& P2 [& X+ }1 z4 }( m0 k3 ~" I. L* Y End
# R% |& D s R% c' p8 O, W该代码段是对MCLK_EXT做一个简单的防抖处理,相当于使用CLK48M衍生的一个时钟CLKDIV[5]。
0 h/ F0 y8 l# M# ?5 _6 q, R+ j1 I# B
MCLK在其它模块中又使用CLK48M系统时钟做了一次锁存,于是相当于在两个CLK48M时钟之间要完成CLKDIV[5]的转换,再用CLKDIV[5]的上升沿去触发MCLK的转换,再输出到目的寄存器。此过程占用时间较长,而CLKDIV[5]所耗的时间显然是多余的。
- \# ?. ` N& o+ w
修改代码后如下:
. w, C/ n8 A" E$ ealways @( posedge CLK48M )
0 j% V$ G9 e, F1 [' ~* M. u" ^4 P* V
begin
$ E6 w, v- S3 y; d% n+ a { CLKDIV<= CLKDIV + 1; //clock divider
2 f9 V7 q: Y3 c$ M4 r7 r if(CLKDIV == 6'b100000)
1 a }% X' Y) l1 X' @
begin
* [" X7 `+ E; }' l2 k( r5 \ MCLKB3<= MCLK_EXT;
1 `9 Q* a; F2 X0 K0 D* ?
MCLKB2<= MCLKB3;
/ I4 `# ^: m/ R2 v* \
MCLKB<= MCLKB2;
$ ?9 q/ o. P5 w, [5 F7 r" C MCLK<= MCLKB | MCLKB2 | MCLKB3;
7 {2 h( O# [. D0 \4 H* v* G. m* s end
5 q7 H* y' [/ O; I% X' f7 w+ ~; t end
3 x$ n9 S5 V" b& t/ n8 Y$ Y4 Q