|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
多余时钟的引入
3 O2 R6 s3 B: v# D/ _在设计时往往会遇到这种情况,需要对外部某个输入信号进行判断,当其出现上跳或下跳沿
% N4 x% S" H4 K: i# D; f1 X# p时,执行相应的操作,而该信号不像正常时钟那样具有固定占空比和周期,而是很随机,需5 _3 S+ g: m# h+ N
要程序设计判断其上跳沿出现与否。这时,很容易写出如下程序:
) V; {5 _1 g, t$ ^/ i0 p( L/ Q9 {8 Z6 M① process(Ctl_a) -- Ctl_a 即为该输入信号
7 I# l, b4 I# U9 D2 b% x2 D② begin
; _0 J9 B; o. U8 N8 Q/ W③ if Ctl_a ’event and Ctl_a= ’1 ’ then ! P' t6 k) Y9 c0 \) ~) Q ~7 g
④ … … ; -- 执行相应操作
4 I# _- l+ @8 N) I, B4 H⑤ end if ;
* R; m( s" Z |; n: i& q+ R⑥ end process; , y! _/ r* ?# @6 p R/ m
由于出现第③行这类语句,综合工具自动默认 Ctl_a为时钟,某些 FPGA 更会强行将该输入$ u# ?! ^7 C1 B4 z
约束到时钟引脚上。而设计者的初衷只是想将其作为下位机的状态输入以进行判断。上面的7 r# A7 N9 S8 x6 L
程序容易造成多时钟现象,增加设计的难度。解决的办法可以如下,将 Ctl_a增加一级状态# t- ^/ ~, A/ P0 p# ~5 @ W) t
Ctl_areg 寄存,通过对 Ctl_a和Ctl_areg 状态判断上跳与否,改正程序如下: H9 }) O( \2 I0 j
① process(clk)
& s4 ]5 W, X# F② begin
3 ~" t% |) g8 |. t. m" Y- o③ if clk ’event and clk= ’1 ’ then
/ l- Y. P* Q! g2 S+ {8 J6 @④ Ctl_areg<=Ctl_a;--产生相邻状态
4 F c* v! z+ e. j' C9 e⑤ if Ctl_areg=’0 ’ and Ctl_a= ’1 ’ then-- 上跳判断
4 I1 c, d. \ y/ g5 D3 l: [⑥ … … ; -- 执行相应操作
' i% n' k% p1 K8 y9 ?⑦ end if;
: n' P7 H. e' T F⑧ end if;
6 g% d2 {1 L: e3 k⑨ end process;
/ A. e1 E: ]) d- J7 C3 T1 `5 ]程序中第④行用以产生两个相邻状态,第⑤行对前后状态进行判断是否有上跳现象发生。其3 o+ v E- j, s" f
中,需注意的是clk 的时钟频率应明显快于 Ctl_a信号的变化频率,以保证正确采样。 |
|