|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
多余时钟的引入
# T. Z3 a: | B: f9 L6 A5 B, s在设计时往往会遇到这种情况,需要对外部某个输入信号进行判断,当其出现上跳或下跳沿1 p9 S3 h3 f6 N$ P- L1 c
时,执行相应的操作,而该信号不像正常时钟那样具有固定占空比和周期,而是很随机,需
. v: n& t- w+ N% R* P# T; k要程序设计判断其上跳沿出现与否。这时,很容易写出如下程序: * p! ?( Q) N- B9 A
① process(Ctl_a) -- Ctl_a 即为该输入信号 ) Q6 `5 m/ k8 \4 V. T T
② begin ' O) [& M" g3 L2 g. M8 y% g0 N' A* ~; f
③ if Ctl_a ’event and Ctl_a= ’1 ’ then
) G O3 w( j. ?( p④ … … ; -- 执行相应操作 # ?: d+ |* ?+ m: q
⑤ end if ; 0 ? b" y$ }4 Y( O, o4 {. F: Z
⑥ end process; ) y4 J( l8 D4 X7 x& X. _& ~
由于出现第③行这类语句,综合工具自动默认 Ctl_a为时钟,某些 FPGA 更会强行将该输入
: i1 T9 J V$ b/ e- J约束到时钟引脚上。而设计者的初衷只是想将其作为下位机的状态输入以进行判断。上面的
]7 r' a( Z8 ^5 N. l程序容易造成多时钟现象,增加设计的难度。解决的办法可以如下,将 Ctl_a增加一级状态5 e D' b1 ^+ l: ~9 E# o4 L- h
Ctl_areg 寄存,通过对 Ctl_a和Ctl_areg 状态判断上跳与否,改正程序如下:
4 \" s. C! v* {( C d2 \1 V① process(clk)
6 t/ \5 {. \: `$ y, H9 F② begin ' V8 L$ }6 w0 [9 d* y8 d
③ if clk ’event and clk= ’1 ’ then # A0 K7 H$ ~) c0 l* f9 t
④ Ctl_areg<=Ctl_a;--产生相邻状态
W5 f- K5 H9 {5 c3 C⑤ if Ctl_areg=’0 ’ and Ctl_a= ’1 ’ then-- 上跳判断
$ P q+ N, B* Q) R) \5 e* A⑥ … … ; -- 执行相应操作 0 f8 C/ a; V u8 @7 V; Y
⑦ end if;
& } p+ j; g+ x- @1 J/ b⑧ end if; ( G3 @) ^$ o, B
⑨ end process;
7 V9 V4 e7 g; Z% [+ Q程序中第④行用以产生两个相邻状态,第⑤行对前后状态进行判断是否有上跳现象发生。其
4 u& H' T1 e$ U7 q中,需注意的是clk 的时钟频率应明显快于 Ctl_a信号的变化频率,以保证正确采样。 |
|