|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
多余时钟的引入 ) r9 I4 W+ A7 z5 m2 Q* B; z
在设计时往往会遇到这种情况,需要对外部某个输入信号进行判断,当其出现上跳或下跳沿- v$ ^1 g4 W5 Z4 `0 L
时,执行相应的操作,而该信号不像正常时钟那样具有固定占空比和周期,而是很随机,需
4 N! `& a, B: O: N, P" {1 q要程序设计判断其上跳沿出现与否。这时,很容易写出如下程序: 3 e, v6 f5 N" F8 l' U! U; [7 G8 _
① process(Ctl_a) -- Ctl_a 即为该输入信号
9 C! R B! x! @3 |- N/ n② begin
. K, l" h* h# d③ if Ctl_a ’event and Ctl_a= ’1 ’ then
& ~* Q6 U# ^: T) n# O( t④ … … ; -- 执行相应操作
B3 S' Y9 U5 l9 m6 ~⑤ end if ; - d i. f7 |- o$ \
⑥ end process;
8 y. s b5 W5 Z2 B- e R5 T) D; d由于出现第③行这类语句,综合工具自动默认 Ctl_a为时钟,某些 FPGA 更会强行将该输入; o4 S( H* v/ @3 B
约束到时钟引脚上。而设计者的初衷只是想将其作为下位机的状态输入以进行判断。上面的: i9 a% V* I) p
程序容易造成多时钟现象,增加设计的难度。解决的办法可以如下,将 Ctl_a增加一级状态
$ j3 z4 W" X' B& ?: a6 @! JCtl_areg 寄存,通过对 Ctl_a和Ctl_areg 状态判断上跳与否,改正程序如下:
4 w' Q$ ^/ r' \; B5 ^3 ^① process(clk) , o2 j% n, i: y
② begin
6 p5 S \) R( V! e% {③ if clk ’event and clk= ’1 ’ then
4 Q$ H& s$ Y+ b0 ?8 P④ Ctl_areg<=Ctl_a;--产生相邻状态 % s# b. V4 D2 C9 ?
⑤ if Ctl_areg=’0 ’ and Ctl_a= ’1 ’ then-- 上跳判断
8 I- ]7 M! O7 }3 h' w& z⑥ … … ; -- 执行相应操作
9 R4 I( g- S) L; x' e/ e+ @8 l1 H⑦ end if;
# i& w1 m/ X& J! N# j% V: v; U⑧ end if;
' N4 ^* Y1 U2 T% r⑨ end process; 3 q6 M9 n2 C$ H
程序中第④行用以产生两个相邻状态,第⑤行对前后状态进行判断是否有上跳现象发生。其
% E1 h7 C+ ~) |中,需注意的是clk 的时钟频率应明显快于 Ctl_a信号的变化频率,以保证正确采样。 |
|