Chip123 科技應用創新平台
標題:
CPLD因移除LED控制造成code動作異常
[打印本頁]
作者:
vatic
時間:
2009-3-13 11:27 PM
標題:
CPLD因移除LED控制造成code動作異常
Dear all
$ b+ x$ {. T( X" [. d" N
小弟最近用VHDL在power pc平台上第一次設計一顆CPLD去控制整塊板子,
" l, C+ j1 ~* G; t( Y4 L
裡面包含的功能有power/reset/LED control, hardware watchdog,
; _; _. Z+ D. N' q
slide switch/push button detect, CPLD to CPU interrupt event,
* o) ]% T7 J/ O, u
CPU read/write CPLD register這些功能,
8 z7 z3 k, b( x8 D- V" \; S1 w
在開發時,為了能夠快速的看一些裡面定義signal的狀態,
( i- W( g# L' o. M3 T
就在外面接了7顆chip type LED做debug用,
2 U2 Y: a% A9 j4 ?& U5 r1 `
而這7顆LED是拿來看slide switch/push button以及interrupt狀態,
6 O# F+ k* `& ~- v
而slide switch/push button只要有動作都會發interrupt給CPU,
5 ?4 f- N, |/ i- F" t
這些功能都一一完成並且「各別」驗證後,才全部組合在同一個.vhd檔,
1 ]+ l1 G3 ]' A* s9 R
而slide switch/push button的interrupt event "AND"起來後,
1 s3 T, X, l% v( K8 p
再指到CPLD nINT pin,如 nINT <= nSLIDE_INT and nPUSH_INT;
" o! @0 S. ~1 S( [' v
只要這兩個功能的process同時compile,nINT在high or low level,
8 K% i. c# Z( N
有機會發生抖動,或是有時會發生無法將nSLIDE_INT or nPUSH_INT拉high或low,
8 }6 {; ^* x; m8 J
但各別把各自的process mark起來不compile就會正常,
9 K' s- o: ~( m' \; n, F
在修改code以後,已經有解決這問題或應該算是改善吧,
6 s8 C4 x) |2 t3 a
因為更重要的問題來了,我把debug LED拿掉,
c _: q# _% b
這兩個要發給CPU的interrupt功能就出問題,
, ]8 m% I1 c, ~; H/ Z' |
只要把debug LED的東西留在code裡面,就正常了,
0 p6 o, b( [$ d
不知道板上個各位前輩有遇過這樣的問題嗎?
) k: X* A# b0 @) g& ^
$ K4 U- E1 n( K1 k; j4 s
example:
0 u# e1 S7 d7 E$ f
......
% q% K% u: `$ T1 q5 _9 r# R
port(
: Y8 m; q& x7 S/ y
nINT : std_logig;
4 v0 D/ u; l9 \6 j" U! h
LED_S : std_logic;
! i+ c0 V* X9 \
LED_P : std_logic
& V* F1 V& t: Z0 q+ T# P
);
$ a5 P7 L& L# k6 t/ ?
......
5 A! O1 Z6 s& N1 p/ T5 D: e
signal nSLIDE_INT, nPUSH_INT, LED_INT, LED_SLIDE, LED_PUSH : std_logic;
7 d u5 P, {* c+ N! W3 y% J
......
3 w- x4 D; M& w# }. s! ]
begin
7 ^2 J8 }6 Q. c7 |& K2 z+ t Z
nINT <= nSLIDE_INT and nPUSH_INT;
) G3 p& N- M) K8 _' ~ z# G1 C
LED_INT <= LED_SLIDE and LED_PUSH;
0 p: b9 T S. [! p2 M W
LED_SLIDE <= nSLIDE_INT;
( C) P: n3 ]. j4 M
LED_PUSH <= nPUSH_INT;
* J5 I+ j) e: M( Y
......
' f3 ?) d1 k- P6 X( @& k
(包含的process如下)
0 \+ u6 `- a% L( N
power control process
1 v* p$ H/ v' w5 M3 c1 L9 ^7 E, S
reset control process
* H0 P$ d# @6 B5 n; \7 e$ d! I
watchdog process
$ M0 D# n" @: y% l$ @. G2 ^
read process
8 q& V) F" i" E/ p4 Z0 A
write process
7 C/ {1 ^5 U+ R7 p6 B. c
slide switch detect and de-bouncing process
6 T# e9 F" l6 M) ?5 W2 ?
push button detect process
; Y5 y. a, s4 `# a( a) a
slide switch interrupt event process
" y7 |% u$ w& I2 b) W& a" }
push button interrupt event process
: t( {# G9 ?9 d1 G2 Y- G
......
% y7 X3 U4 v$ V4 j
; x% x0 F) t8 ]
現在的code上面的寫法已經正常,
0 E4 Z) n- \5 m, w! Z: D( J1 Q4 k
但是只要把這三行都mark起來,
6 H$ q$ n* j4 o# A$ b. X
LED_INT <= LED_SLIDE and LED_PUSH;
) W1 K) j* ^0 y4 a4 e% X
LED_SLIDE <= nSLIDE_INT;
; E% ]/ e, O' `' h
LED_PUSH <= nPUSH_INT;
: n6 i6 w) U* [# N3 W
整個code動作就不正常了!
. P; }* k8 [$ Q
我是用Altera EPM570 -5ns那顆來做,
. b" R D1 p4 H& H2 T# f0 D1 Q
不知道說這麼多有沒有表達清楚,其實有很多問題想請教,
& _2 b$ T8 ?! K& `0 E3 I9 y
不過還是希望能夠先把這問題解決!
6 r4 m2 f* O+ A: Q
希望各位能給小弟一些建議,謝謝!
作者:
hant763
時間:
2009-3-17 09:37 AM
請問一下,你有仔細看你的 QuartusII compile report 嗎? 在拿掉那三行前跟拿掉那三行後,report message 上是否有什麼差別? 還有看一下 timing 的部分,是否performace 掉下來很多? 也許你可以先使用QuartusII 的 simulation 看看程式的結果, 因為從你的描述很難直接馬上找到問題點...
6 p$ b! b, C$ H3 Z3 h
或者你可以直接找你購買 altera IC 的代理商,他們應該會有 FAE 幫忙處理,不然你可以直接到 茂綸股份公司
8 s# Y6 B, ~& x9 G" }, X, B- m
http://www.gfec.com.tw/
02-89132200 跟總機說要轉接 altera FAE , 應該會有相關 FAE 協助處理。
作者:
vatic
時間:
2009-3-17 09:04 PM
我現在有去多試幾種寫法,
/ ~# a- g6 U: }- v% M T# S
情況一,如果把這四行都留著,在RTL看到的是nSLIDE_INT and nPUSH_INT後,
( n$ R3 e- y9 v* ^! H' Z# w' L) H1 l
各別會再經過一個buffer,然後才丟到nINT跟LED_INT,這時動作正常
* D7 q/ i# d: w0 }9 U2 Q
nINT <= nSLIDE_INT and nPUSH_INT;
. B0 v6 r+ c8 t/ H
LED_INT <= LED_SLIDE and LED_PUSH;
3 X$ \ G% E' l, _
LED_SLIDE <= nSLIDE_INT;
: b$ c/ O3 \2 Y& T& T! `
LED_PUSH <= nPUSH_INT;
4 j: a- {* _% _; L- D/ Z
! f; T, w- N7 L7 F2 E) ^
情況二,「只有」remove LED_INT那一行,「或是同時」remove下面這三行
9 q' o: k5 ~. |' e6 k' B8 ?) I
LED_INT <= LED_SLIDE and LED_PUSH;
/ a0 A& f0 j: K! P
LED_SLIDE <= nSLIDE_INT;
( U1 _; k4 H: R N) ] y; L, b
LED_PUSH <= nPUSH_INT;
1 i3 b9 \1 Z& D {
在RTL合出來的都只會把nSLIDE_INT and nPUSH_INT就直接丟到nINT去,這時動作就不正常。
; m. c s$ t4 q
# ?: d# s- E) M* N! _* H% y; R9 x
& S# P# ~( X, f- w7 M- s1 |
# x. b ]% w: b9 M3 J! f7 X- n6 R
差異是在有沒有多了一個buffer才到外面的pin,
) ~' U/ B: }4 z2 |0 ?
但軟體在做化簡時,不是應該會把這buffer也化簡掉才對嗎?
* y' n- E* M7 U; O2 ?
我不了解這個差異會造成code整個動作不正常?
8 N, }! `* v K3 d$ p
至於altera那邊我會試著去尋問看看!
作者:
A9107114
時間:
2009-3-21 06:13 PM
標題:
push botton
一般機械開關在按下的時候瞬間會有彈跳(bounce)的現象,
/ V" s$ @) {! r9 m, q( C
在短時間內會有多次的on-off
; J b" l, Y5 B5 l* x. x7 ?% [
所以當我的電路有直接接到機械開關的時候都會再加上反彈跳(disbounce)的模組,
1 Q- }0 k" f& n3 p9 G! H
這樣才不會因為機械彈跳的現象,造成誤動作
作者:
vatic
時間:
2009-3-22 02:24 PM
debouncing已經在程式裡面了,
4 W F) n; j! f7 u5 F: b
scope也量過ok了~
$ s4 s: p3 ]+ F N+ L% N- d" a
弄了好久~不過最後root cause不是在這,
8 Z5 S2 \' A! c2 O1 H7 o7 X
雖然已經解決,但還要去查一下資料看是為什麼
作者:
hant763
時間:
2009-3-23 12:39 PM
標題:
CPLD因移除LED控制造成code動作異常
Dear vatic :
4 u* d" C9 H6 i0 c
請問一下你的問題是否已解決呢? 問題點是在哪呢?感覺上你的問題不是這四行造成的,應該是在程式更前面的部分,資料已經開始有誤差了!
/ h( x5 G: ~$ ?) S
3 T6 v# P2 ^: @) W5 L
我是 altera 代理商的 FAE ,altera 原廠希望能知道你的一些相關 information,不知你方便提供嗎?...或者你曾跟哪一間代理商聯絡過呢?..
& n5 R4 w' ]3 e' G
6 f1 o& G9 E* U
thanks & regards
S2 a" `( l: g5 D. x4 ]0 W
hant763 .
歡迎光臨 Chip123 科技應用創新平台 (http://www.chip123.com/)
Powered by Discuz! X3.2