|
Dear all
% h- X: ?5 e, K: w$ H/ R小弟最近用VHDL在power pc平台上第一次設計一顆CPLD去控制整塊板子,& y0 C7 |0 h, q/ P8 z, v" h
裡面包含的功能有power/reset/LED control, hardware watchdog,
! C; [% b0 i/ r/ L" {slide switch/push button detect, CPLD to CPU interrupt event,
6 ^; d9 l; s3 L4 L+ Z x: tCPU read/write CPLD register這些功能,1 \& E) f2 m" n+ B' V
在開發時,為了能夠快速的看一些裡面定義signal的狀態,
( Z1 ^/ N W3 D8 I/ J. p就在外面接了7顆chip type LED做debug用,0 l, G7 @7 L/ G0 ?& ^9 b
而這7顆LED是拿來看slide switch/push button以及interrupt狀態,9 y( [# S+ k+ C8 d: y
而slide switch/push button只要有動作都會發interrupt給CPU,
3 D+ C3 e$ f, a' M0 E' k- }這些功能都一一完成並且「各別」驗證後,才全部組合在同一個.vhd檔,3 [& v& t& i: D# l1 L
而slide switch/push button的interrupt event "AND"起來後,
) A" P u! k9 l Y再指到CPLD nINT pin,如 nINT <= nSLIDE_INT and nPUSH_INT;: y+ y2 i1 l9 L8 ?/ n% n# l- X2 l ]
只要這兩個功能的process同時compile,nINT在high or low level,8 b4 x/ g0 r, e- ^: T8 j
有機會發生抖動,或是有時會發生無法將nSLIDE_INT or nPUSH_INT拉high或low,
1 Y) q& J7 r& F2 U }: h3 ?+ x! L但各別把各自的process mark起來不compile就會正常, h. ^+ B, F5 I2 r- ^
在修改code以後,已經有解決這問題或應該算是改善吧,. c) o5 m% x* r
因為更重要的問題來了,我把debug LED拿掉,) x. _- B5 A. O% t% u
這兩個要發給CPU的interrupt功能就出問題,# Z6 h. E- @, W3 d' C& Z
只要把debug LED的東西留在code裡面,就正常了,, y. R; I2 ~/ c: F+ N, l
不知道板上個各位前輩有遇過這樣的問題嗎?
( x/ _% L! _' U3 c" o: ?3 ^
' l' @! G9 Q% V8 F# O9 r: lexample:( t) Q- A- z. G4 |% I, [
......
/ O. J6 w! c5 u1 xport(
3 x9 B) E B T/ S- a% V. c, x0 pnINT : std_logig;# |% S2 P( J9 J* [( Q4 i' o8 I% p5 H! A
LED_S : std_logic;; ^9 k5 q8 y' F/ F/ g4 v9 O$ ~9 y
LED_P : std_logic
% t4 F0 K$ i% V& ~: y);
8 q3 c' K- O/ y, p; P$ Z) ]......3 u: w0 z4 X4 j: e5 s: ?
signal nSLIDE_INT, nPUSH_INT, LED_INT, LED_SLIDE, LED_PUSH : std_logic;* G7 `) s+ ~9 e0 v \: A/ B( Z {, K
......
$ U* [, A6 V: ~begin! d2 P5 L$ K4 M: s
nINT <= nSLIDE_INT and nPUSH_INT;
1 g2 X* K& Q6 q2 F0 k1 k. W$ \3 G9 LLED_INT <= LED_SLIDE and LED_PUSH;
' j7 \5 |/ M2 KLED_SLIDE <= nSLIDE_INT;
. E* Q. g0 T8 b6 Q, {' ]& rLED_PUSH <= nPUSH_INT;" \/ n& V! d( Q( t
......
& G- E/ O1 t, ?6 w6 |(包含的process如下)5 J" d. \/ ^7 H
power control process' V, n, ~1 F0 _: s
reset control process
7 k( J2 w6 k! S. fwatchdog process' q& |, d+ C% G
read process# M- B9 z3 x$ l' L% w5 C8 B! ?
write process
+ ~ y3 }9 H; n! j, V0 H. @7 Aslide switch detect and de-bouncing process
7 \5 Q; ]4 X' |push button detect process
4 T. c% d4 D, \8 N" Gslide switch interrupt event process
2 n' U/ Z8 h" o4 V( w% _& a0 Upush button interrupt event process
3 C9 i* }4 r$ U......
2 n/ A$ ?( g; u+ S# ^! ^! ]2 [1 g7 }( X; y
現在的code上面的寫法已經正常,: K- @" ?9 Y( E. Q6 O7 e0 e
但是只要把這三行都mark起來,
9 }, K! B! A( {# DLED_INT <= LED_SLIDE and LED_PUSH;
4 [7 v- K0 n1 d0 w8 ^+ ~LED_SLIDE <= nSLIDE_INT;
! o- i3 K$ s3 T5 Y/ o9 jLED_PUSH <= nPUSH_INT;
2 y. d5 w" ~/ U) s5 s整個code動作就不正常了!
7 j' @; u# ?3 R6 B5 r我是用Altera EPM570 -5ns那顆來做,3 S* G4 _1 B- V3 M$ n7 V. z
不知道說這麼多有沒有表達清楚,其實有很多問題想請教,
& ^/ ]: g5 {2 v9 _0 k/ r不過還是希望能夠先把這問題解決!
! @3 q* L: e0 @$ G9 ~; I" `0 m希望各位能給小弟一些建議,謝謝! |
|