|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
多余时钟的引入 1 e) y+ _ L% b, d
在设计时往往会遇到这种情况,需要对外部某个输入信号进行判断,当其出现上跳或下跳沿+ v! x0 _: k" a/ {
时,执行相应的操作,而该信号不像正常时钟那样具有固定占空比和周期,而是很随机,需
% ~2 H, S$ ^2 C; X5 b% P要程序设计判断其上跳沿出现与否。这时,很容易写出如下程序:
7 Z( j) ]- A* e# z0 D① process(Ctl_a) -- Ctl_a 即为该输入信号
! j( d. b1 u7 g② begin
* v! |3 X( s; C0 u {③ if Ctl_a ’event and Ctl_a= ’1 ’ then ! a" d8 {9 M; r9 h' x) c* L7 t
④ … … ; -- 执行相应操作
( u1 v! r. Y0 o, @⑤ end if ; 8 ]1 G3 p7 g2 k# q1 U
⑥ end process; ) H; a3 _+ o7 x; [. c4 y# v. j
由于出现第③行这类语句,综合工具自动默认 Ctl_a为时钟,某些 FPGA 更会强行将该输入
" q) }6 w" }% y6 S; I, A4 @& [约束到时钟引脚上。而设计者的初衷只是想将其作为下位机的状态输入以进行判断。上面的
5 C1 P% b: V! i0 e% ?* _" m8 n5 o程序容易造成多时钟现象,增加设计的难度。解决的办法可以如下,将 Ctl_a增加一级状态
# C4 p! s! N" W& `" f( |4 C' M9 f& mCtl_areg 寄存,通过对 Ctl_a和Ctl_areg 状态判断上跳与否,改正程序如下:
& d' }$ O5 ^: ^' s5 e① process(clk) 4 O- \' m, W" F# H/ a0 o# E2 P
② begin
* @* @$ |( u6 t③ if clk ’event and clk= ’1 ’ then b$ c$ S+ L. e$ e; o# {4 k8 N
④ Ctl_areg<=Ctl_a;--产生相邻状态
( F2 R$ J2 R0 K, X8 G6 v" W) Y⑤ if Ctl_areg=’0 ’ and Ctl_a= ’1 ’ then-- 上跳判断
$ D+ z5 e. m. g- l" Y⑥ … … ; -- 执行相应操作 - Z7 v* ]2 L7 u3 c( R4 ^
⑦ end if;
9 p# C6 K. k* E9 t⑧ end if;
6 b' P8 t! Q I+ D2 h8 M6 ?4 b⑨ end process; ; u. x8 [& e3 M8 T
程序中第④行用以产生两个相邻状态,第⑤行对前后状态进行判断是否有上跳现象发生。其5 z- A# c- [9 E* O
中,需注意的是clk 的时钟频率应明显快于 Ctl_a信号的变化频率,以保证正确采样。 |
|