|
Dear all* a9 r* b# R4 A) L/ M% q# T# F
小弟最近用VHDL在power pc平台上第一次設計一顆CPLD去控制整塊板子,
$ Y# i+ @3 ]( k! b5 X裡面包含的功能有power/reset/LED control, hardware watchdog,
; W6 x$ C# I2 ] |% ~+ vslide switch/push button detect, CPLD to CPU interrupt event,# W( X7 ?* L6 j, ~" W% Z
CPU read/write CPLD register這些功能,' _7 M( N* C8 Q% |
在開發時,為了能夠快速的看一些裡面定義signal的狀態,$ V, @" S2 h; K/ @4 p. I
就在外面接了7顆chip type LED做debug用,
$ {/ r/ L7 A' v- U. z5 o而這7顆LED是拿來看slide switch/push button以及interrupt狀態,
: ?+ G# T9 N+ K9 Y# Q! l% F. y$ t而slide switch/push button只要有動作都會發interrupt給CPU,0 B' z6 m4 e6 \1 i5 X
這些功能都一一完成並且「各別」驗證後,才全部組合在同一個.vhd檔,
4 R% [5 A) ~7 B( x0 c而slide switch/push button的interrupt event "AND"起來後,
0 `& D7 E1 ~/ I+ e" M' ]% D再指到CPLD nINT pin,如 nINT <= nSLIDE_INT and nPUSH_INT;3 R( b1 r- `. e6 ^) X% j! N
只要這兩個功能的process同時compile,nINT在high or low level,
m/ N) J) h, T k# K& N有機會發生抖動,或是有時會發生無法將nSLIDE_INT or nPUSH_INT拉high或low,% a4 Z& ]% I* y0 J$ c2 @
但各別把各自的process mark起來不compile就會正常,
' A0 F) ? d1 T( r在修改code以後,已經有解決這問題或應該算是改善吧,
, T! f; k! ^, n& ~' ?% S% z) V因為更重要的問題來了,我把debug LED拿掉,
8 F$ T; \4 v$ y) G這兩個要發給CPU的interrupt功能就出問題,
8 G" h# l ? j! e: X9 ?% ^, m只要把debug LED的東西留在code裡面,就正常了,
* v- m) h3 r2 f; E) S不知道板上個各位前輩有遇過這樣的問題嗎?1 r5 ^5 G2 n9 q5 Z+ |
7 R( t: J$ @8 e8 j$ wexample:
& E- [9 W! A& b) r......" c7 ~+ R$ a* p6 p- w7 u
port(* l0 n1 B& I; Y( `
nINT : std_logig;
7 c+ H( w! b* U1 t) g9 ~. v6 HLED_S : std_logic;
. o7 }& t, x* y9 _# aLED_P : std_logic
6 r- z/ }7 P6 |& j);4 q- h, t# p0 }; q3 g! b
......
1 q# T1 Y8 g: ?( p, B4 Asignal nSLIDE_INT, nPUSH_INT, LED_INT, LED_SLIDE, LED_PUSH : std_logic;
+ @" W% j5 Q( r......, C( P F: `0 w% B
begin
8 }- N/ l, t# SnINT <= nSLIDE_INT and nPUSH_INT;
; Q' y. j j8 h' |# T5 NLED_INT <= LED_SLIDE and LED_PUSH;: i |$ Q! |+ Z* i5 f, |9 p: X
LED_SLIDE <= nSLIDE_INT;0 |+ h) L$ l- ?9 c7 |6 D
LED_PUSH <= nPUSH_INT;
8 N+ S: V# G8 ]0 I A3 q......& D+ L5 z$ I3 L' ~4 B) b( |
(包含的process如下)' L: A# H* e; A6 l5 |1 ~' |
power control process/ P( l: B9 [2 T, d' x6 V, B
reset control process$ h* R9 a1 W' L$ v4 [! V$ X; j9 c
watchdog process
2 p$ C! t+ M3 Z. f+ gread process, T7 d) Y) K" n- v6 V) m+ ~9 o
write process
. q3 {+ X. ~9 N; r. C. C3 Nslide switch detect and de-bouncing process
6 h5 x7 W- N* a# Y$ X6 Spush button detect process
/ Q; e9 m2 v+ o1 A" A. @slide switch interrupt event process
( |$ T' B& h- g* K9 [push button interrupt event process! O+ n" X, }+ P. Z8 O
......
6 Y5 l9 I3 i8 D
- \' @8 V) t* D2 C, Q% K現在的code上面的寫法已經正常,
' U5 ]1 o- p8 Z! h4 t+ [. i C4 w' c但是只要把這三行都mark起來,
5 o. I" a$ H. y( F+ M! m1 KLED_INT <= LED_SLIDE and LED_PUSH;
1 z9 \7 N4 J1 ALED_SLIDE <= nSLIDE_INT;
# L# r+ M: W9 {: z4 K- pLED_PUSH <= nPUSH_INT;
6 w9 T$ q$ K! X* H6 K, z整個code動作就不正常了!
7 V- C6 W4 o9 N# x2 E5 t m+ ?我是用Altera EPM570 -5ns那顆來做,
4 M$ Z" V$ V9 J! _% g4 M8 B不知道說這麼多有沒有表達清楚,其實有很多問題想請教,/ U: n8 G f' p3 e9 [
不過還是希望能夠先把這問題解決!
' y/ a) r# P! t$ I# N: f希望各位能給小弟一些建議,謝謝! |
|