|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
多余时钟的引入 s8 t3 K. o# Y' Y7 C+ s0 O( ]2 [5 m7 M
在设计时往往会遇到这种情况,需要对外部某个输入信号进行判断,当其出现上跳或下跳沿
* q6 b1 p$ \: u9 T时,执行相应的操作,而该信号不像正常时钟那样具有固定占空比和周期,而是很随机,需
1 C- H5 ]: z9 g7 S- R. J% X" ^要程序设计判断其上跳沿出现与否。这时,很容易写出如下程序:
3 n. H7 F0 n% B) c) ~# t, B① process(Ctl_a) -- Ctl_a 即为该输入信号 ; l l' U) U, t
② begin : R/ Y3 L( w2 y) Z5 ?4 X* Q5 Z- f& h5 H
③ if Ctl_a ’event and Ctl_a= ’1 ’ then
# d/ H; ^ t2 J: e8 Y④ … … ; -- 执行相应操作
( Y3 u$ j! l8 V2 {8 I0 Z# A; N: ^% ^/ y⑤ end if ; ( Z5 a/ v% E. b" Q% B G4 n3 ~
⑥ end process; 7 ?( V' | T2 m K9 s
由于出现第③行这类语句,综合工具自动默认 Ctl_a为时钟,某些 FPGA 更会强行将该输入
( r. q% @9 _! B约束到时钟引脚上。而设计者的初衷只是想将其作为下位机的状态输入以进行判断。上面的
4 o M- `! k. J7 o8 A& F程序容易造成多时钟现象,增加设计的难度。解决的办法可以如下,将 Ctl_a增加一级状态* B7 O* B5 }/ I5 K/ E& a3 K
Ctl_areg 寄存,通过对 Ctl_a和Ctl_areg 状态判断上跳与否,改正程序如下:
2 u; X9 |) i6 A, m: V7 i5 A- g* t① process(clk)
+ e3 d, \5 [: [! w8 K② begin k% G" ~$ n3 k4 A
③ if clk ’event and clk= ’1 ’ then
% D5 e- E1 V' P2 z# }9 \4 {2 `④ Ctl_areg<=Ctl_a;--产生相邻状态
% x* q5 x2 ~5 X, t. A⑤ if Ctl_areg=’0 ’ and Ctl_a= ’1 ’ then-- 上跳判断
6 U! b ~' J& @⑥ … … ; -- 执行相应操作 3 ]+ X; O3 l( V; l! c/ U% y. J
⑦ end if; * p' y! U" o; G1 x- i" l
⑧ end if;
: a: P1 `3 B3 ^& L, ^* T4 T8 u⑨ end process;
( {9 c* Y3 V8 `7 o5 J Y程序中第④行用以产生两个相邻状态,第⑤行对前后状态进行判断是否有上跳现象发生。其
( a7 b M9 M2 g) i% c: [4 l7 h中,需注意的是clk 的时钟频率应明显快于 Ctl_a信号的变化频率,以保证正确采样。 |
|