|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
多余时钟的引入 8 B# e4 U, |& F, A2 M5 Q% Z( Y
在设计时往往会遇到这种情况,需要对外部某个输入信号进行判断,当其出现上跳或下跳沿
" C* q5 a% y# m7 [! e0 N时,执行相应的操作,而该信号不像正常时钟那样具有固定占空比和周期,而是很随机,需6 A! I' F- g# ?5 Z
要程序设计判断其上跳沿出现与否。这时,很容易写出如下程序: " F+ g" _( F7 E; |3 b1 Q0 h2 v
① process(Ctl_a) -- Ctl_a 即为该输入信号
9 u n9 F% R- |7 k- g( H, \1 @3 w② begin ) y# l7 k% e! k8 Z- |
③ if Ctl_a ’event and Ctl_a= ’1 ’ then ; ?! \$ O2 N6 F# C, t
④ … … ; -- 执行相应操作 $ L3 o2 _% w8 G) J5 r
⑤ end if ;
0 }; k% ~- T' F& F⑥ end process; 6 Y, L; d& J; i2 a+ a
由于出现第③行这类语句,综合工具自动默认 Ctl_a为时钟,某些 FPGA 更会强行将该输入* X% U( M6 W F8 H5 I* S
约束到时钟引脚上。而设计者的初衷只是想将其作为下位机的状态输入以进行判断。上面的
- q: i) @" l) w/ p- g程序容易造成多时钟现象,增加设计的难度。解决的办法可以如下,将 Ctl_a增加一级状态* K; e* P8 Y# @% d! ^0 [. n
Ctl_areg 寄存,通过对 Ctl_a和Ctl_areg 状态判断上跳与否,改正程序如下:
5 y$ K& S4 M/ u4 w1 i$ r① process(clk) 8 H* M) K7 G2 D. Y* S
② begin * Y5 i0 a: p& ~% d, ]+ q" N
③ if clk ’event and clk= ’1 ’ then , d* f6 r" W3 |" i2 I d
④ Ctl_areg<=Ctl_a;--产生相邻状态
# i3 p. n$ n* R3 H( g⑤ if Ctl_areg=’0 ’ and Ctl_a= ’1 ’ then-- 上跳判断
# s* j' C, u: a⑥ … … ; -- 执行相应操作 3 [( I+ L# v; c; |( S5 c8 D& i9 T
⑦ end if; O+ E: v0 \% |7 `& S# `
⑧ end if; ( j4 y' ~' O" w' t2 O) m
⑨ end process; ; {8 b6 e# j" D
程序中第④行用以产生两个相邻状态,第⑤行对前后状态进行判断是否有上跳现象发生。其/ T2 Q' I) l6 G( \2 G- V
中,需注意的是clk 的时钟频率应明显快于 Ctl_a信号的变化频率,以保证正确采样。 |
|