|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
多余时钟的引入 + ?( L: j; w% u
在设计时往往会遇到这种情况,需要对外部某个输入信号进行判断,当其出现上跳或下跳沿# Y6 d& R' v8 c
时,执行相应的操作,而该信号不像正常时钟那样具有固定占空比和周期,而是很随机,需5 Z0 H( z8 Y0 k
要程序设计判断其上跳沿出现与否。这时,很容易写出如下程序: + G2 h$ e7 i% V6 B( T) j. a& m
① process(Ctl_a) -- Ctl_a 即为该输入信号 3 I) }" H7 _2 M) P) D& e0 D0 Q& k
② begin & c0 @, `% N, z8 \' o$ y8 C" ?
③ if Ctl_a ’event and Ctl_a= ’1 ’ then ) X' r- T1 E1 M; o; H
④ … … ; -- 执行相应操作
1 r+ i! O% I5 z+ W⑤ end if ; , q% C0 L; q: i: m6 m2 `
⑥ end process;
; _" {- W7 E0 O9 g: o! E/ }由于出现第③行这类语句,综合工具自动默认 Ctl_a为时钟,某些 FPGA 更会强行将该输入2 f$ h8 x5 G. k! {, K& O6 Q( W" V, {
约束到时钟引脚上。而设计者的初衷只是想将其作为下位机的状态输入以进行判断。上面的
2 P/ H3 W. q A6 R" x程序容易造成多时钟现象,增加设计的难度。解决的办法可以如下,将 Ctl_a增加一级状态
7 O% l! b, i8 W' }0 _* A. wCtl_areg 寄存,通过对 Ctl_a和Ctl_areg 状态判断上跳与否,改正程序如下: 0 I: G' z8 _% L7 L' y
① process(clk) 0 U% F# l9 `$ Y3 |+ ]; k
② begin 5 h$ v& ^; ?! U4 l: }! O
③ if clk ’event and clk= ’1 ’ then
! m4 B; g4 W6 Q# a2 s" z④ Ctl_areg<=Ctl_a;--产生相邻状态 9 Y$ o) O- o! b7 ]! u3 }3 R
⑤ if Ctl_areg=’0 ’ and Ctl_a= ’1 ’ then-- 上跳判断
. R6 |& c7 f9 y$ ?4 d⑥ … … ; -- 执行相应操作 8 J C" J$ C) o& l+ Z2 g- W
⑦ end if; 0 H. r9 K- k- E! O9 S* B) N' q
⑧ end if; 6 t- j- O" j/ b6 C; Q0 i3 ?. N
⑨ end process;
0 |6 V2 r9 h0 L$ b3 B程序中第④行用以产生两个相邻状态,第⑤行对前后状态进行判断是否有上跳现象发生。其, P1 Q1 Y7 n& Y! v1 {$ W
中,需注意的是clk 的时钟频率应明显快于 Ctl_a信号的变化频率,以保证正确采样。 |
|