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* zslide 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$ AnINT : 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/ Ysignal 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, InINT <= nSLIDE_INT and nPUSH_INT;
8 \1 k9 z% |) c! wLED_INT <= LED_SLIDE and LED_PUSH;
. z% F0 c1 v' c4 [- bLED_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 process4 \, X* z( S6 S, m/ o% U
reset control process
$ ?1 H4 @$ Z* M8 P4 Dwatchdog process) P4 k% o' i; g5 k! C7 e
read process
& |* [4 _! J- E: M6 H! j6 ?9 T! Mwrite process, |# n' J$ U5 r' e. S7 E! P/ E
slide switch detect and de-bouncing process
: a4 {: P7 z( S9 B" Dpush button detect process
4 ?5 e9 x( G" u% l8 ^4 O% A8 }% Cslide 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 LLED_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! vLED_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-off5 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; mscope也量過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