项目代码编译后打印如下信息:
& k' I5 A: m* ^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)
& R4 d! s Q! G( P7 F信号由MCLK到N2DSP这条通道限定了时针的最高速度只能到67.47MHz。
: s- [( X9 R+ V5 R f
查看相关代码中存在如下代码段:
+ B. E/ C* R$ j5 H0 ~) zalways @( posedge CLK48M )
# c# Y& d) ` X. a/ A! p& X begin
+ x2 @* g9 O! b; m CLKDIV<= CLKDIV + 1; //clock divider
2 B5 h4 C. n, u8 E3 x' z) F
end
8 D9 X; N3 h `! S& ?9 u
always @(posedge CLKDIV[5])
5 e/ ^" J( ]7 M) g4 ]5 r2 q
begin
! l5 y1 m6 `+ { d: H- ]( K+ }/ N
MCLKB3<= MCLK_EXT;
O; ?6 M1 f4 A3 l9 z9 x MCLKB2<= MCLKB3;
* v& O7 y" e* K8 g: N
MCLKB<= MCLKB2;
4 r" }! I$ P/ n
MCLK<= MCLKB | MCLKB2 | MCLKB3;
1 L9 M# o% q9 U5 b: i2 I8 q End
0 @1 o# A2 [3 |9 |4 ^& n( o该代码段是对MCLK_EXT做一个简单的防抖处理,相当于使用CLK48M衍生的一个时钟CLKDIV[5]。
# a; T, J& d1 O; A7 {4 bMCLK在其它模块中又使用CLK48M系统时钟做了一次锁存,于是相当于在两个CLK48M时钟之间要完成CLKDIV[5]的转换,再用CLKDIV[5]的上升沿去触发MCLK的转换,再输出到目的寄存器。此过程占用时间较长,而CLKDIV[5]所耗的时间显然是多余的。
- S( N# {4 B* I4 m; O2 i
修改代码后如下:
& a( X3 E( ?4 C2 d# n
always @( posedge CLK48M )
! h) m2 |5 O$ d* I8 |1 k: _
begin
( }+ s5 x; G- x CLKDIV<= CLKDIV + 1; //clock divider
# G# i6 w+ p* A Q. ~1 R- T2 S+ b
if(CLKDIV == 6'b100000)
3 x& o) R. h3 i' v: l8 o, p begin
. ?) }# S$ X8 B8 s' {/ [ MCLKB3<= MCLK_EXT;
+ F! h9 t: b% A" b4 i7 f# b MCLKB2<= MCLKB3;
4 J8 D z' C: ], D8 n5 z8 M
MCLKB<= MCLKB2;
6 j5 u7 b2 ~; g; P( Q8 e5 I
MCLK<= MCLKB | MCLKB2 | MCLKB3;
2 ^# W( V% C9 L. z0 `" |% J end
& Y8 B. Z Y) K* a R end
+ R, v" y( D6 L% C( r