Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 41282|回復: 50
打印 上一主題 下一主題

[問題求助] uart 16550 FIFO問題

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-3-1 01:39:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位 大大
! V8 l( q0 y5 b9 j' C請問有人知道uart 16550 的FIFO的電路結構嗎
! l& D6 _/ v" g; ^( n: j1 {) I
6 |" S: d" h) G- ]因為以前有用vhdl做一8250的功能
# M! ~& i% x4 S# Y1 u3 T9 J) B想加上FIFO ,變成16550的功能6 |% L8 ]) q3 K
所以才會想了解16550 FIFO的電路結構
: {- E( F; ~6 u  }0 C5 Z. X* s# z, [
依照data sheet看起來似乎是用異步fifo
, A" o% j1 N6 e寫入跟讀出fifo可以同時操作
9 e$ E* W: A- k$ Z. U3 Y  t2 E6 j: q$ R* s& q
可是我想到的fifo結構如果同時寫入跟讀出的話,就有機會# W' C. R! v% x' S# p6 m
會發生full,empty,level trigger判斷錯誤,如下圖所示
$ ]3 a2 x% b3 l7 X; `

評分

參與人數 1Chipcoin +3 收起 理由
tommywgt + 3 好問題

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-3-1 14:06:04 | 只看該作者
非常抱歉, 這個本來的討論被我不小心刪了才要害你重貼, 那天回了很多, 這次我就回的簡潔一點好了
( u0 A. z# W: b
( g/ S+ v2 M2 I& t
8 q* O% A+ v  Y1 @: m8 R% L0 T對於類似因不同clock所引起的問題我的看法有二個:, {6 v5 F" z% t# t. ~) u: J: {8 P
1) 使用handshake來完成資料交換 (包括status)/ N9 M6 o% g* \/ G; u' n4 F' X1 _
2) 使用較高的clock6 V1 Z! J+ k2 D0 K

) B3 ?7 I+ m+ d! w2 S$ y由於第2點你已經有提過了, 所以我就針對第2點討論好了
8 S, H+ O* q3 j0 }使用較高的clock可以有二個方式:) L! t& }' H! c" e8 X5 U$ l
1) 使用二個clock之間較高的那一個# I3 r2 V9 R( A  ^# R
2) 使用更高的clock6 V+ s: L4 u, A( _2 x
+ R4 B' m, ~0 N. b! y
無論是選1或2, 都會遇到你說的那個問題& @- J  F. u& i% C4 V" F
我們的目的是不管選用哪種方式都希望可以很穩定的讀取到正確的資料, 接下來我們以RX FIFO來討論好了
$ N* J3 C6 K3 t, h/ k* Z假設我們在/RD時(讀STATUS)剛好有一筆資料進到RX buffer, 可能對empty及full造成以下幾個可能
7 X2 H" B  S  U2 C) {1 I5 b0 Y  a1) 本來emptyl變成沒有empty$ }5 w+ j/ y1 U, d' Z
2) 本來沒有full變成full
+ X+ b4 w  a$ \. r3) 本來不是empty而且buffer也還夠所以empty跟full都沒改變
5 q* Q$ a& E8 O6 _- s" D1 ?' F& l: q: U" O
對於case2, 3因為不會造成任何問題, 所以估且不加以討論, 討論case 1的話會發現在/RD出現時有可能
" k8 ^6 s+ I6 c" l  n. N1) /RD讀到empty, 故CPU會以為沒資料而去處理別的事, 過會兒再來讀status時才把資料捉走& y  f# S2 J7 W, f
2) /RD讀到沒有empty, 程式直接捉走FIFO的資料
" t' Y* P! r: E5 J% C8 H
( j# X, U. H4 t1 n# j, _/ w我只能說以上二種情況也不會有問題的, 主要的原因是這幾個信號都是1 bit.
, Y  H# j& J  d# c* D3 a  }: P2 Q( A7 @- [5 T2 M
再回到你顧慮的問題討論
! ]5 ~5 y5 f4 [* y' Z/ X5 G假設說這個status是超過1 bit, 例如: buffer資料的長度, 假設FIFO長度是8的話, 那麼這個值要有3 bits類似的情況發生在/RD時有可能因為011->100時讀到111, 這個也是你圖中所表示的問題, 針對類似的問解決方法應該不少, 我在這提出一個個人的看法 (這個問題用handshake的方法也是可以解決的)
" K4 z6 i1 e8 U! m
4 m3 w) [* M! q, q, h: a下圖是說將資料多COPY一份, 這一份資料的UPDATE跟原來的資料差了一個clock cycle& i5 V4 h( g' p2 N. D
假設在/RD時剛好發生資料改變的話, 只有一個值會有問題, 透過VOTE找出沒問題的那二個再決定輸出哪一個穩定的值即可$ n5 m; j4 P0 I5 w4 M/ a2 F

9 j8 a# P7 f0 J2 m; E+ j0 x0 c以上, 希望會有幫助

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?申請會員

x

評分

參與人數 1 +2 收起 理由
jimy + 2 感謝經驗分享!

查看全部評分

3#
發表於 2007-3-1 14:07:07 | 只看該作者
類似因為不同clock而造成的問題在設計時常會遇到! G) Y2 ?" A2 D; y4 k4 W3 i
. A. v2 G% Y" B/ e# c9 i& U, |. E3 A
有人有別的好答案嗎?
4#
 樓主| 發表於 2007-3-2 01:16:05 | 只看該作者
您好
) S6 H( o% H$ k1 I) a% a& u" ?" N% @1 D( ?$ F$ \. e- @
感謝版主 大大的講解,提供解決方式的參考
1 I* Z* J2 u6 a( \$ `: A  Y$ W8 K/ D
我這邊還是有一些問題
+ t7 J3 O# R7 x. @1 I$ j4 L- d2 [/ o4 @  b+ `
1.
% e3 p6 L" T+ Z& s4 Z' k% N# TRX FIFO1 V2 @( [/ u' L) r) ^4 E( \2 T
write_ptr變動對/RD empty的影響就如同大大所講的7 `. W( B/ ~- E5 d& I+ M
cpu對於錯誤的empty只是延遲下次在來讀FIFO資料,並不會
1 Y: M3 |- \7 K  L( M造成嚴重的錯誤
4 R4 |+ S6 z- v) w4 m0 ?可是- V0 @; s- F6 \8 E+ t9 @
read_ptr變動對於寫入FIFO full的影響就很嚴重了, w! _# _% x" ?5 B! M! @
當要寫入FIFO時誤判FIFO 滿了,這時就會造成溢位的動作
1 h5 B6 A6 @4 @4 F8 p# b/ @# y
: M) j1 S1 U+ t( {0 P  L2.3 u7 |* ?! C, G) e( y- h& H' u
16550有TIGGER LEVEL功能,可以設定當FIFO收到1,4,8或14筆資料時
! B% L5 B7 w0 w/ b去觸發中斷輸出腳INTR4 o/ A- R- P& `# I2 ~% A
這樣勢必要有TRIGGER_LEVEL_FLG邏輯來指出是否符合條件
- E( ~4 y; \  L/ ?. Q這TRIGGER_LEVEL_FLG也要根據變動的write_ptr和read_ptr來決定# {* j+ i. `4 p  h; S/ R
這樣INTR輸出不是就有機會產生毛刺在write_ptr和read_ptr變動時% B8 N0 r2 L$ H& ?6 Z8 [
那要怎麼消除這毛刺現象呢  ^+ ~/ l5 R' r  R  s& W+ X
- l% ]1 o/ G0 b& u( `/ T+ n; o! v8 a8 g) o
3.
6 z3 U8 V7 Z* }/ I8 `* s% G% Z4 q如果加上handshake的話,那時序動作可能就會跟16550有些差異了

評分

參與人數 1Chipcoin +3 收起 理由
chip123 + 3 勇於求知!多問多感謝囉!

查看全部評分

5#
發表於 2007-3-2 12:10:36 | 只看該作者
其實在早期我遇到這類的問題也是用這樣子的方法, 近來我不太使用這個方法了, 這個方法一定可行, 但是就如你問題所說的, 會有一大堆timing的問題, 一個沒有注意到就會留下bugs
6 S. @! K; C$ m1 g8 K& j! u+ s1 R" a: M6 ]
你的思考很周詳, 顧慮也都沒有錯, 繞在一堆timing打轉時, 腦袋一定很吃力.0 M8 \. w6 w% b2 T
' B# v8 v# {+ }' v# e$ Y
回到我本來的答案, 加以修改還是可以解決你的問題, 在一堆timing打轉時, 一定要非常小心什麼時候會出現什麼信號, 以及這個信號跟別的一大堆信號之間的關係, 只要這些關係都弄清楚的話的, 自然會慢慢的有答案, 在找到不會有問題的答案之前已經不知道跑了多少次的模擬了. 我講的這些你一定很清楚而且感同身受...& \/ }: a7 t; p' m& Y' e- N3 S5 e% j
. }5 F. a$ l# Q5 Y
有人說做演算法實現的人比較厲害, 看看這麼多的問題, 幾乎不會出現在演算法實現上, 所以我常常覺得不認同這句話. 一些AE在使用別人設計的IC時常會不保留的直接批評, 殊不知IC designer在這上面花了多少苦心, 深深害怕一個不小心, 多少心血就要再來一次...
2 Z% Z' v8 ?9 n+ a
$ D) Y9 ?( Z0 Q9 W, O7 W  q0 v對於你的問題我可以給另一個建議: 很多時候我們常會思考說, 當什麼信號或者狀態出現時, 要做什麼相對的回應, 只是我覺得這個回應不見得必須是即時的. 舉個例子, 在/RD出現時並不是非得把對的資料送出去不可, 在/RD的falling edge到rising edge之間的時間還很長, 資料只要在rising edge加上setup time時間之前送出去就可以確保資料的正確無誤(當然是愈早愈好), 這中間還有好長的時間可以做很多事的. 要啟動一個事件去做一件事也不見得只有一個狀態, 例如在/RD之前, /CS一定會先出現, 這中間一定還有什麼好處可以做什麼事的(這只是個假設, 因為有時會遇到AE把/CS直接接地或者讓/CS跟/RD, /WR一起出現的CASE)* Q. {& E! x& p; n

- [! A# v, J. g, m# J另外你可能對我講的handshake有點誤解, 很抱歉應該是我沒講清楚造成的
' q. Q/ I# U* {, W在research上有個電路叫asynchronize circuit直接翻譯就變成了非同步電路, 講非同步電路有時會令人誤解, 有時講非同步電路時講的是單純的類似ripper counter那類的電路, 在research上的非同步電路是利用一些handshake的方法來完成, 資料的交換之間並沒有clock, 當然也可以快速且正確的完成工作, 跟16550的時序是沒有任何關係, 就算你整個設計都用asynchronize circuit來完成, 還是可以做到interface timing跟16550完全相容.
! ^8 q( w) ~) W0 A. O至少目前, 我遇到這類問題時都用這樣子的方法來實現, 硬體不見得比較大, 電路也比較穩定.
( `+ E/ d5 q; `, x# _! A$ [! X! h
" o- {6 [/ {, }7 y: F4 h講了這麼多似乎沒有直接回答你的問題, 不過討論這類的問題常需要一來一回的, 這樣PO文似乎不太有效率, 所以我先分享一些我的經驗給你看看, 看是否對你會有所幫助.
6#
 樓主| 發表於 2007-3-3 11:53:27 | 只看該作者
您好& N* d. C* i  F
感謝版主 大大的建議及經驗分享& c- @: I. f* m$ ]) Y! Z
對於數位設計的確讓人傷腦筋7 X* M& h+ n9 `- t. {
有一大堆的情況都要考慮進去' K- V( J' j$ b/ W4 s. ^+ t
需要發很大的心力在設計電路的穩定性上
4 k2 A6 J  v. G* [" S  N
# B# Q( c/ _/ x5 ]4 w4 q6 S大大可否對於handshake在這裡與FIFO搭配使用
) U& ]& U: A8 }/ E' S再進一步說明一下呢
) R0 `6 ]! H0 g# b( r9 f
# ^* u. a, }2 `1 s" |$ m我的想法是這樣不曉得對不對# o/ k- o$ C! J6 m3 a
當要寫入FIFO前先通知/RD電路暫時不要改變read_ptr讀取FIFO5 b6 U3 c% q+ O& z& O/ U" W8 G, n
寫入FIFO後再通知/RD電路可正常動作# R, s. k$ l/ }9 I9 b. H# f8 z
反之讀出FIFO對於寫入電路也用一樣的機制
7#
發表於 2007-3-6 10:13:54 | 只看該作者
意思並沒差太多
$ H( K' [" u  L# r, H) O. i% G# K$ o, t; l% E) S* s, B) m1 ?
換個方式講好了
6 K4 N& b; B8 Y- ~( S4 N& \8 D在狀態改變時, 總是要有相對應的信號出現, 但是別的電路對於這個信號是否需要立即處理可以視情況決定, 而這個信號會停留多久也是看你的設計決定. 一個信號出現時間不管經過多少個clock cycle在 "電路上都很容易解讀為只出現一次" .
, K7 X, h* A- l; W: I; U這也是個解決的好方式.
8#
 樓主| 發表於 2007-3-6 11:52:05 | 只看該作者

回復 #7 tommywgt 的帖子

您好
2 B4 c) e, e0 {
5 C0 S' S7 |! l+ z4 t可是這樣還有問題我搞不懂8 O+ O! w. |7 Z5 f  m7 q( j
# R' E2 a! \8 F1 h0 K
  寫入端有16Xbaud可以當clock可以達成交握動作1 v9 ~" K+ {9 U3 ]
  讀取端邏輯,沒有讀取端的clock只有/RD脈波6 O0 x6 Q# @+ O" ^# V% K
  當/RD來時就表示一定要讀取,而且沒辦法
4 n6 |1 t/ Z7 `& v  D/ W$ l  產生及判斷交握訊號
9#
發表於 2007-3-6 15:54:32 | 只看該作者
需要我寫個code貼上來嗎?
10#
 樓主| 發表於 2007-3-6 20:06:05 | 只看該作者
您好
% F- Z  b+ K4 k8 d' `1 T0 x. R, R+ T  e' `0 J
這部分我實在想不出來6 T- q$ D& @$ V
如果版主 大大可以提供參考例子,那最好不過了
, {) W' H. C2 E- ]7 c; i* Y8 i, {0 \4 `4 n% W* K$ q: t3 q, j5 v
謝謝
11#
發表於 2007-3-6 22:10:35 | 只看該作者
原帖由 tommywgt 於 2007-3-1 14:07 發表5 t+ K! s# s" v' A, y/ J) y" n8 ~
類似因為不同clock而造成的問題在設計時常會遇到
+ H7 M1 k* L. ?/ r
/ }8 [* I2 n: _有人有別的好答案嗎?

; H3 P4 ]) S5 W: g- s) W
  }4 [9 u7 q( T6 p" v2 q+ |, ~( u- L- Y- J* r( a# n
時序的問題這方面我去找找看,我學過我會去翻翻資料.這兩天回覆
12#
發表於 2007-3-6 22:19:18 | 只看該作者
原帖由 bosscck 於 2007-3-6 22:10 發表9 X9 b% F$ E( `- `7 f; O; G
0 y4 p* U) E. O( r( o# U* j0 a

3 R  Q7 F% I: Q6 U( U0 g5 d! }6 g5 Z( n
時序的問題這方面我去找找看,我學過我會去翻翻資料.這兩天回覆

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?申請會員

x
13#
發表於 2007-3-6 22:19:47 | 只看該作者
原帖由 bosscck 於 2007-3-6 22:19 發表* w# ], \- p' [- G% V; Y

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?申請會員

x
14#
發表於 2007-3-6 22:20:06 | 只看該作者
原帖由 bosscck 於 2007-3-6 22:19 發表
% n' _2 W9 {! j( A3 R

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?申請會員

x
15#
發表於 2007-3-6 22:20:31 | 只看該作者
原帖由 bosscck 於 2007-3-6 22:20 發表& M* R' [& q: R5 M3 j6 X8 @# i, v

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?申請會員

x
16#
發表於 2007-3-6 22:20:52 | 只看該作者
原帖由 bosscck 於 2007-3-6 22:20 發表
$ z: V' @6 r! C# `% Z" G9 w

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?申請會員

x
17#
發表於 2007-3-6 22:26:28 | 只看該作者
clock問題,一般來說都會設計成"A主" B,C,D.....跟隨A"clock ; ]4 J4 h, n- g
/ q' U# O: x/ p7 v* X7 C" h+ S
新產品通常都是跟隨舊產品clock,除非新品有更好的clock產生器.
18#
發表於 2007-3-6 23:18:36 | 只看該作者
嗯...感謝你把standard cell based design flow貼出來, 可以給沒做過digital IC的人瞭解一下下
19#
發表於 2007-3-8 00:39:42 | 只看該作者
addn大大7 P- g5 \: [: U) F) F3 d4 m

" ?5 G& n8 r% p) J3 P2 Y其實我這一陣子好忙, 所以常常有點無力感...
% F( E6 O; s( \+ ?; N- Z
  P- [5 }2 H9 {4 ^! G  S+ @你想一下這個東東, 如果再沒答案的話我再PO個CODE上來好嗎?; N: [7 @" e" u, ?+ W5 q: a9 W7 ]

' M" @+ H# r( f7 K) L; A! F你可以試著把那個ptr改成gray code counter看看嗎?
20#
 樓主| 發表於 2007-3-9 10:23:42 | 只看該作者

回復 #19 tommywgt 的帖子

版主 大大 等你有空在幫我解答就好了啦
1 s; J  u: w! `( _6 O4 ^- P
8 a! |5 N' P& w7 U  S  ?0 G我有找到一些對岸的異步FIFO文章,有興趣可以參考看看
1 T$ y7 f% B; c2 e( d( _3 vhttp://www.21ic.com/news/html/70/show1661.htm
! Y7 V9 q+ D. ^7 O% O" \- `" _http://blog.21ic.com/user1/1202/archives/2006/23787.html, r" P) ?: ~: n) W8 n  M/ K
根據文章用格雷碼當ptr的count是可以大大降低亞穩太被取樣到的概率+ n) s: A* f: h$ i0 H- d/ w
可是還是會有最高兩位元同時發生變化的情形,這是不是表示使用格雷3 J" [& j9 Y  L
碼後還是無法百分百保證正確呢
, x: D" D/ |, f& e0 D5 r
! i+ t. H( g5 Y1 O) `2 v0 r; Q0 x還有trigger level要如何由格雷碼的read_ptr,write_ptr去判斷呢
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-5-29 03:33 AM , Processed in 0.146019 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表