EDA365电子工程师网
标题:
VHDL编程心得------多余时钟的引入 问题
[打印本页]
作者:
alec4050
时间:
2012-3-2 09:23
标题:
VHDL编程心得------多余时钟的引入 问题
多余时钟的引入
7 j/ W. u$ J a. a; t( o1 }$ O
在设计时往往会遇到这种情况,需要对外部某个输入信号进行判断,当其出现上跳或下跳沿
- `/ H( J5 \+ q" A+ Q
时,执行相应的操作,而该信号不像正常时钟那样具有固定占空比和周期,而是很随机,需
/ S8 [2 O' S; \7 `& A. T
要程序设计判断其上跳沿出现与否。这时,很容易写出如下程序:
9 Q8 b* `& G, R) G% X) ^
① process(Ctl_a) -- Ctl_a 即为该输入信号
0 o% I: B2 r$ k7 H/ w7 ?
② begin
! \; ]- N* c* B3 H1 [# Q( s4 S
③ if Ctl_a ’event and Ctl_a= ’1 ’ then
" s- @' V" `; q( @5 S! k. Q- O2 ^
④ … … ; -- 执行相应操作
: O# }. P2 j9 I, H- T/ C
⑤ end if ;
- u7 d, `" q# [$ i; h* Q) H
⑥ end process;
9 W8 l3 K6 j. T! B! A( ^8 `
由于出现第③行这类语句,综合工具自动默认 Ctl_a为时钟,某些 FPGA 更会强行将该输入
" A" l) i! [0 k3 K3 }
约束到时钟引脚上。而设计者的初衷只是想将其作为下位机的状态输入以进行判断。上面的
' i* G, X6 x6 ]7 x+ `" Z0 j; W
程序容易造成多时钟现象,增加设计的难度。解决的办法可以如下,将 Ctl_a增加一级状态
9 o8 r. J2 h$ V* R$ x: ?0 V/ V+ T% o
Ctl_areg 寄存,通过对 Ctl_a和Ctl_areg 状态判断上跳与否,改正程序如下:
1 {, L0 s9 Y5 T& Q2 B$ p$ M0 L
① process(clk)
' `1 P+ d! p% _9 ^
② begin
* d3 L0 n- k, F: j7 A6 W
③ if clk ’event and clk= ’1 ’ then
0 P9 x3 Y2 \6 }: i
④ Ctl_areg<=Ctl_a;--产生相邻状态
^) `2 [: i: f* l9 y/ \+ @
⑤ if Ctl_areg=’0 ’ and Ctl_a= ’1 ’ then-- 上跳判断
* M0 X) K% q. s b* \# D. |; P* S; g
⑥ … … ; -- 执行相应操作
* a2 f) J( v9 ^: L) u$ |& c
⑦ end if;
/ j, Y' S- i3 V/ j
⑧ end if;
# J* y# ~% r6 _- B# c( m
⑨ end process;
V( X8 ]0 i! m4 N6 H) \0 ]
程序中第④行用以产生两个相邻状态,第⑤行对前后状态进行判断是否有上跳现象发生。其
3 r; o( E" m$ ?, u) Y) Q
中,需注意的是clk 的时钟频率应明显快于 Ctl_a信号的变化频率,以保证正确采样。
作者:
小雨点哦
时间:
2012-3-3 10:45
看了 也懂了点 步奏 挺明了的 支持一下 楼主的分享
欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/)
Powered by Discuz! X3.2