2 环路部件的设计
/ G( f; k, ^! s- L5 d这里重点介绍数字环路滤波器的设计。数字环路滤波器是由变模可逆计数器构成。在ud的控制下,当j=0时,对时钟Mf0进行"加"计数;当j=1时,进行"减"计数。可逆计数器的计数容量(模数k)可以利用A、B、C、D四位进行预置,从而方便地改变模数。其预置模数的范围为,当D、C、B、A在0001~1111取值时,相应模数的变化范围是23~217。可见,可逆计数器的长度能够根据模数k值的大小来实现数字编程控制。取D、C、B、A为0001时,K=23,计数器长度只有三级,因而可以扩大捕捉带,缩短锁定时间。在D、C、B、A取1111时,K=217,计数器长度变为十七级,这时捕捉带缩小,缩定时间延长。变模可逆计数器的VHDL设计程序如下:
6 W, e( a& T3 c( Elibrary ieee
G4 z% A0 h1 l* {% N" @( \, Yuse ieee.std_logic_1164.all
, a$ M) m, w8 c, F' Fuse ieee.std_logic_unsigned.all
{7 l: _; t5 ?* z2 m; o+ {2 eentity count_k is2 h0 ?$ F, U: m9 Z" R" [% A
port clk j en d c b a in std_logic1 n! \, ^( B0 \: U# J- ~0 l
r1 r2 out std_logic : o$ k8 B( P2 x) R! S
end- n0 z3 G& a$ v1 m% d8 w
architecture behave of count_k is
- b# O; K$ O% D( p* b: xsignal cq k mo std_logic_vector 16 downto 0
- ]* y# v5 s+ l' \, t4 Asignal cao1 cao2 std_logic
2 Q- K; n8 C: R+ T- D p7 D. ^signal instruction std_logic_vector 3 downto 0
" Q+ E) \/ e: {. mbegin
* a# N: s7 R; l8 K( G( Oinstruction<=d & c & b & a4 F) {6 D% k' U7 I5 V. t# O% {
with instruction selectmo <=″00000000000000111″ when ″0001″
0 e# D- k( i2 X( I″00000000000001111″ when ″0010″- C h; ?; h# R
″00000000000011111″ when ″0011″
7 f3 ^" _1 V1 ^0 \- P' d9 N( y! J″00000000000111111″ when ″0100″
7 @5 z5 @( N" _6 A( f″00000000001111111″ when ″0101″
! k% `& E" b& j- G″00000000011111111″ when ″0110″ t) R9 Y) u5 g* C
″00000000111111111″ when ″0111″
; [: W2 v" [) a″00000001111111111″ when ″1000″
0 R! W n& h0 ?+ l″00000011111111111″ when ″1001″
$ ?: E" h; G: |! C6 K& {″00000111111111111″ when ″1010″( G8 ^# j; q5 _, J% [* I7 {0 r
″00001111111111111″ when ″1011″
* u7 {4 S- Y7 d$ z7 v3 B″00011111111111111″ when ″1100″4 y+ S! Q4 b0 b0 P
″00111111111111111″ when ″1101″6 J4 \' v: U; L+ K; `
″01111111111111111″ when ″1110″
# H9 K, c1 c. l7 w0 `+ i″11111111111111111″ when ″1111″
# w% v7 M( O1 b* `″00000000000000111″ when others, h# e" h9 i. t. P! z/ ^
process clk en j k cq & S3 M" m$ k+ G7 M( W
begin' j0 w4 }! ^! Z6 s' w( r4 t: ?
if clk'event and clk='1' then4 J" J8 ^- ]( {6 g3 ^ ?
k<=mo L0 A# d9 ?! d9 a+ o4 {0 e7 p
if en='1' then
! J" ]8 V0 j/ j4 b! eif j='0' then
4 [9 u& f1 Q4 h' S" P6 [if cq<k then cq<=cq+1
7 f+ Z9 S0 x- |# L: `' C' s$ g! melse cq<=others=>'0'
: [, n; C) @7 i6 B4 Tend if: Y; T) A0 k% L2 b# i/ ^
else
0 V& I) \2 Z& |% {, Z% ?2 A" dif cq>0 then cq<=cq-1
% @" ~" }8 h( |9 v! g1 |0 ?! Xelse cq<=k7 m# u, V, H) b" x! l( o/ |6 o
end if J' [5 [: i) s6 P5 ^8 ]% I
end if; O. _9 a0 _, G# P
else cq<=others=>'0'
. f3 Z8 U# w1 P* N( A0 t. `- iend if9 R4 k% ~3 c8 ?: H% K
end if% P$ C7 o' s2 B4 N
end process process en j cq k
$ O: J! i0 j9 E7 q8 N' ~begin
( n' \! G0 k) C; A% p( Y% q( A( bif en='1' then
1 y" x! S; |' j. s' x" g4 E9 L! [if j='0' then$ j1 j* v8 E, Z/ r
if cq=k then cao1<='1'
. Y0 m; @* E& @$ J8 a! Welse cao1<='0'+ ]2 q8 c; [% G! Z+ t! U
end if
6 {+ t: u! u9 Scao2<='0') a8 d8 j' U4 z
else; h) t3 ]9 L; j
if cq=″00000000000000000″then cao2<='1'
: A5 O7 ]* t2 F( a; felse cao2<='0'
4 ]: m# @& z& q: j8 C: g* D" Qend if& z7 O' u5 m0 C, d
cao1<='0'
* i- l2 o+ H& n1 l! dend if+ k1 A; {( u; S6 N& k4 G
else cao1<='0' cao2<='0'
- P9 b* o; _# I' `% yend if' v; b- O1 ` Q: N8 `9 p' M7 n7 t# \
end process
0 ~( a, l1 Q: @* S6 O; Hr1<=cao1 r2<=cao2
/ M0 Z | }. A9 cend behave. p: ~9 c+ H1 L/ o1 P. b
根据对其他环路部件的功能分析,也可以设计出相应的VHDL程序。 |
其中图5是取k=25时的系统仿真波形,由图中可见,u1和u2达到锁定状态时的仿真时间是175μs。图6是取k=28时的系统仿真波形,在这种情况下,u1和u2达到锁定状态时的仿真时间是1.04ms。显然,模k愈大,环路进入锁定状态的时间愈长。
( ?2 M) p8 K3 h: {7 z, Q$ R, @! z1 l7 y+ J% R; O! p
值得指出的是,在环路锁定状态下,由于可逆计数器的连续计数,或在噪声的干扰下,会产生进位和借位脉冲。如果k值取得太小,则可逆计数器因频繁地循环计数而产生进位或借位脉冲,这就导致了在环路的输出端出现相位抖动。为了减少这种相位抖动,k值必须取大于M/4。* l9 r0 V; ]+ I2 U
由以上分析可知,模k的取值要适当。k取得大,对抑制噪声、减少相位抖动有利,但同时又加大了环路进入锁定状态的时间。反之,k取得小,可以加速环路的锁定,而对噪声的抑制能力却随之降低。
5 u2 `8 w5 X% O1 h; j4 I7 O' m5 j
采用VHDL设计全数字锁相环路,具有设计灵活、修改方便和易于实现的优点,并能够制成嵌入式片内锁相环。该类数字锁相环路中计数器的模数可以随意修改。这样,就能够根据不同情况最大限度地、灵活地设计环路。 |