Chip123 科技應用創新平台
標題:
CPLD因移除LED控制造成code動作異常
[打印本頁]
作者:
vatic
時間:
2009-3-13 11:27 PM
標題:
CPLD因移除LED控制造成code動作異常
Dear all
0 i. U. X/ A M) G/ K
小弟最近用VHDL在power pc平台上第一次設計一顆CPLD去控制整塊板子,
3 |! H: n, J$ ^1 D3 p) D4 h9 M, |
裡面包含的功能有power/reset/LED control, hardware watchdog,
6 U& g, h* O; x z* z
slide switch/push button detect, CPLD to CPU interrupt event,
9 b. K. _2 G! {9 p! r: D# d0 ~
CPU read/write CPLD register這些功能,
/ N; M5 n8 A: \ F' I1 \( M
在開發時,為了能夠快速的看一些裡面定義signal的狀態,
, d! L! n) X8 k% }9 [
就在外面接了7顆chip type LED做debug用,
`, P* \- i/ K1 Q- j9 H
而這7顆LED是拿來看slide switch/push button以及interrupt狀態,
3 Z% ~) C' Y# n* B9 }7 Z) G6 _- P
而slide switch/push button只要有動作都會發interrupt給CPU,
' R' \3 ^+ Z' m8 C
這些功能都一一完成並且「各別」驗證後,才全部組合在同一個.vhd檔,
) P; ? H/ X5 j2 i
而slide switch/push button的interrupt event "AND"起來後,
9 k% @* c5 c! v6 v8 e1 Y9 P
再指到CPLD nINT pin,如 nINT <= nSLIDE_INT and nPUSH_INT;
: m( s* A; o- A/ i d, @
只要這兩個功能的process同時compile,nINT在high or low level,
) s4 K- J& P$ P+ Q( @/ C7 G
有機會發生抖動,或是有時會發生無法將nSLIDE_INT or nPUSH_INT拉high或low,
1 }. A" v1 L* `* T: H- R; O
但各別把各自的process mark起來不compile就會正常,
; @/ H3 [2 q4 s
在修改code以後,已經有解決這問題或應該算是改善吧,
7 k( _- F- O. D6 T
因為更重要的問題來了,我把debug LED拿掉,
' U+ c$ S! x' G0 s* q0 ?
這兩個要發給CPU的interrupt功能就出問題,
, r+ O" I' ]6 S4 x- K( @
只要把debug LED的東西留在code裡面,就正常了,
' B& I5 E( q! h$ c% m
不知道板上個各位前輩有遇過這樣的問題嗎?
4 G1 k. C9 Q3 W) ]3 W9 U0 ?
- ~0 D" B. z5 B; y
example:
( b- R+ G' L7 y$ ~; S: l
......
) w3 t. R; D. {9 f6 z
port(
4 i* C& r% b" L/ Z* V& W$ A
nINT : std_logig;
2 O* {' b1 ~1 v- z5 ?
LED_S : std_logic;
6 i: o1 j( l; \3 @
LED_P : std_logic
' B, I9 c7 C) ?
);
/ n0 Y( `! g) n9 J+ g) b% @
......
5 |0 h7 \; F ?) U1 r/ Y
signal nSLIDE_INT, nPUSH_INT, LED_INT, LED_SLIDE, LED_PUSH : std_logic;
" A2 L- h5 \$ n
......
5 M& l- X+ W- b/ B
begin
& x$ A3 O3 m& i( h" n, I
nINT <= nSLIDE_INT and nPUSH_INT;
8 \1 k9 z% |) c! w
LED_INT <= LED_SLIDE and LED_PUSH;
. z% F0 c1 v' c4 [- b
LED_SLIDE <= nSLIDE_INT;
7 ?/ z- O9 k4 a
LED_PUSH <= nPUSH_INT;
2 t( I- r0 u3 q+ s
......
# ^* y0 ]9 r7 D
(包含的process如下)
$ t3 A; A2 ~' N. p7 _
power control process
4 \, X* z( S6 S, m/ o% U
reset control process
$ ?1 H4 @$ Z* M8 P4 D
watchdog process
) P4 k% o' i; g5 k! C7 e
read process
& |* [4 _! J- E: M6 H! j6 ?9 T! M
write process
, |# n' J$ U5 r' e. S7 E! P/ E
slide switch detect and de-bouncing process
: a4 {: P7 z( S9 B" D
push button detect process
4 ?5 e9 x( G" u% l8 ^4 O% A8 }% C
slide switch interrupt event process
; a, h+ F G8 O X
push button interrupt event process
' ]* }) J& g" [5 e: p
......
! O8 S; ~, x! i: r& V7 P( }' `# x
3 s, n4 `- q) K% }
現在的code上面的寫法已經正常,
0 \4 v# F, y5 j
但是只要把這三行都mark起來,
2 m! y' q, t% M( Z' i3 a1 \
LED_INT <= LED_SLIDE and LED_PUSH;
8 A( |, B0 f$ N1 R# F& O! x. U
LED_SLIDE <= nSLIDE_INT;
9 t B8 k# h; a; }% H7 L
LED_PUSH <= nPUSH_INT;
0 A) R( h* ^+ m4 X v+ c0 h
整個code動作就不正常了!
0 z2 H+ D. I1 t" |9 v
我是用Altera EPM570 -5ns那顆來做,
3 S! m% w: y, r; E" V
不知道說這麼多有沒有表達清楚,其實有很多問題想請教,
- d2 t' p! `7 {, n# ]0 v& P
不過還是希望能夠先把這問題解決!
7 a8 e! D2 h; Z7 M& c) F
希望各位能給小弟一些建議,謝謝!
作者:
hant763
時間:
2009-3-17 09:37 AM
請問一下,你有仔細看你的 QuartusII compile report 嗎? 在拿掉那三行前跟拿掉那三行後,report message 上是否有什麼差別? 還有看一下 timing 的部分,是否performace 掉下來很多? 也許你可以先使用QuartusII 的 simulation 看看程式的結果, 因為從你的描述很難直接馬上找到問題點...
4 f; X# I* w& M' _# w: R0 }. }
或者你可以直接找你購買 altera IC 的代理商,他們應該會有 FAE 幫忙處理,不然你可以直接到 茂綸股份公司
: Y' n& _$ X6 l) w% D
http://www.gfec.com.tw/
02-89132200 跟總機說要轉接 altera FAE , 應該會有相關 FAE 協助處理。
作者:
vatic
時間:
2009-3-17 09:04 PM
我現在有去多試幾種寫法,
7 r: E% \) R# V! Y( g
情況一,如果把這四行都留著,在RTL看到的是nSLIDE_INT and nPUSH_INT後,
9 ~) _; `# U3 j, A5 c! @* x
各別會再經過一個buffer,然後才丟到nINT跟LED_INT,這時動作正常
a m P5 I: G, S" {' O b
nINT <= nSLIDE_INT and nPUSH_INT;
( x* F6 t4 i: ~
LED_INT <= LED_SLIDE and LED_PUSH;
0 g1 N& I/ x4 f$ N' B
LED_SLIDE <= nSLIDE_INT;
- d1 N' T! U8 |, q2 }4 n8 _0 a
LED_PUSH <= nPUSH_INT;
6 @2 M0 L9 r) ~! c* W3 w
# s( _! M. G1 Y7 [( f% M5 h& `
情況二,「只有」remove LED_INT那一行,「或是同時」remove下面這三行
. o- f& }! q5 B. t% S
LED_INT <= LED_SLIDE and LED_PUSH;
" M2 [3 s: j9 D8 Y
LED_SLIDE <= nSLIDE_INT;
! a1 {) c( g/ e5 ]" |) z. M! v
LED_PUSH <= nPUSH_INT;
! R- b; o0 c9 C3 [, f
在RTL合出來的都只會把nSLIDE_INT and nPUSH_INT就直接丟到nINT去,這時動作就不正常。
" k8 z0 z0 i- Q1 Q+ ~
) E' k9 v) j; s8 _* ^( N. U! Q
* G0 |' k" m( d# f
6 |* `- D& w$ j
差異是在有沒有多了一個buffer才到外面的pin,
8 x3 ~ D: s2 K6 t' e
但軟體在做化簡時,不是應該會把這buffer也化簡掉才對嗎?
7 Y2 a! k1 g" f+ ^# R( [( V# g
我不了解這個差異會造成code整個動作不正常?
0 q6 S+ A% `1 m7 }, p7 q" U: J
至於altera那邊我會試著去尋問看看!
作者:
A9107114
時間:
2009-3-21 06:13 PM
標題:
push botton
一般機械開關在按下的時候瞬間會有彈跳(bounce)的現象,
+ S) K) t% R) x9 C
在短時間內會有多次的on-off
5 m$ Q( l, q9 Q+ x2 P
所以當我的電路有直接接到機械開關的時候都會再加上反彈跳(disbounce)的模組,
4 K, @# ?8 l5 Z Z; S% O) N
這樣才不會因為機械彈跳的現象,造成誤動作
作者:
vatic
時間:
2009-3-22 02:24 PM
debouncing已經在程式裡面了,
% b% \9 _) n. o8 O }& J; m
scope也量過ok了~
* u. l% j( M9 O( F! j
弄了好久~不過最後root cause不是在這,
( m# m ?% W. E( s" j) w
雖然已經解決,但還要去查一下資料看是為什麼
作者:
hant763
時間:
2009-3-23 12:39 PM
標題:
CPLD因移除LED控制造成code動作異常
Dear vatic :
9 O+ D9 ?0 i% w1 j4 h2 _6 \7 a
請問一下你的問題是否已解決呢? 問題點是在哪呢?感覺上你的問題不是這四行造成的,應該是在程式更前面的部分,資料已經開始有誤差了!
2 N, Y- y5 _4 j" f* P, J
/ w7 I9 s9 |. e) V$ c% t H
我是 altera 代理商的 FAE ,altera 原廠希望能知道你的一些相關 information,不知你方便提供嗎?...或者你曾跟哪一間代理商聯絡過呢?..
$ h5 J+ e7 ^; m C& {
9 R+ F- u, m6 s
thanks & regards
: Y7 F- @3 H/ t* k9 j
hant763 .
歡迎光臨 Chip123 科技應用創新平台 (http://chip123.com/)
Powered by Discuz! X3.2