Chip123 科技應用創新平台

標題: uart 16550 FIFO問題 [打印本頁]

作者: addn    時間: 2007-3-1 01:39 AM
標題: uart 16550 FIFO問題
各位 大大+ s2 R, `, ~" v" F. {  J9 X
請問有人知道uart 16550 的FIFO的電路結構嗎+ u- T$ `% Q) i, o6 g0 i
7 u# {3 C% H* [% L: C9 L3 O
因為以前有用vhdl做一8250的功能
  A, K3 p8 G7 g( B# Y& _: y0 s想加上FIFO ,變成16550的功能3 H5 w. g' n" [5 J
所以才會想了解16550 FIFO的電路結構
' ]% B5 G' e8 r% p! I3 ]( c. m% l" s: e  O% z
依照data sheet看起來似乎是用異步fifo
0 e+ W2 X( ]1 b寫入跟讀出fifo可以同時操作
& K% U5 @3 t9 v0 M$ m+ Z) t( d' r2 ?% V& I3 L
可是我想到的fifo結構如果同時寫入跟讀出的話,就有機會! Z) i7 v& L0 }
會發生full,empty,level trigger判斷錯誤,如下圖所示& J/ u* U2 \8 O" B; |1 ~) F

作者: tommywgt    時間: 2007-3-1 02:06 PM
非常抱歉, 這個本來的討論被我不小心刪了才要害你重貼, 那天回了很多, 這次我就回的簡潔一點好了+ i5 ~2 Z; ~* K. r4 n0 P+ E

2 B) U7 E# c+ W. U( P  s0 `2 M) x* C# c" M9 u3 X
對於類似因不同clock所引起的問題我的看法有二個:
' h6 t! L! w8 T: q8 w$ X: C1) 使用handshake來完成資料交換 (包括status)
2 E/ w  a+ _" y! `+ Y0 S& v2 l2) 使用較高的clock
0 b5 V8 V% ^$ r* g4 p
- J7 |) o5 N8 O" s由於第2點你已經有提過了, 所以我就針對第2點討論好了9 s% b1 }7 Q# @: \2 C
使用較高的clock可以有二個方式:
8 b0 w' L' d( ]6 q+ S) e$ G1) 使用二個clock之間較高的那一個& e! [* q3 M: w, M4 e# `6 f& u
2) 使用更高的clock8 w5 f, y# T4 t: E) c& m, E7 ?

2 e* t& r) z. M+ f5 v: K$ r無論是選1或2, 都會遇到你說的那個問題
4 }1 D4 o) ^! }我們的目的是不管選用哪種方式都希望可以很穩定的讀取到正確的資料, 接下來我們以RX FIFO來討論好了
) p* x7 v- {* [) D( h" r假設我們在/RD時(讀STATUS)剛好有一筆資料進到RX buffer, 可能對empty及full造成以下幾個可能( |( ]  {( \" h$ ^
1) 本來emptyl變成沒有empty* s( @+ z- q, @9 K6 M& c8 c
2) 本來沒有full變成full ! u- `% I; U  b+ h7 u. |
3) 本來不是empty而且buffer也還夠所以empty跟full都沒改變
; e3 [. k, A) y9 C8 Y1 F
, `8 {- n8 m% J" ~$ R: b. V  K對於case2, 3因為不會造成任何問題, 所以估且不加以討論, 討論case 1的話會發現在/RD出現時有可能
4 z( Z1 T3 e0 S/ a/ N' o9 m1) /RD讀到empty, 故CPU會以為沒資料而去處理別的事, 過會兒再來讀status時才把資料捉走
: n) v8 D6 k" w& ~3 s2) /RD讀到沒有empty, 程式直接捉走FIFO的資料
  W9 x1 v2 a) d2 G
* r1 ^$ h6 Y0 y' w/ B$ [8 j我只能說以上二種情況也不會有問題的, 主要的原因是這幾個信號都是1 bit. 9 X! |1 l; @9 ^) x* B
1 X6 G& G5 d; c) I  |" j
再回到你顧慮的問題討論/ A/ Q3 B; \/ H; W  ^" f' Q
假設說這個status是超過1 bit, 例如: buffer資料的長度, 假設FIFO長度是8的話, 那麼這個值要有3 bits類似的情況發生在/RD時有可能因為011->100時讀到111, 這個也是你圖中所表示的問題, 針對類似的問解決方法應該不少, 我在這提出一個個人的看法 (這個問題用handshake的方法也是可以解決的)$ d% `8 u1 y! O+ A. e( J" m

; W8 k# M7 r' f) W5 F, |下圖是說將資料多COPY一份, 這一份資料的UPDATE跟原來的資料差了一個clock cycle0 I  `4 Y6 S* _, Y- \
假設在/RD時剛好發生資料改變的話, 只有一個值會有問題, 透過VOTE找出沒問題的那二個再決定輸出哪一個穩定的值即可2 V1 ?0 F7 C3 f, i

2 _6 p3 ~) @9 a6 H" u. n- N/ ?以上, 希望會有幫助
作者: tommywgt    時間: 2007-3-1 02:07 PM
類似因為不同clock而造成的問題在設計時常會遇到
  R  ~1 W7 B. B) g0 }/ X) S3 _% O1 V* k, y" Z; I: a/ x
有人有別的好答案嗎?
作者: addn    時間: 2007-3-2 01:16 AM
您好
7 C3 H0 {/ g7 R
- f7 p  U! a0 T感謝版主 大大的講解,提供解決方式的參考
7 J, b8 _" o3 t/ S" T
- D9 Z. u: C* e0 `1 y我這邊還是有一些問題
7 A  ^( U9 o2 [
+ f/ }1 _1 @, l) y" }, N1.1 |+ v5 ~6 K/ U( j6 f! M3 F
RX FIFO  c" O2 [4 Q) d- n: H2 f
write_ptr變動對/RD empty的影響就如同大大所講的
' T5 _' ^$ _+ F" y/ u/ f5 N. P7 ccpu對於錯誤的empty只是延遲下次在來讀FIFO資料,並不會
- T% b2 B6 j. X) @$ z- w造成嚴重的錯誤& x- [1 }1 _( R( B* ^; t
可是
" ^# k- m& y6 \$ P+ Xread_ptr變動對於寫入FIFO full的影響就很嚴重了
: q2 g; T7 m* P: f+ F+ A當要寫入FIFO時誤判FIFO 滿了,這時就會造成溢位的動作
% R' B" X1 p2 p
  c' o9 r5 d8 `1 Q) @; ~! i2.& A6 b0 P) r1 z. y; f2 [
16550有TIGGER LEVEL功能,可以設定當FIFO收到1,4,8或14筆資料時) V& A' [& s8 v! M/ P
去觸發中斷輸出腳INTR, `* y% n$ ^: w$ B9 x% N8 R- @6 P$ x
這樣勢必要有TRIGGER_LEVEL_FLG邏輯來指出是否符合條件
: u% a4 a; O9 q6 b8 ^這TRIGGER_LEVEL_FLG也要根據變動的write_ptr和read_ptr來決定, S: X9 ]: U+ w- ~. V
這樣INTR輸出不是就有機會產生毛刺在write_ptr和read_ptr變動時. K) l; s' \, @$ E* m
那要怎麼消除這毛刺現象呢
; n$ W9 j& Y( `0 G+ W& J  J& m, ~) H% \
3.
3 H1 K/ P9 M( Z, Z5 W6 B8 G如果加上handshake的話,那時序動作可能就會跟16550有些差異了
作者: tommywgt    時間: 2007-3-2 12:10 PM
其實在早期我遇到這類的問題也是用這樣子的方法, 近來我不太使用這個方法了, 這個方法一定可行, 但是就如你問題所說的, 會有一大堆timing的問題, 一個沒有注意到就會留下bugs8 V- n  F5 l2 U* b
/ ^4 j& R% H" \" N0 W6 Y/ S
你的思考很周詳, 顧慮也都沒有錯, 繞在一堆timing打轉時, 腦袋一定很吃力.
9 p+ H  b0 ]- [* N+ Z3 U
' r  |& x" z# J+ [回到我本來的答案, 加以修改還是可以解決你的問題, 在一堆timing打轉時, 一定要非常小心什麼時候會出現什麼信號, 以及這個信號跟別的一大堆信號之間的關係, 只要這些關係都弄清楚的話的, 自然會慢慢的有答案, 在找到不會有問題的答案之前已經不知道跑了多少次的模擬了. 我講的這些你一定很清楚而且感同身受...
' v) z* d* M3 C2 N  M, _& m+ ?) ]* [1 `2 Q2 d3 v
有人說做演算法實現的人比較厲害, 看看這麼多的問題, 幾乎不會出現在演算法實現上, 所以我常常覺得不認同這句話. 一些AE在使用別人設計的IC時常會不保留的直接批評, 殊不知IC designer在這上面花了多少苦心, 深深害怕一個不小心, 多少心血就要再來一次...7 z" z& }/ t. ?- @: c
$ a" y% ?$ J7 v- b
對於你的問題我可以給另一個建議: 很多時候我們常會思考說, 當什麼信號或者狀態出現時, 要做什麼相對的回應, 只是我覺得這個回應不見得必須是即時的. 舉個例子, 在/RD出現時並不是非得把對的資料送出去不可, 在/RD的falling edge到rising edge之間的時間還很長, 資料只要在rising edge加上setup time時間之前送出去就可以確保資料的正確無誤(當然是愈早愈好), 這中間還有好長的時間可以做很多事的. 要啟動一個事件去做一件事也不見得只有一個狀態, 例如在/RD之前, /CS一定會先出現, 這中間一定還有什麼好處可以做什麼事的(這只是個假設, 因為有時會遇到AE把/CS直接接地或者讓/CS跟/RD, /WR一起出現的CASE)& q! ]) L" M. d/ x0 J1 C
$ Z: L# T5 O: ~
另外你可能對我講的handshake有點誤解, 很抱歉應該是我沒講清楚造成的
5 z3 _1 @' `' ]在research上有個電路叫asynchronize circuit直接翻譯就變成了非同步電路, 講非同步電路有時會令人誤解, 有時講非同步電路時講的是單純的類似ripper counter那類的電路, 在research上的非同步電路是利用一些handshake的方法來完成, 資料的交換之間並沒有clock, 當然也可以快速且正確的完成工作, 跟16550的時序是沒有任何關係, 就算你整個設計都用asynchronize circuit來完成, 還是可以做到interface timing跟16550完全相容. " W; ~' [6 Z* S7 I8 v
至少目前, 我遇到這類問題時都用這樣子的方法來實現, 硬體不見得比較大, 電路也比較穩定.
- g+ n# X' c  i" y9 j" A1 H+ y' ^5 s& Y6 d
講了這麼多似乎沒有直接回答你的問題, 不過討論這類的問題常需要一來一回的, 這樣PO文似乎不太有效率, 所以我先分享一些我的經驗給你看看, 看是否對你會有所幫助.
作者: addn    時間: 2007-3-3 11:53 AM
您好0 ?# z: ~0 j' e8 P2 V/ q1 R
感謝版主 大大的建議及經驗分享. L& Y" P( Q5 i1 F& d. e
對於數位設計的確讓人傷腦筋
+ u3 Q+ Y; i4 \- X有一大堆的情況都要考慮進去/ o* }2 [4 u1 Z* \
需要發很大的心力在設計電路的穩定性上. P& ~2 W" Q9 j$ k8 |# B

8 n: T; L, T# s$ d$ v, j' P大大可否對於handshake在這裡與FIFO搭配使用
( [" W/ S- D! l+ I5 b再進一步說明一下呢
5 P+ O. x: w  ^4 N! a9 X" S) d5 e! W6 o' C/ g- ~
我的想法是這樣不曉得對不對7 @8 Z, s# q$ }# ~
當要寫入FIFO前先通知/RD電路暫時不要改變read_ptr讀取FIFO
. {2 @# H( W; [- t" j寫入FIFO後再通知/RD電路可正常動作) b/ p% |6 `7 ^$ Y8 ?
反之讀出FIFO對於寫入電路也用一樣的機制
作者: tommywgt    時間: 2007-3-6 10:13 AM
意思並沒差太多
" D4 w$ S- }4 V. a, \8 y$ E& v9 y; F! a
換個方式講好了
$ F: h7 ~- ~* I0 l在狀態改變時, 總是要有相對應的信號出現, 但是別的電路對於這個信號是否需要立即處理可以視情況決定, 而這個信號會停留多久也是看你的設計決定. 一個信號出現時間不管經過多少個clock cycle在 "電路上都很容易解讀為只出現一次" .
4 }! K) a  I, D( r' c& r這也是個解決的好方式.
作者: addn    時間: 2007-3-6 11:52 AM
標題: 回復 #7 tommywgt 的帖子
您好
" _- ^; w; H# l% Q9 ]( `+ `8 V5 `9 A$ M- B; d* i) l
可是這樣還有問題我搞不懂
# d& i8 A# F9 y: G( C
) ^7 k" \- U# D  寫入端有16Xbaud可以當clock可以達成交握動作
* O( ~8 e/ Z& c  讀取端邏輯,沒有讀取端的clock只有/RD脈波; d! p( z; J3 E" _( n3 l8 ?
  當/RD來時就表示一定要讀取,而且沒辦法
" n! Q1 X8 @/ ~* p( Q1 q6 J+ B  產生及判斷交握訊號
作者: tommywgt    時間: 2007-3-6 03:54 PM
需要我寫個code貼上來嗎?
作者: addn    時間: 2007-3-6 08:06 PM
您好% O1 h; p' ]1 s: W" d3 c) I2 ~* e
) ], y  ]; U0 o+ |, t3 C5 _
這部分我實在想不出來
0 D% l* K$ A, E; x9 G6 s! Q如果版主 大大可以提供參考例子,那最好不過了1 B# O" K$ ?3 x& |

2 Q2 @; L. i! G0 M& U6 N5 A謝謝
作者: bosscck    時間: 2007-3-6 10:10 PM
原帖由 tommywgt 於 2007-3-1 14:07 發表
( S1 k" Y" W5 s" p1 t! r- L類似因為不同clock而造成的問題在設計時常會遇到4 y3 j9 R4 Z+ j5 K% q
6 O+ c8 n& d  [+ K3 m4 V
有人有別的好答案嗎?
& P  M' A  N8 r; U+ ]% e8 Q1 {; f
+ f6 N( F7 l+ ~# c& n2 J

) o6 D/ @& |; ], r  ], K9 d& V) o/ G6 p時序的問題這方面我去找找看,我學過我會去翻翻資料.這兩天回覆
作者: bosscck    時間: 2007-3-6 10:19 PM
原帖由 bosscck 於 2007-3-6 22:10 發表' v# {9 A. O% W

" [  t2 s( D& w+ Q  ^! I
1 H8 H5 }* S5 B1 X7 V9 l/ j2 ], T& D. F- n; ~& |
時序的問題這方面我去找找看,我學過我會去翻翻資料.這兩天回覆

作者: bosscck    時間: 2007-3-6 10:19 PM
原帖由 bosscck 於 2007-3-6 22:19 發表
- A6 v. a, k) H

作者: bosscck    時間: 2007-3-6 10:20 PM
原帖由 bosscck 於 2007-3-6 22:19 發表
) k0 N" D: ^( y1 F; |

作者: bosscck    時間: 2007-3-6 10:20 PM
原帖由 bosscck 於 2007-3-6 22:20 發表
: f' l8 ]) _% v

作者: bosscck    時間: 2007-3-6 10:20 PM
原帖由 bosscck 於 2007-3-6 22:20 發表& m# ~# q' E! X1 Z

作者: bosscck    時間: 2007-3-6 10:26 PM
clock問題,一般來說都會設計成"A主" B,C,D.....跟隨A"clock   R* H4 ~# e, M* @( K' O" h

. h, ^3 `2 P; U5 W新產品通常都是跟隨舊產品clock,除非新品有更好的clock產生器.
作者: tommywgt    時間: 2007-3-6 11:18 PM
嗯...感謝你把standard cell based design flow貼出來, 可以給沒做過digital IC的人瞭解一下下
作者: tommywgt    時間: 2007-3-8 12:39 AM
addn大大
& I( S# |# ]) y2 D3 H) y/ i
7 E( D) V( n# @& [9 ]8 o其實我這一陣子好忙, 所以常常有點無力感...
1 c$ ~* w; g8 I$ Q& X; p# b  p. t. c
  k0 F. e5 v$ O: L  ^/ }' `你想一下這個東東, 如果再沒答案的話我再PO個CODE上來好嗎?
# b1 z! X" k% I' X/ a. u: S
$ @5 i; Y3 Q! M6 _( L+ M你可以試著把那個ptr改成gray code counter看看嗎?
作者: addn    時間: 2007-3-9 10:23 AM
標題: 回復 #19 tommywgt 的帖子
版主 大大 等你有空在幫我解答就好了啦- a, a1 K1 h9 p. H- D
7 n, Z# {' A. X8 @8 k
我有找到一些對岸的異步FIFO文章,有興趣可以參考看看
' g$ A5 w% y2 |( F) chttp://www.21ic.com/news/html/70/show1661.htm5 j$ e" H$ w' n9 B, d6 S' U
http://blog.21ic.com/user1/1202/archives/2006/23787.html
8 J$ z4 [& k7 M# R) D根據文章用格雷碼當ptr的count是可以大大降低亞穩太被取樣到的概率
$ h9 v0 i3 ~! K; p2 A+ Q* }7 P可是還是會有最高兩位元同時發生變化的情形,這是不是表示使用格雷
* J+ ]1 \' z+ f9 A; c; Z碼後還是無法百分百保證正確呢
( M' M3 ~8 L1 B) a, x5 g5 Q7 D$ n0 Q* d) a; G. H6 e
還有trigger level要如何由格雷碼的read_ptr,write_ptr去判斷呢
作者: tommywgt    時間: 2007-3-9 07:56 PM
我來回看看好了...
' t1 L( n9 }( _$ q- I* }$ z! D" M. W( F( D8 D& h
這是我剛想了一下畫的圖你先參考一下
作者: tommywgt    時間: 2007-3-9 08:07 PM
大部分都跟你想的差不多
7 @- x$ p3 ]4 n$ }4 {2 X+ P) a7 P4 X9 [5 g4 R8 [$ j
那些信號也先估且如我假設一般
; W$ _4 D6 a. t0 Y8 mwen是RX收到一筆完整的資料時所送出來的: c" n4 x1 F' V4 k! z3 d5 `
因此我想rptr 跟wptr會像這個樣子(這些都是我直接key的, 語法跟細節再麻煩你檢查一下)
8 @) m; Q" o) g) Nprptr:process(nSysRst, nrd)
2 ]  }& u' d" x3 O" `# abegin) Y& w6 l, {6 Q9 l$ c
    if nSysRst='0' then
& _- X) |* q- i7 p7 I3 K        rptr <= "00000";! F; `' X! L: J" p) e! c
    elsif nrd'event and nrd='1' then% S5 x! A# f6 ]- Q- v  X. O" a! o
        rptr <= rptr + '1';
9 L1 @5 _$ j6 Y! r+ m    end if;
" D$ \- _$ u6 _: s+ g2 Gend process;
' Y8 @$ |% p& g7 g9 q% U) I% p4 \- M: V) x7 r6 r
pwptr:process(nSysRst, wck, wen), a# j  f7 W- U) ?- Q, q$ w
begin2 g& w/ s0 A9 d0 ]
    if nSysRst='0' then' m- D0 t/ J" k
        wptr <= "00000";
+ ^2 C8 c) |6 L  I! d    elsif wck'event and wck='1' then
6 V4 Z7 W) i+ N7 l$ ]- x        if wen='1' then& p) ]& o7 |4 W7 G  {4 I. d8 [1 I
            wptr <= wptr + '1';
8 ]( j/ O1 @! r        end if;% ]7 V2 h! N/ ]$ m' p% r! x2 y
    end if;
% G6 L/ [' o- D9 Yend process;9 v& z2 b8 i. v! c$ j. b7 V4 z) S% f
7 s( X5 ?0 z2 W2 |
假設buffer長度是16的話, wptr跟rprt為什麼都要用5bits 呢?
( |1 O* [+ ]) j* W: ]你一定猜的到主要是為了判斷full跟empty, 後面的code會拿來判斷
作者: tommywgt    時間: 2007-3-9 08:12 PM
直接key怕按錯的話會消失, 所以分段key
+ J2 f( p  n' h3 n( E
- ^5 E5 m; c; _( ~- Z6 m4 [Read buffer部分" k9 s/ _6 S* x- K  @7 ~. A

8 Y4 z; `. G) P+ M0 I; U--read_buffer
* J0 _3 u/ \9 Zwith rptr(3 downto 0) select rdata <=
% Y+ v7 e5 s( O  E8 I3 b; Y    fifo(0) when "0000",
! ?6 e+ T3 V3 \; Q& n1 M# ^    fifo(1) when "0001",4 T) V5 g6 Z8 R* T9 M0 _- ?
    fifo(2) when "0010",
2 ^$ g! N6 x2 M0 o' t& t    fifo(3) when "0011",
3 l, r1 @+ Z7 S* c6 z9 P    fifo(4) when "0100",
) X& g1 J) n+ y    fifo(5) when "0101",! w6 V- L8 \1 M9 T
    fifo(6) when "0110",
+ H" d) q) Z8 T8 z2 o1 s    fifo(7) when "0111",) v6 l) G$ Z: Z) Y  c1 [3 l  K, c
    fifo(8) when "1000",* t  }. l6 w5 W0 N5 [
    fifo(9) when "1001",
# Q! t- g& M  n; Z* O  O    fifo(10) when "1010",3 W0 l# s: p1 e: W+ S: l! L0 G" Z
    fifo(11)when "1011",  X5 {- j+ [; Z7 K# h+ v
    fifo(12) when "1100",2 l) O5 s9 c3 S7 o' X4 R* h- W
    fifo(13) when "1101",
$ P9 }; _* {- Q/ n+ C    fifo(14) when "1110",& [2 l( o, V  L( ]9 m0 _& w
    fifo(15) when others;
作者: tommywgt    時間: 2007-3-9 08:18 PM
write buffer 部分
+ t! z$ u( c3 S- k/ u  d  H) `- X
write_buffer:process(nSysRst, wck, wen, wptr, wdata)+ Z0 \2 G2 Y. [
begin
1 s& {% M* J1 `6 D. }! @3 l4 M    if nSysRst='0' then
. U- ^$ B; `3 `! j        for i in 0 to 15 loop
" I4 Z+ M8 u; I( q            fifo(i) <= "00000000";" P9 j; \3 \0 W# V: ?
        end loop;# r6 j( k( B- S0 k9 e
    elsif wck'event and wck='1' then
: S4 {' c. i/ I+ Q8 ]        if wen='1' then
, P. O! A! w6 T  |( k, x$ B            case wptr(3 downto 0) is
/ d. n; W+ N. M( a+ L, o! R                when "0000" => fifo(0) <=wdata;/ w1 z: P- Z9 z+ a% j3 P. i; H$ q
                when "0001" => fifo(1) <=wdata;7 `1 g$ T% `$ P
                when "0010" => fifo(2) <=wdata;
8 X5 _$ |" r" {' d4 j                when "0011" => fifo(3) <=wdata;
/ H# ^$ Y8 O! R' P, Q- h8 ~- p                when "0100" => fifo(4) <=wdata;
2 j! W5 L* t! d( K' L/ L( l+ r) \                when "0101" => fifo(5) <=wdata;
! k0 W1 d0 [  \5 A8 K5 b  J, L                when "0110" => fifo(6) <=wdata;2 @  _! u7 U/ N0 d( h7 k
                when "0111" => fifo(7) <=wdata;
3 x9 Y) y, D- K$ ^: U                when "1000" => fifo(8) <=wdata;
# l9 H. h) t5 i- S                when "1001" => fifo(9) <=wdata;
( R  B/ H/ Q+ ~' d                when "1010" => fifo(10) <=wdata;
, ~# B& L, H1 c/ R5 W. h                when "1011" => fifo(11) <=wdata;. o' L( c4 T, O7 n$ J# v3 i
                when "1100" => fifo(12) <=wdata;
8 |8 Z& w; J2 {( e" a                when "1101" => fifo(13) <=wdata;
/ ?' p5 w4 S3 S) I* M* O* P                when "1110" => fifo(14) <=wdata;7 E$ g. ]* \- F* A8 K& ^5 I
                when others  => fifo(15) <=wdata;
2 C) `8 @. y( f8 c/ C1 a' ?- Z            end case;' d. ?+ A& {- d! d1 `
        end if;
% p4 c! x: X+ e. U! R% f! c    end if;: s; z/ B, a. O( n& l5 q3 j
end process;
, ~& M3 p6 n8 J+ D' ?* S+ e$ T# N+ v* l5 D9 O
[ 本帖最後由 tommywgt 於 2007-3-9 08:37 PM 編輯 ]
作者: tommywgt    時間: 2007-3-9 08:31 PM
最後是你最關心的部分
7 }0 [' a( S* a% D' p5 [% w2 d我先做些假設
4 w) P7 v6 _+ L  {) ]8 a* P1) /RD動作時狀態不能改變) J7 s. P5 F. A* k5 M# x
2) wen動作時也不能改變狀態
, d& G$ j9 ^# U2 }8 u如果只有這二個case的話以下這段code或許可行
9 j- H; m) F1 \) b7 b/ G+ J
6 a, ]. }7 ?+ ]status:process(nSysRst, wck, wen, nrd, wptr, rptr)
0 K% U; ?# N1 c# U- L, j3 i0 z" z& ?begin
9 L9 I; q# \9 v7 K0 k. E8 Q3 ?$ m    if nSysRst='0' then
  O$ z  y9 Q# j4 G1 [        full <= '0';
2 P  M+ N) I) I! h5 ^        empty <= '0';
7 X9 T' W: M- ^2 q, t8 A" K! c0 M  M        flag1 <= '0';1 m8 V! P- q3 k4 W6 Q8 N0 q  i
        flag4 <= '0';. p. O# I4 l9 y/ f% o
        flag8 <= '0';. E' t$ U1 s! }& T
        flag14 <= '0';
1 g3 F5 q, w8 i5 q7 z    elsif wck'event and wck='1' then! I6 F& G8 K0 w) L* M) P* y6 I
        if wen='0' and nrd='1' then8 P/ W5 q: n; H) J7 `% a; H
            if wptr/=rptr then flag1 <= '1'; else flag1 <= '0'; end if;9 n4 A3 G: A% {$ y" {4 I& t
            if wptr=rptr then empty<='1';  else empty<='0'  end if;2 _, U. g# X0 C+ L
            if wptr(4)/=rptr(4) and wptr(3 downto 0)=rptr(3 downto 0) then full<='1'; else full<='0'; end if;
0 \$ C8 E. D/ n7 Q! g8 @. ?/ ]            if wptr-rptr>"00011" then flag4<='1'; else flag4<='0'; end if;
0 G; B; A3 b2 ~: z            if wptr-rptr>"00111" then flag8<='1'; else flag8<='0'; end if;+ l, @2 [* U0 _: }8 y  i  \
            if wptr-rptr>"01101" then flag14<='1'; else flag14<='0'; end if;. g5 p9 M9 u% M0 g1 N4 h" Y0 H4 H' x+ X6 Y
        end if;
" x) ~& r1 l5 P' W4 a" p    end if;' @/ B! h0 Q& q. n# S
end process;; F3 o2 D2 G7 `) I7 Z8 ?/ H
# K' p0 d6 _  c5 U
[ 本帖最後由 tommywgt 於 2007-3-9 08:52 PM 編輯 ]
作者: tommywgt    時間: 2007-3-9 08:33 PM
前題是wck的clock rate比/rd高: Y3 R; C1 Z, f. {  W
1 m* Y# V- C" V6 w
好像也沒思考太多, 直接key的, 有什麼問題再討論好了...
作者: tommywgt    時間: 2007-3-9 08:39 PM
好像跟之前討論的結果有很大出入...管他的, 你看能不能用比較重要...
作者: addn    時間: 2007-3-10 10:53 PM
謝謝 版主 大大提供的參考範例* E! w; a  U! E2 l: }0 S

! k: A) M4 h1 p$ w, u將code研究後,發現可能會有一些問題,所以將問題po上跟大家討論
: q6 @; e4 d' r% G! ~
: ]1 T6 Q* n' n$ y: z8 n. `1.
2 x. Q) E% j! I   版主之前的兩個假設 "/RD動作時狀態不能改變"及"wen動作時也不能改變狀態"' ^1 f% v/ |3 X" l& [
   這兩個case是發生在best case,可是還要考慮到worst case就是/RD,wen同時發生- q! I+ B0 S: Y0 P" P: T4 d
   wptr及rptr同時發生變化,同時兩者又互為判斷來源依據之一
& B( X% f  `7 V! `2 S5 O2.5 s$ ^; O& o" b4 g  j$ ?2 I# j
   由data sheet看起來,實際在操作上未必能符合wck的clock rate比/rd高  S3 s9 K- P4 v/ Q1 K+ w, K
   假設wck的clock用16xbaud rate或者直接用1.8432 Mhz,由下圖可以看出
& x9 F$ t; D5 K   資料讀取週期RC最小280ns
% L2 K3 t# t- Q4 Z3., {1 K+ Y. H$ M4 A; o9 g  r0 v
   full,empty,trigger level等訊號之設定清除由wck觸發同步,可是當讀取週期' r0 k9 R! z0 }0 l6 {. t
   小小於wck週期的case,會有問題,以trigger level造成的INTR來講
5 D( m: x/ W% N% ?   當FIFO裡的資料都被讀完了以後,INTR不會立即變0,而要等下一個wck的時間' n& X, S9 }0 H9 B/ P, u( R# p
   而這段時間不會造成多餘的中斷被執行嗎
作者: tommywgt    時間: 2007-3-10 11:42 PM
第一個問題我想已經不是什麼嚴重的問題了
. h0 N+ k( E" i3 j( ~! x
/ Z% S4 Z0 M0 M9 S# P) d+ P5 B第二個問題, 如果你不介意把外接的clock接高一點的話也就OK,不過可能就無法達到你要的相容性了( w: R! D3 J9 W& [

3 L+ d3 I7 E2 z! k3 n第三個問題還是clock rate的問題
1 k5 ~2 m* ?+ _5 B. v
* u2 U4 t& n* K第一個問題留給別人回答好了...3 Y) ^; k: C. `
2~3問題的確是問題沒錯, 誰來接手一下呢?
0 C& y8 F6 v. B0 H: q  a6 I0 r
8 i1 n+ {9 u3 zaddn大大一直都很細心, 做什麼的呢? 不介意的話請addn大大自我介紹一下! 讓大家多認識你一下吧!
作者: tommywgt    時間: 2007-3-12 07:55 PM
標題: [ref]asynchronous circuit
有關非同步電路, 先給你一些參考吧!
. h3 O2 w- D! K/ V! D) q; N% }: v4 K7 ^2 e
[1] Bernard Cole, “Asynchronous logic moves toward mainstream acceptance”,  Embedded.Com, March 2006. [link]
' o1 d9 @0 j/ V! P[2] Chris Angelini, “Asynchronous Logic - Who Let The Clocks Out?” ,Computer Power User, May 2005. [link]
* v, I! ^/ E. s+ t; `! I8 \[3] David Geer, “Is it time for clock-less chips?”, IEEE Computer Magazine, May 2005.
* e, a* R3 F( v' ^# b[4] Website of USC Asynchronous CAD/VSLI group. [link]. _! x7 Q: ], X7 i; n; A$ l
[5] “Epson develops the worlds first flexible 8-bit asynchronous microprocessor,” Website of Epson, Feb. 2005. [link]: ]' Y0 S2 v" r. O+ Z# x3 `
[6] “Asynchronous array of processors chip presented at ISSCC 2006”, EETimes.com, Feb. 2006. [link] 7 W) n- i: ]# Z7 z! K5 f' _
[7] I. E. Sutherland, “Micropipelines,” Communications of the ACM, Vol. 32, Issue 6., pp 720-738, June 1989.
作者: addn    時間: 2007-3-12 09:33 PM
版主 大大謝謝你再提供這些參考的資料' u- G% G, `3 Q2 }' k! |+ g
我會好好的找來研究看看
) v1 e: X2 @9 ]9 t$ H7 V4 z
) t6 X2 J6 m; h* ?& P7 c* P- q我本身目前不是從事電子相關行業,不過對於
3 ^* P3 Z) l1 b) B) bFPGA/CPLD,HDL,數位邏輯設計及單晶片等
! a$ q8 c9 `. w, P- m- R都很有興趣,之所以要寫16550 code主要是想1 v; c: ]: ~, i: M$ P0 K; W2 z0 r
挑戰看看自己能不能寫的出來,不過似乎沒那麼容易% Y& h7 c" u7 H8 m& w
2 b% f9 ?9 j% [& `+ u& `
FIFO這部分我有上其他討論區問過,可是都沒人回覆
4 g3 x" `3 t3 R! Q感謝版主願意跟我討論這個問題# W- x/ k# p2 n& @

+ J3 o" y3 B% D" r再次謝謝啦
作者: tommywgt    時間: 2007-3-13 09:31 AM
SORRY...上次回時也沒想那麼多6 @; B3 J/ X8 J; G* I+ s7 l) `2 N0 [" f
不過那些問題總有答案的, 希望各位潛水的版友高手可以幫忙出點意見
8 J9 a' b4 ?0 G, T) n  v. s不然的話就變成只有我們二個人在討論了...
' g: S. j  P! J7 U, |! m8 j2 O2 q
6 f" R! Y+ I( b* s6 F) w0 U( D過幾天沒人回時我再找個時間來回吧!
作者: addn    時間: 2007-3-15 11:46 PM
您好3 h. b  D% Y' v: h7 i3 |+ D
最近想到一種架構,用來做FIFO不曉得可不可行2 g+ ^" L  D2 P# ]
如下圖所示9 V$ I3 z* C# p5 K  ~
3 @% j( m! p. G: k) A
先就full,empty討論,trigger level不管% ^0 C  j6 C1 h# C: M7 W2 I/ D: q- |
讓/RD脈波,16*baud rate週期大大於亞穩態出現的時間
0 f2 U7 Z1 ?/ r2 C" i! R3 z: M
& |* k! H6 _% _7 d/ t1.用額外bit(valid_bit)來指出register是否有資料寫入: _  t9 h6 {) g0 }
  當寫資料到FIFO則相對應的valid_bit會一起被設定為1
1 N8 Y8 z2 f. F4 {* C) d# ~  當讀取FIFO,相對應的valid_bit會被清為01 {( V: _' c: Y- \
, _+ Q+ d2 h1 o! i* p: ?2 h! k/ {
2.wptr及rptr用bin count
) Z9 Q3 q% t# t7 T( C8 h8 C
& R- G1 t% R" ]) v2 r" H% t3.full將所有valid_bit取and,empty將所有valid_bit取nor
. p$ U. z* I0 r
2 y! K9 `  Q/ H3 M4.讀取狀態empty時,/RD下緣將empty訊號鎖住,如此在讀狀態時! b0 b0 v" ~' s+ r+ Y
  worst case(有一筆資料在FIFO可是讀到的狀態是空),這種case6 }( X, \! Q  b" x' X& H
  出現的機會不會太頻繁,就算出現也不過延遲一個讀取週期而已" |# _9 n+ _/ a2 m
9 z: E0 ?% u9 R9 v5 ?; U
5.16*baud rate下緣鎖住full,接收狀態機16*baud rate上緣動作
+ s' F& ?/ `: N2 w  G/ |- N  當接收狀態機要寫資料到FIFO時,如果遇到full(lock)=1時,下一個clk
, g- n0 c7 d; w  週期再判斷一次full(lock)如果也是1,則判定FIFO真的滿了,否則直接
/ @. a* U' R( W4 M- @) Q& N* V0 r  將資料寫入FIFO,如此就可避免可能會發生的worst case(當FIFO還有一
0 }: G" ~" ]' V6 |8 x% X6 m  個位置是空但被判定為已經滿了的狀況)
% P7 V- d3 R1 [7 E1 E8 {6 n
, r  r9 S2 ~  l5 _以上的推論不曉得是否正確
作者: tommywgt    時間: 2007-3-16 09:28 AM
看起來是個好主意% B+ q; P$ v5 h- n& }

5 q9 h* z1 i3 f; h如果不管coding style的話, 這個想法很好
" `5 Q3 x" D( p; o
1 z# M2 Q0 d7 u, W% {相同的, 如果不管coding style的話, 我也有另一個想法一直沒貼上來, 就是使用dual edge在/RD下降綠去記錄狀態, 在/RD週期可以讀到穩定的值, 另外在16x baud的上升跟下降綠也分別去update狀態, 有需要的話可以使用2組buffer length給二邊判斷, 我想這個方式也可以解決你之前問的3個問題. 不過還真的非常的違反coding style rule.
$ j0 O. Z% T' O0 {1 p+ }+ V跟你的方法比起來, 我的方法所產生的硬體似乎小一點點, 但是你的方法似乎比較簡單點.0 o& s, V8 C. }8 T
anyway, 互相交流吧.9 l- w2 M- }) r3 ~  [
1 @( z1 `) {% `4 v, l. h
改天有空的話來討論一下asynchrous circuit也不錯
作者: addn    時間: 2007-3-16 08:13 PM
您好
. X+ y/ ~/ }5 V; M/ m+ z6 P; R; p我想到這個方法除了電路會比較大外還有其他缺點
6 Q6 M' R/ u0 Y9 y( y7 D4 a, a* G- D
# M, m7 i9 P+ |) K1.不適合做成容量較大的FIFO5 `! w4 G, ~2 t( f: V% I- l8 _

9 |: r- K7 j, B6 D9 i2.清除valid_bit邏輯,有用到回授清除的方式,可能會造成其他不好的影響
& n4 i  k" s  _+ q" a" [  L% A. X/ y/ t- k
3.tigger level會用到連續加16次的組合邏輯(把valid_bit全加起來),這樣6 |  T2 i9 a# n
   會有較長的延遲時間,所以速度被拖慢了
/ L4 |& i) b# y; a' Z6 Z- @* `* [0 D7 t
謝謝 版主 大大 再提供了另一個思考的方向
作者: tommywgt    時間: 2007-3-17 10:56 AM
1.不適合做成容量較大的FIFO3 y4 l  B' X  p+ y; [' M$ }
我覺得這部分是OK的, 如果你是在PLD上驗証的話會覺得硬體很大
) D) H! q' k, V3 ~3 s( C但是做ASIC時你會發現其實很小的# A/ A- e9 [0 ?, h
$ z3 {! I! h8 T# U
( o- D8 [# M1 o
2.清除valid_bit邏輯,有用到回授清除的方式,可能會造成其他不好的影響# O! f9 q8 C' N! H' C
這些valid_bit如果跟著某些信的edge反應的話(latch), 問題會比較小, 不過我覺得你本來就會打算這麼做了
9 [# H, B# \/ ]$ w5 N2 N+ [' s8 N2 z. G; E2 L( l2 t, {2 M$ q. B. `
3.tigger level會用到連續加16次的組合邏輯tigger level會用到連續加16次的組合邏輯(把valid_bit全加起來),這樣會有較長的延遲時間,所以速度被拖慢了
7 \9 D1 d% R0 O/ t9 p' }" t! t相同的, 用ASIC製程做時也不會有你講的這些問題, 另外在判斷empty跟full時, 不用全判斷所有的bit (因為這是一個circle buffer)至於判斷其他的 如flag4, flag8...可以想看看有沒簡單一點的方法.
作者: addn    時間: 2007-3-17 07:38 PM
您好
* q& x0 B( [# x1 W9 l7 \
5 X/ N. v) U- y% W3 W& g5 S4 Q- C( K4 o1 p# I- a, n7 d
1.2 E  T- y1 n) O! \& ]% g; \
   "另外在判斷empty跟full時, 不用全判斷所有的bit (因為這是一個circle buffer)"
6 n/ p) m$ \# \% j4 ~# H) B. F" a3 Z( m1 p
   不了解這段話的意思,可以在進一步說明嗎7 N. v6 `% r# w3 f

. H7 l& f* Y' ^& n) ^. u+ r3 s7 ^2.
# }% E% U% C9 I! h0 n) a  我這方法是假設讓/RD脈波,16*baud rate週期大大於亞穩態(metastate)出現的時間
8 B# Z" ?0 e9 X* U% G  才適用的,可是最近看一些關於亞穩態的文章,發現亞穏態維持的時間是不定的,有機會
" B1 e3 a& p% j  超過/RD脈波及16*baud rate週期,這樣的話我想的這個方法就不能用了' V$ r6 y$ Z- I0 \# L; d
  請問有辦法評估亞穩態維持的時間嗎
* z% D7 G2 \3 ~* h  
6 `9 u: {* q: o8 C4 b6 k謝謝# z8 U% r# |# r5 g, n# e
1 O# `" `1 R% A8 v0 W* ~: ?
[ 本帖最後由 addn 於 2007-3-18 10:34 AM 編輯 ]
作者: tommywgt    時間: 2007-3-18 12:55 PM
1. 這是一個很直觀的想法, 全部判斷所有的bit所需要的and / or gate數目跟用multiplexer後只判斷2個bit 所需要的and /or gate數目, 可以評估計算一下, 看哪個比較省, 上回我也沒算, 你可以算算看. ! R! M4 X+ y' ^3 K" c; Y
我舉個例子好了: 如果WPTR永遠指向下一個空的位置的話, 那麼empty/full也可以如此表示:
- W+ h3 @# X# z* h8 C% n' x, z; i! vempty = true if valid[WPTR-1]=false& c# a0 N3 z; W
full = true if valid[WPTR]=true
( z2 W) q0 O) p- X可能還有其他case需要考慮, 畢竟設計的方法不是只有一種而已
8 r& R4 r- \9 c5 u% g; x6 S: e' Q
2. metastate是一個random function, 我們不需要去評估metastate的時間有多長, 我們只要避免在出現的時候產生錯誤的輸出即可.
作者: addn    時間: 2007-3-22 10:36 PM
您好- h& W3 b8 `; I2 X' U: e
關於 metastate
) Y1 [2 U; L& x: R! E5 g# h請問如果一個d-ff假設 clock頻率1 hz; g6 ~6 o0 J4 I. ^0 R6 g, Y* y
如果剛好發生metastate,metastate這個狀態4 \7 g, h- q* R" n- s
有沒有可能有機會維持1秒的時間長度呢) T% J- P8 a' `7 [8 i- b
3 T5 ~5 C% Z* o9 B8 f' Q
謝謝
作者: tommywgt    時間: 2007-3-23 08:41 AM
答案是沒有' @4 i. u# }! ^

( T; T) S9 I; d3 Z, xmetastate的時間長短是根據信號跟gate delay所得的, 也許設的計很糟糕時會出現us, 不然的話應該只會有ns的狀態
作者: addn    時間: 2007-3-23 11:02 AM
您好
2 c7 [7 E& r+ W  C依讀取狀態來說,/RD負緣鎖住empty訊號
0 n* L9 [3 V" G' m% i# X4 D而剛好發生metastate,且剛好時間超過/RD默波的週期* Z4 E. G) P# N3 @3 E
那讀取到的empty不就是錯的嗎 如下圖
作者: tommywgt    時間: 2007-3-23 11:42 AM
這是因為2個clock之間所造成empty信號不滿足於那個DFF的setup time跟hold time.所造成的. 所以問題不在於那個DFF會輸出unknow state, 而是如何提供滿足於DFF setup time and hold time的empty信號才是, 如果是我的話我會回到引起問題的地方找答案, 不會去看那個DFF的輸出
作者: addn    時間: 2007-3-23 01:43 PM
您好  }" \/ P' p6 U. w1 t% H4 ^
所以是否如我37篇所講
# j8 a" j2 [* A2 \# E5 q( l這樣的設計會有問題,因為無法保證發生亞穩態的時間* Y/ b3 |% {! j3 _
比/RD,16*BAUD週期短
* j( L; P1 l+ G& a
2 _" C4 R- r9 T; x那麼這個問題不就無法解決,因為empty可能再任何時間點2 c' b' ?8 @; {" v
發生變化,而/RD脈波也可能再任何時間發生
* {: l: h) H2 q5 k) x
5 L5 T/ \, ^5 o: y3 k請問這樣的架構,有什麼方式可以解決這個問題/ f, h* {( {  u# {, |6 y0 Y* j' r

6 x( F) R2 k$ Y* |3 ^2 x謝謝
作者: tommywgt    時間: 2007-3-23 02:33 PM
就依我看來, 我們二人討論的這些篇幅內就可以湊出答案了, 給你一個建議, 你可以上www.opencores.com下載完整的16550 VHDL source code, 看一下別人是怎麼做的.
3 g; k$ N& N9 d6 b9 \6 r2 ]* C: Y6 p/ {4 d
另外, 你可以試著用自己的想法做看看, 把TX loop back to RX, 然後接個uC寫個程式測個幾天看看
+ L( m# Z* Z2 L' v+ b% ^9 O  F
* V1 H( g7 t* P也許這樣子會比我們在這討論的有效多了
作者: tommywgt    時間: 2007-3-27 10:46 AM
在opencores內是不用註冊的, 直接以cvs下載就行了
作者: addn    時間: 2007-3-27 07:30 PM
原帖由 tommywgt 於 2007-3-27 10:46 AM 發表6 F/ [# t) J: N: e! B. u& F2 ]- \
在opencores內是不用註冊的, 直接以cvs下載就行了

2 h; h+ a# Q, k# N! G4 p( V& u! j7 e$ E6 J5 P. D6 ]% u7 h" u
原來是要選cvs選項就能下載: b! _4 u: D; e9 e+ I0 W' h

1 a7 [* ]. F# k/ _/ r謝謝 版主 大大回覆
作者: 西湖水    時間: 2007-4-10 05:18 PM
你找找這篇文章,simulationg and synthesis techniques for asynchronous FIFO design ,by clifford E.cummings。這是一個很好的文章,肯定對你有用的。資料不在我身邊,所以不能帖上去了
作者: milksoda    時間: 2010-2-1 10:03 AM
好深奧的一堆問題...有看沒有懂= =
作者: keyway    時間: 2010-8-15 08:33 AM
不知道有沒有類似過慮器的架購,謝謝!!!!




歡迎光臨 Chip123 科技應用創新平台 (http://www.chip123.com.tw/) Powered by Discuz! X3.2