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% oCtl_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