|
Dear all, `& y" v' f8 ?: S3 i! Z D1 A
小弟最近用VHDL在power pc平台上第一次設計一顆CPLD去控制整塊板子,) Z8 ]% b. Y- p+ e
裡面包含的功能有power/reset/LED control, hardware watchdog,
( L- e3 U: Q/ A6 Fslide switch/push button detect, CPLD to CPU interrupt event,
j; i2 ? o# S- BCPU read/write CPLD register這些功能,& u7 D$ q* X" M. Z
在開發時,為了能夠快速的看一些裡面定義signal的狀態,. N: T7 E+ j3 O* j# ~
就在外面接了7顆chip type LED做debug用,
: U) h# F: E1 d v: o6 U而這7顆LED是拿來看slide switch/push button以及interrupt狀態,+ B9 C. [7 @: j* y5 P. D8 h
而slide switch/push button只要有動作都會發interrupt給CPU,
# q4 o. }4 x1 g這些功能都一一完成並且「各別」驗證後,才全部組合在同一個.vhd檔,
( e P$ @5 d1 u5 D- I- E而slide switch/push button的interrupt event "AND"起來後,
& ?, x( u* `4 P% Q7 h% ?再指到CPLD nINT pin,如 nINT <= nSLIDE_INT and nPUSH_INT;
+ ^3 a* g+ u" i6 U1 D: V: B只要這兩個功能的process同時compile,nINT在high or low level,+ s7 L5 ~% v: R* e6 e1 ?1 N3 E! D
有機會發生抖動,或是有時會發生無法將nSLIDE_INT or nPUSH_INT拉high或low,
) G4 G7 {5 o0 \. {* Q+ S但各別把各自的process mark起來不compile就會正常, e# z$ P: h) d: j
在修改code以後,已經有解決這問題或應該算是改善吧,
6 P+ S: O, m. F& o5 E5 n因為更重要的問題來了,我把debug LED拿掉,- ?: S$ |0 l2 Z) D5 V( ~
這兩個要發給CPU的interrupt功能就出問題,
! ~+ [" ^: G9 u3 ?只要把debug LED的東西留在code裡面,就正常了,
& K8 Z* @: I, k1 Y. l, `" m$ C不知道板上個各位前輩有遇過這樣的問題嗎?
/ v% [$ f( t. X/ i& s+ T* C- [6 h, ]$ [3 V2 X; x. g" r. z" j) A; j4 u
example:( z. i3 l* t9 b6 x
......8 @4 M/ e D: U% U2 ^: P- B4 z
port(# ?/ S2 q& f5 C$ c& F+ @
nINT : std_logig;4 g' |. f% j0 `0 f5 `9 s
LED_S : std_logic;: K9 G, b9 f/ @8 d9 r
LED_P : std_logic9 N& o) \% Q L$ `+ P
);
- u- P. y& ]. Z4 ]2 b" U+ T! M& N......
# ~3 \. }$ J9 T) W) b! Xsignal nSLIDE_INT, nPUSH_INT, LED_INT, LED_SLIDE, LED_PUSH : std_logic;
5 s3 a' t; s, l0 |0 m8 {/ Y' c......
N0 o- _6 W: `begin
$ I8 i" L# B1 T4 InINT <= nSLIDE_INT and nPUSH_INT;3 F" T3 X/ t( }# C
LED_INT <= LED_SLIDE and LED_PUSH;
0 M" }$ M% M" X: U+ W3 ]2 ?LED_SLIDE <= nSLIDE_INT;
( P* M( Y% L% P2 z- B2 c- y" XLED_PUSH <= nPUSH_INT;
l# ?' I1 v. v/ O o......
: N& |9 [! Q: y(包含的process如下)
! o( m0 |* D2 g; kpower control process
' f/ {; Z" e3 r6 Zreset control process0 s K; K, t6 H F
watchdog process. P/ S: V6 T: T+ Z J7 u
read process5 G, L% {9 d- J
write process
: [0 g( \# }" M% I$ p' Zslide switch detect and de-bouncing process5 F: B9 R0 e# G! @) i" L ^
push button detect process/ X# A% o! a0 H
slide switch interrupt event process
9 i; W: X \2 [1 mpush button interrupt event process' y: {9 y! k! @
......
: |; r+ f# N$ g, q7 X2 J/ L. \) M; m* x6 d
現在的code上面的寫法已經正常,8 K7 o# ^: D9 x, q# z* W
但是只要把這三行都mark起來,
6 u6 n$ [/ o% YLED_INT <= LED_SLIDE and LED_PUSH;9 z7 ]9 ^' f1 d, E+ K8 u' n
LED_SLIDE <= nSLIDE_INT;
. V" T3 n& }) f. C: HLED_PUSH <= nPUSH_INT;
6 ?" j! E1 J# X; V# F/ j3 b. u整個code動作就不正常了!8 C' `# L7 ^" j( ]" @
我是用Altera EPM570 -5ns那顆來做,
6 E' o9 H" C2 }不知道說這麼多有沒有表達清楚,其實有很多問題想請教,
* Q: c7 Q( O' V( `5 A; J! `1 c不過還是希望能夠先把這問題解決!
4 L3 x& H2 D$ z$ ]! e希望各位能給小弟一些建議,謝謝! |
|