|
Dear all
1 e' q* R$ Q; |3 ^ u小弟最近用VHDL在power pc平台上第一次設計一顆CPLD去控制整塊板子,
# Z4 R' H/ T8 h- t! x) W) ]2 J$ P裡面包含的功能有power/reset/LED control, hardware watchdog,
0 k0 W7 z/ {9 j: T; \slide switch/push button detect, CPLD to CPU interrupt event,
a' h1 {# R3 q/ A# j; r, [6 c O/ L+ vCPU read/write CPLD register這些功能,1 `7 e6 m# J% j/ N, c5 X. o! Z/ O/ j
在開發時,為了能夠快速的看一些裡面定義signal的狀態,! Q. }- I) }2 S; J0 Y b
就在外面接了7顆chip type LED做debug用,
0 p- S0 D6 i7 R+ V1 H0 h而這7顆LED是拿來看slide switch/push button以及interrupt狀態,% R9 @6 V% R Q8 @- q# g
而slide switch/push button只要有動作都會發interrupt給CPU,# M. b9 o& t3 ]! \) q% y
這些功能都一一完成並且「各別」驗證後,才全部組合在同一個.vhd檔,
4 O b0 j/ w, y' V0 h而slide switch/push button的interrupt event "AND"起來後,6 u# I. A1 y; i( V N6 D3 T# O
再指到CPLD nINT pin,如 nINT <= nSLIDE_INT and nPUSH_INT;2 q2 F7 m. m! l
只要這兩個功能的process同時compile,nINT在high or low level,
7 |, J5 b1 c1 D$ ]有機會發生抖動,或是有時會發生無法將nSLIDE_INT or nPUSH_INT拉high或low,! j9 G+ w4 I, P9 _6 I- ^9 l
但各別把各自的process mark起來不compile就會正常,
. `! @6 W: a' f$ \7 Y. B在修改code以後,已經有解決這問題或應該算是改善吧," ?% D/ v* @4 U8 e% ?; d5 a3 m
因為更重要的問題來了,我把debug LED拿掉,
" j) p* ^7 E+ i+ S1 A! j) Q7 d5 L- `這兩個要發給CPU的interrupt功能就出問題,
+ g! f6 _! H7 K+ ^1 f只要把debug LED的東西留在code裡面,就正常了,
; q4 l5 }" B0 @+ H, I/ E& Q! v( r不知道板上個各位前輩有遇過這樣的問題嗎?
- _( S8 F& @) s2 w# |- R2 p- M! J1 |' {: J5 c- s; ]
example:6 c: X3 V4 n h7 s$ ]
...... E: V {4 w0 @' M
port($ U. d3 v+ I. F: Z/ |& C
nINT : std_logig;9 W1 d2 J5 g3 s4 q- x) b% r
LED_S : std_logic;
! N& c( S9 Z* a8 R6 _LED_P : std_logic! \+ U6 ]- X8 A D4 D
);
: r$ O) z# z: e( [......
/ J1 d+ ]6 @4 D6 f* u0 Asignal nSLIDE_INT, nPUSH_INT, LED_INT, LED_SLIDE, LED_PUSH : std_logic;
( M$ K- H3 r% j, { ~+ Y4 E......& s7 |5 f, I8 e
begin/ e4 \: B0 a! t O
nINT <= nSLIDE_INT and nPUSH_INT;1 ]. s( d- m Q W
LED_INT <= LED_SLIDE and LED_PUSH;
. U# Z% h7 X( RLED_SLIDE <= nSLIDE_INT;
! ~$ o/ @5 _7 p1 X& j1 ULED_PUSH <= nPUSH_INT;4 A) M9 N4 Z% y. i9 L% }# K4 h
......
- m3 @: w* G% T# w. a+ A(包含的process如下)
, c* K: U" M' @" P; ]' O* tpower control process
1 q( K0 w! d, s1 w' Treset control process
9 l; z/ Z8 g) u7 m6 ywatchdog process' c# Q1 v. @6 p' F& @# q
read process& ~( f6 O8 |& D7 k, O6 j1 y
write process3 w2 l0 x( T8 Q' b0 h/ k6 q& f6 ]
slide switch detect and de-bouncing process
4 X# y) S+ t8 {push button detect process
# Z5 G: e% N2 k! ]/ D/ |+ Islide switch interrupt event process
, k+ Q9 `% K8 Y$ D) ~/ j8 W8 rpush button interrupt event process h. | p6 d' g7 d
......; I. B9 T! G" X" U; {
/ Q' V9 Y3 }/ {現在的code上面的寫法已經正常,
. V8 B0 i- R: z8 G+ j但是只要把這三行都mark起來,
- I; g- P: q) u" {/ M3 t9 KLED_INT <= LED_SLIDE and LED_PUSH;# o7 ^: [* R/ Y0 J( Q7 `* V
LED_SLIDE <= nSLIDE_INT;
6 W n# v. w+ M$ _. ILED_PUSH <= nPUSH_INT;
+ I& ~. `: z' k; g整個code動作就不正常了!
7 v: ~6 l K: i( N. M! W我是用Altera EPM570 -5ns那顆來做,
& c' H+ f& s* z6 `9 t1 i0 q不知道說這麼多有沒有表達清楚,其實有很多問題想請教,. j" s8 j! M: ^8 f9 N8 o, m
不過還是希望能夠先把這問題解決!; _, c4 [% W b1 b. u$ v, [" y
希望各位能給小弟一些建議,謝謝! |
|