|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
多余时钟的引入
( d6 Q5 K4 H& Q* ?7 C, W* }在设计时往往会遇到这种情况,需要对外部某个输入信号进行判断,当其出现上跳或下跳沿
$ h3 }8 s$ k+ c8 {5 Y# j0 w时,执行相应的操作,而该信号不像正常时钟那样具有固定占空比和周期,而是很随机,需7 E7 z7 g! I' w p$ {! P6 a J Z0 B
要程序设计判断其上跳沿出现与否。这时,很容易写出如下程序: 8 C. V% I" k3 V/ s, q3 U( C
① process(Ctl_a) -- Ctl_a 即为该输入信号 ) z1 ?/ Z. X( p9 ]
② begin
3 j( o: _& B( O9 U# b③ if Ctl_a ’event and Ctl_a= ’1 ’ then
1 e5 S' \) C8 Y' T④ … … ; -- 执行相应操作
, ?. s( M ~/ v* Q⑤ end if ;
$ S8 [' d7 o0 D( F- W⑥ end process; ; I/ X3 C% l& @" E2 `' S
由于出现第③行这类语句,综合工具自动默认 Ctl_a为时钟,某些 FPGA 更会强行将该输入+ P9 T5 r. T/ P4 S! p4 w* R
约束到时钟引脚上。而设计者的初衷只是想将其作为下位机的状态输入以进行判断。上面的
& J9 _+ @/ r1 T5 k8 L* L/ o) Z程序容易造成多时钟现象,增加设计的难度。解决的办法可以如下,将 Ctl_a增加一级状态: @* Z' a: F6 q4 m- v
Ctl_areg 寄存,通过对 Ctl_a和Ctl_areg 状态判断上跳与否,改正程序如下:
( p- `8 p& W; I① process(clk)
: Q8 P$ g8 \9 d. _② begin ' U( M; l7 c, M% U
③ if clk ’event and clk= ’1 ’ then
+ E* r* O. l; i# w. K④ Ctl_areg<=Ctl_a;--产生相邻状态 8 `$ w' i% k) K6 n+ O( a* i
⑤ if Ctl_areg=’0 ’ and Ctl_a= ’1 ’ then-- 上跳判断
% I& a6 i; e) |% y/ f⑥ … … ; -- 执行相应操作 6 l" y0 i. o$ H! n
⑦ end if;
8 ^% x! s* o9 O5 B! |2 n⑧ end if; ; R1 I+ ~1 @! s3 K( D$ y* f
⑨ end process; 9 O4 s. b% L$ |, c) e
程序中第④行用以产生两个相邻状态,第⑤行对前后状态进行判断是否有上跳现象发生。其$ q! L# C7 y' c+ {" E9 F
中,需注意的是clk 的时钟频率应明显快于 Ctl_a信号的变化频率,以保证正确采样。 |
|