|
Dear all$ D( I5 j/ s5 J2 b* K! H8 Y* F
小弟最近用VHDL在power pc平台上第一次設計一顆CPLD去控制整塊板子,. T" H, Y4 v- u, @
裡面包含的功能有power/reset/LED control, hardware watchdog,
0 k' f5 B4 ~2 J5 Jslide switch/push button detect, CPLD to CPU interrupt event,
# E0 ?. l" w% [! m# Q& |CPU read/write CPLD register這些功能,* W0 j3 S, a* m
在開發時,為了能夠快速的看一些裡面定義signal的狀態,0 M7 r t+ U7 s2 i* ?. M
就在外面接了7顆chip type LED做debug用,
; D# [5 {3 J7 C1 h( p而這7顆LED是拿來看slide switch/push button以及interrupt狀態,
0 A/ U: L- |+ }+ r而slide switch/push button只要有動作都會發interrupt給CPU,
; K8 y- R/ Y! J) ?這些功能都一一完成並且「各別」驗證後,才全部組合在同一個.vhd檔,0 u8 H) G, n U; s
而slide switch/push button的interrupt event "AND"起來後,+ ]+ W6 Y6 k1 s/ o R8 \. o
再指到CPLD nINT pin,如 nINT <= nSLIDE_INT and nPUSH_INT;# V! v6 |' ?; t% r3 o! L9 R
只要這兩個功能的process同時compile,nINT在high or low level,; j. z2 x& l; K X2 B
有機會發生抖動,或是有時會發生無法將nSLIDE_INT or nPUSH_INT拉high或low,2 j$ R+ Z9 @$ G) \$ l
但各別把各自的process mark起來不compile就會正常,
0 g: \* p! ?! P% ^6 r. }* v在修改code以後,已經有解決這問題或應該算是改善吧,) c- e7 O/ B9 G
因為更重要的問題來了,我把debug LED拿掉, X5 x; h8 q6 G! R; N
這兩個要發給CPU的interrupt功能就出問題,6 U' v+ e7 H6 L+ j1 E
只要把debug LED的東西留在code裡面,就正常了,
2 \7 m+ Y- M) L7 S不知道板上個各位前輩有遇過這樣的問題嗎?( o' J( D8 k% d3 _4 z& K6 [
% T. @7 X+ J+ V* U' S( a3 X' Bexample:1 ~2 d8 v- e) y" v# s+ S6 ^5 x% ~! z
......
: [' P" d$ N9 O& n. t# m+ v; Jport(: |% t1 x1 w' h) ^4 W- R
nINT : std_logig;
7 q1 k& x' ]' W. u( ]6 eLED_S : std_logic; q/ h3 D Q |- j! _& d
LED_P : std_logic9 y+ G& p8 O- P t& M4 l
);5 M: ~/ O, p* Q
....../ Z# O# C2 G5 F2 E! M5 z# ?
signal nSLIDE_INT, nPUSH_INT, LED_INT, LED_SLIDE, LED_PUSH : std_logic;
5 h7 A* @ x+ B......$ A* U4 [; X; _
begin
7 Q8 d; O; a; r1 M; ~7 FnINT <= nSLIDE_INT and nPUSH_INT;! M. g% _# E8 P* i) U0 x
LED_INT <= LED_SLIDE and LED_PUSH;
* o+ G* V0 y5 o' ?4 J/ ~LED_SLIDE <= nSLIDE_INT;
2 a: d: ?( h% {' p/ JLED_PUSH <= nPUSH_INT;
; Y( o0 R& y. s: Y; I" i/ q......
9 | l. ^8 ]7 J! {7 X4 S) n8 h1 H(包含的process如下). j/ Z& X7 e4 i1 M6 p
power control process
* f* F" J5 J* i2 ^4 |, z6 M' zreset control process9 o8 r$ K/ G( K3 G: ] }9 H
watchdog process
$ x7 l, S* }6 e3 C% I* qread process
" Y* z+ P% D% a3 Awrite process$ z* U" W, t* Q& I- ] ^: m" \
slide switch detect and de-bouncing process. D0 D1 m8 s' w
push button detect process0 V- ?/ Y' Q) M
slide switch interrupt event process/ R% t# U( r+ t& c
push button interrupt event process
% v7 v+ e: R) e+ e L......2 ?; I* T0 @5 e' `/ S8 ?
o$ l) g. T8 g u7 t' t, L現在的code上面的寫法已經正常,8 C R7 Z0 r7 s( Z: E+ \
但是只要把這三行都mark起來,) e: ]! m' V5 x
LED_INT <= LED_SLIDE and LED_PUSH;
3 C9 v! O3 H' Y% M- e+ wLED_SLIDE <= nSLIDE_INT;
2 l# w$ A+ q* M7 oLED_PUSH <= nPUSH_INT;
. K, `6 Z! _, ~6 n! f整個code動作就不正常了!, Q3 w( w2 M) l; F8 o s
我是用Altera EPM570 -5ns那顆來做,
3 U% b. z5 P" J4 j; B不知道說這麼多有沒有表達清楚,其實有很多問題想請教,
; @) }# P9 Q, c2 y6 H+ Y不過還是希望能夠先把這問題解決!* N2 {2 o7 M2 M4 D4 d1 {2 B. t9 A! J4 z
希望各位能給小弟一些建議,謝謝! |
|