|
Dear all
9 X( V4 {1 W5 W# Y0 w6 f小弟最近用VHDL在power pc平台上第一次設計一顆CPLD去控制整塊板子,
) w$ m8 j! p6 ]) u* L' p裡面包含的功能有power/reset/LED control, hardware watchdog,
4 O+ `2 [6 p6 ?4 t/ I8 q4 Vslide switch/push button detect, CPLD to CPU interrupt event,
8 ?! P9 }( O1 h @: sCPU read/write CPLD register這些功能,0 Y+ T: ?9 P; x% y4 V$ u! z
在開發時,為了能夠快速的看一些裡面定義signal的狀態,
, ]. F: t8 M% I% C* d就在外面接了7顆chip type LED做debug用,
; r; W/ c6 c, R4 J而這7顆LED是拿來看slide switch/push button以及interrupt狀態,
$ h8 @/ I( v; Y- ]而slide switch/push button只要有動作都會發interrupt給CPU,
; S1 ?! Z# E" b" k4 P3 p- c1 P這些功能都一一完成並且「各別」驗證後,才全部組合在同一個.vhd檔,3 K1 U/ \) u$ ?; b, ]2 H; ?- B2 M
而slide switch/push button的interrupt event "AND"起來後,
: z% T! b- ?/ A8 J6 w: ?1 s0 p再指到CPLD nINT pin,如 nINT <= nSLIDE_INT and nPUSH_INT;, Z1 w4 f" \9 U! I- }
只要這兩個功能的process同時compile,nINT在high or low level,
) o$ a. m: \& ?" w$ v: Q% ?* o有機會發生抖動,或是有時會發生無法將nSLIDE_INT or nPUSH_INT拉high或low,
1 l' K' |1 z1 o) t( L7 r8 g但各別把各自的process mark起來不compile就會正常,
8 t* L7 D4 c& P- z在修改code以後,已經有解決這問題或應該算是改善吧,/ B N- _: `4 p& k! m: I/ c& n% h
因為更重要的問題來了,我把debug LED拿掉,
4 Y* q% K: ^2 q& X這兩個要發給CPU的interrupt功能就出問題,/ y/ \ u& ]8 [( ]; ?% h2 I
只要把debug LED的東西留在code裡面,就正常了,
3 U' ]0 a( o D8 ~5 Z, f% [/ `不知道板上個各位前輩有遇過這樣的問題嗎?
v) b9 L- Q m! c1 z: U5 ?% e. I# a. b0 s
example:
! y) N2 Q2 @6 D: J1 i* r......3 J( _9 ^% B7 B8 B) L3 R4 T& R
port(
! N9 M/ Z% s9 d( J" m: n- ?2 mnINT : std_logig;- o/ | e( t9 \& v$ A
LED_S : std_logic;% ?. I' J4 H/ U' K
LED_P : std_logic
+ p3 K. s2 G; K6 e);- } e0 P" {+ f7 \$ V% B6 ]0 U
......1 |+ H$ z. l" X* C1 k5 e+ h
signal nSLIDE_INT, nPUSH_INT, LED_INT, LED_SLIDE, LED_PUSH : std_logic;
9 p8 k1 J) e/ e; {! s4 C......
# Z! N' B2 x' n8 Rbegin4 `. R, Q$ P. r; h9 w4 k9 i
nINT <= nSLIDE_INT and nPUSH_INT;: e. h/ z* E" c( x- N+ n( Y
LED_INT <= LED_SLIDE and LED_PUSH;
( n. x; |" Q2 _. cLED_SLIDE <= nSLIDE_INT;7 R0 n# J" G8 Y j U" n! d! _
LED_PUSH <= nPUSH_INT;
9 }) `' H! ~. X. O& D6 u......! t3 e' j) d9 ^! W$ F
(包含的process如下)% D( L) E7 j. v. t- S; F5 \
power control process8 i# R6 }) e% S; e; w; d- ]- |
reset control process- u7 W# s8 w- @% p. h: `4 |
watchdog process
" U6 g1 Q% L1 [( h4 lread process
! l, e3 b( q% @6 wwrite process
: _7 r, }$ B* Z4 M0 v- p: T; Yslide switch detect and de-bouncing process
$ P5 ], W1 s5 W% Q: l' r% ]& {push button detect process( j1 u2 m7 J) n- t7 U
slide switch interrupt event process6 r6 f, k* d, |* T, A
push button interrupt event process" q& ?( ?# @/ x9 {6 y/ k
......; q4 q$ j9 J, [- m# C: I# d
" S/ ?% u$ ], ]. E {現在的code上面的寫法已經正常,
. |7 R$ X+ y8 J6 c5 B. D但是只要把這三行都mark起來,6 @% l9 k- a/ w0 _
LED_INT <= LED_SLIDE and LED_PUSH;( Q1 N" V9 Z* _/ u
LED_SLIDE <= nSLIDE_INT;
/ T F1 `+ p7 s/ p9 T. Z* F# I$ MLED_PUSH <= nPUSH_INT;
4 n/ ^- S2 v, V+ T整個code動作就不正常了!9 T+ O1 l& I# }
我是用Altera EPM570 -5ns那顆來做,
: z. v$ T2 x# z) A; N不知道說這麼多有沒有表達清楚,其實有很多問題想請教,
& E6 A) `6 n) P3 m! Y! M0 h6 z8 [不過還是希望能夠先把這問題解決!) K3 ?8 E' i4 ^, O, b- p/ l
希望各位能給小弟一些建議,謝謝! |
|