|
Dear all
: O1 }7 U( u$ V- F$ k小弟最近用VHDL在power pc平台上第一次設計一顆CPLD去控制整塊板子,
; f& F: P! R' K9 s裡面包含的功能有power/reset/LED control, hardware watchdog,; W* g1 n1 `$ Y
slide switch/push button detect, CPLD to CPU interrupt event," h5 i: I0 n$ [& T6 D* L
CPU read/write CPLD register這些功能,
1 D8 }4 y. F& G/ u, ]6 U5 _/ o在開發時,為了能夠快速的看一些裡面定義signal的狀態,
7 T) P* M5 W8 {4 ?就在外面接了7顆chip type LED做debug用,/ c$ y$ y" x) `9 T$ |1 I6 h$ a
而這7顆LED是拿來看slide switch/push button以及interrupt狀態,
$ L# n" I+ z; Q! A而slide switch/push button只要有動作都會發interrupt給CPU,
- e8 d1 ?* n' y2 ?: |這些功能都一一完成並且「各別」驗證後,才全部組合在同一個.vhd檔,
$ M, M8 c( C3 v' n/ c/ O而slide switch/push button的interrupt event "AND"起來後,. d, K& Q% W3 ]7 q5 }
再指到CPLD nINT pin,如 nINT <= nSLIDE_INT and nPUSH_INT;5 ^7 B8 G" J4 F8 Q3 F
只要這兩個功能的process同時compile,nINT在high or low level,$ m3 [9 F& g. V9 d/ V9 j
有機會發生抖動,或是有時會發生無法將nSLIDE_INT or nPUSH_INT拉high或low,
8 Y7 x4 p: e# N( n8 e" V& B但各別把各自的process mark起來不compile就會正常,$ ]" i2 T( s; \# t' _$ [# U! ~
在修改code以後,已經有解決這問題或應該算是改善吧,
/ o: V) i) E* p# \& I' l因為更重要的問題來了,我把debug LED拿掉,
8 R( x1 c3 x( G這兩個要發給CPU的interrupt功能就出問題,
" T7 g0 h w0 K只要把debug LED的東西留在code裡面,就正常了,
, k# g# l9 D5 J3 @0 C不知道板上個各位前輩有遇過這樣的問題嗎?
/ U @ {1 {' J- G7 t: t5 m6 ?% J# b. c% Q6 z, J! |. k
example:
+ U4 `9 G; {6 f6 X. h0 E% [2 U! T......; \' S7 O0 S3 `2 X
port(
5 N4 D+ L* N4 m$ W+ ~nINT : std_logig;3 {8 L3 t0 \6 |$ h2 p+ \5 @
LED_S : std_logic;2 q1 r X) u$ _- A. m8 p; A
LED_P : std_logic' c$ H# H6 C( M9 T' i+ S" P
);
' \0 I" _# d/ W: }5 X3 z1 l......3 z; ]) l }) H
signal nSLIDE_INT, nPUSH_INT, LED_INT, LED_SLIDE, LED_PUSH : std_logic;
6 q; @2 t- |3 U......" h4 w, g% e. D
begin# n) }) j7 c0 x9 X) J: G
nINT <= nSLIDE_INT and nPUSH_INT;7 Q& D5 a. c8 G2 W3 h0 e0 g! H+ T
LED_INT <= LED_SLIDE and LED_PUSH;# {1 Y7 O8 s- A; p |) q0 L3 Q
LED_SLIDE <= nSLIDE_INT;
3 f! \% ?$ D* F8 sLED_PUSH <= nPUSH_INT;
& l( v' n- ~# O! k) Z3 b......
" `6 ^8 u' @+ s; I; o1 s' o2 ?! i7 s(包含的process如下)* s1 N8 _* |' m/ z" Q6 H) Z8 b, D
power control process- c& M/ |* h9 G! F* \1 D, F, E, R
reset control process
9 M3 ~: `, a; [3 ]4 Ywatchdog process
/ o! c" t# n; Mread process
5 E+ X; @3 H+ z; f1 m2 Xwrite process' \( i) M) w# u# \' b9 Z
slide switch detect and de-bouncing process' N" F# C3 n: q2 j
push button detect process
6 Y) D, g) g% x+ d: H0 @/ wslide switch interrupt event process
1 X, e- Y# k4 ~/ l5 ~9 npush button interrupt event process+ J( s* u7 p# P5 L$ M. x
......
0 o5 h- {0 t. k* f& ^3 D+ P2 ]) d5 {2 O' T# |6 s
現在的code上面的寫法已經正常,
O+ ~+ a# E$ D2 e( H3 r但是只要把這三行都mark起來,
8 ?. d8 g7 |* e# c6 Y1 qLED_INT <= LED_SLIDE and LED_PUSH;
, O: i! L' N% C5 a1 xLED_SLIDE <= nSLIDE_INT;3 \+ A P( c4 _+ w# E
LED_PUSH <= nPUSH_INT;' t, b5 E+ F( z$ b
整個code動作就不正常了!9 y8 C+ T( M% [& ?+ b4 B
我是用Altera EPM570 -5ns那顆來做,
) Y* {" L% G+ C* u Y不知道說這麼多有沒有表達清楚,其實有很多問題想請教,7 z: U9 y' |, A
不過還是希望能夠先把這問題解決!3 |( S: {2 p( G# X3 L! j" l
希望各位能給小弟一些建議,謝謝! |
|