Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

[問題求助] uart 16550 FIFO問題

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-3-1 01:39:00 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
各位 大大
1 t% T" w% X3 [+ X# Q請問有人知道uart 16550 的FIFO的電路結構嗎3 [* F6 L1 I! o! R
( C. s( F; L4 D* b9 a: h5 `% V
因為以前有用vhdl做一8250的功能7 a1 I: \- z5 C) l# }; y. @; T1 t% {
想加上FIFO ,變成16550的功能
- f+ V/ B/ h% V$ F) A" Z所以才會想了解16550 FIFO的電路結構# z0 a# ?8 f+ v, p( o4 Y' Y- P( q. b
# S$ ?" E+ C+ _1 k! }+ f
依照data sheet看起來似乎是用異步fifo' c1 A8 T2 H$ I# w
寫入跟讀出fifo可以同時操作
; t/ b+ y" \# Y9 g
% y/ S6 e& ~' }; B: {, O可是我想到的fifo結構如果同時寫入跟讀出的話,就有機會& f4 o4 |9 z+ \) b1 @
會發生full,empty,level trigger判斷錯誤,如下圖所示* ?1 }# e4 d4 g; l' u# E# J

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
49#
發表於 2010-8-15 08:33:22 | 只看該作者
不知道有沒有類似過慮器的架購,謝謝!!!!
48#
發表於 2010-2-1 10:03:59 | 只看該作者
好深奧的一堆問題...有看沒有懂= =
47#
發表於 2007-4-10 17:18:22 | 只看該作者
你找找這篇文章,simulationg and synthesis techniques for asynchronous FIFO design ,by clifford E.cummings。這是一個很好的文章,肯定對你有用的。資料不在我身邊,所以不能帖上去了
46#
 樓主| 發表於 2007-3-27 19:30:40 | 只看該作者
原帖由 tommywgt 於 2007-3-27 10:46 AM 發表" c9 y( k2 g( u
在opencores內是不用註冊的, 直接以cvs下載就行了

. |" ^4 k3 Y5 d: i
& X3 i, h0 \/ J0 I. T原來是要選cvs選項就能下載
, a+ q3 h- _- |: ^7 J! U: o
0 b- R2 L1 b- a5 }6 y+ E( s% D謝謝 版主 大大回覆
45#
發表於 2007-3-27 10:46:51 | 只看該作者
在opencores內是不用註冊的, 直接以cvs下載就行了

評分

參與人數 1 +3 收起 理由
addn + 3 感謝啦!

查看全部評分

44#
發表於 2007-3-23 14:33:38 | 只看該作者
就依我看來, 我們二人討論的這些篇幅內就可以湊出答案了, 給你一個建議, 你可以上www.opencores.com下載完整的16550 VHDL source code, 看一下別人是怎麼做的.
. x" n) }: y; T: f9 e6 y. H
# Z& _# i0 d9 W. e( T1 @另外, 你可以試著用自己的想法做看看, 把TX loop back to RX, 然後接個uC寫個程式測個幾天看看; o# F9 G1 j/ I) B! ]

7 \9 u% I# j5 U* @' H* `* f/ U% Z也許這樣子會比我們在這討論的有效多了
43#
 樓主| 發表於 2007-3-23 13:43:22 | 只看該作者
您好
1 t4 t  z1 m8 P4 k& Q所以是否如我37篇所講
0 J* \! X4 G/ Y這樣的設計會有問題,因為無法保證發生亞穩態的時間
7 r: L# `+ W) w- Z比/RD,16*BAUD週期短8 b" f, b, Z8 Z! h  r

' w+ V. E9 q# `+ ?那麼這個問題不就無法解決,因為empty可能再任何時間點/ Q5 Z5 t; \/ F8 l- O1 m, [7 x5 S
發生變化,而/RD脈波也可能再任何時間發生* m+ X' Y( w: i4 N, W4 z

2 {. y9 m) k* e請問這樣的架構,有什麼方式可以解決這個問題
3 C5 L5 T. e! \7 N5 C( Y; E) X8 f' P
謝謝
42#
發表於 2007-3-23 11:42:09 | 只看該作者
這是因為2個clock之間所造成empty信號不滿足於那個DFF的setup time跟hold time.所造成的. 所以問題不在於那個DFF會輸出unknow state, 而是如何提供滿足於DFF setup time and hold time的empty信號才是, 如果是我的話我會回到引起問題的地方找答案, 不會去看那個DFF的輸出
41#
 樓主| 發表於 2007-3-23 11:02:18 | 只看該作者
您好6 Q0 E' j# a+ W: Q* K
依讀取狀態來說,/RD負緣鎖住empty訊號
4 X, s; B& U9 V# U而剛好發生metastate,且剛好時間超過/RD默波的週期
; {7 z7 e4 u- x1 i' }那讀取到的empty不就是錯的嗎 如下圖

本帖子中包含更多資源

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

x
40#
發表於 2007-3-23 08:41:59 | 只看該作者
答案是沒有
2 i" M+ c( C5 J9 m8 Z! k, P6 w/ Z# B) I/ J. H+ v; B! F
metastate的時間長短是根據信號跟gate delay所得的, 也許設的計很糟糕時會出現us, 不然的話應該只會有ns的狀態
39#
 樓主| 發表於 2007-3-22 22:36:15 | 只看該作者
您好+ m/ I7 P- W, f; N" {
關於 metastate
  F7 U1 u: i/ l2 a5 F4 `請問如果一個d-ff假設 clock頻率1 hz) @6 P: T3 Z- G0 U0 t  ~6 Q
如果剛好發生metastate,metastate這個狀態
3 Z1 y' A& S. x, |1 U; s4 S有沒有可能有機會維持1秒的時間長度呢
1 Y: ]- ~, q/ Z$ e- E! }/ U6 U
+ Q2 ^* V) a, P) _2 V謝謝
38#
發表於 2007-3-18 12:55:01 | 只看該作者
1. 這是一個很直觀的想法, 全部判斷所有的bit所需要的and / or gate數目跟用multiplexer後只判斷2個bit 所需要的and /or gate數目, 可以評估計算一下, 看哪個比較省, 上回我也沒算, 你可以算算看. , G( `  {4 L# h  B' S
我舉個例子好了: 如果WPTR永遠指向下一個空的位置的話, 那麼empty/full也可以如此表示:
6 ]6 B. C" U* F/ a/ }  jempty = true if valid[WPTR-1]=false
& T' S8 I# v, M9 I+ p' y+ Ifull = true if valid[WPTR]=true' ]  K( M8 m" a5 ^- U8 [7 r5 |" t
可能還有其他case需要考慮, 畢竟設計的方法不是只有一種而已
, b4 g& r2 C  n% ^0 l9 g' Z
! z. n( d4 p, V3 u+ y% W& C  i2. metastate是一個random function, 我們不需要去評估metastate的時間有多長, 我們只要避免在出現的時候產生錯誤的輸出即可.
37#
 樓主| 發表於 2007-3-17 19:38:33 | 只看該作者
您好" ?1 p# v2 M) H# h- C+ B
3 Y- h4 n0 D& S  @
  x- R) R4 @1 t* `( Q) Q% t
1.
, }- o9 K! U' |5 T7 x  w. d6 [. C   "另外在判斷empty跟full時, 不用全判斷所有的bit (因為這是一個circle buffer)"( P- e6 p/ g" g& @- y2 c3 C6 V

2 P0 s  \& n6 y% Y6 H   不了解這段話的意思,可以在進一步說明嗎
2 I  z5 ^( H2 z0 A2 P2 w+ F" I( [1 a
" }, f5 i$ C1 o2.6 o; ^$ R9 f3 G7 S2 X0 [
  我這方法是假設讓/RD脈波,16*baud rate週期大大於亞穩態(metastate)出現的時間) l# `! w/ w% t, G0 l
  才適用的,可是最近看一些關於亞穩態的文章,發現亞穏態維持的時間是不定的,有機會2 D* D. g' A3 }0 T" ]. g4 U
  超過/RD脈波及16*baud rate週期,這樣的話我想的這個方法就不能用了8 V! D; B1 O4 Y+ s+ }/ B
  請問有辦法評估亞穩態維持的時間嗎; |& ~5 z+ {7 w4 j+ ?
  & r9 G8 R$ k  X7 x' ?6 k( y/ {
謝謝- D: v2 T9 \" F5 ^3 U) L
- v% L/ y" `+ W7 s+ ]
[ 本帖最後由 addn 於 2007-3-18 10:34 AM 編輯 ]
36#
發表於 2007-3-17 10:56:27 | 只看該作者
1.不適合做成容量較大的FIFO
3 \+ W' G7 u+ x9 M6 O) E我覺得這部分是OK的, 如果你是在PLD上驗証的話會覺得硬體很大0 \8 P  z  s9 L2 N7 V; Z
但是做ASIC時你會發現其實很小的2 D7 Y% E! ^4 _! |
% V* M% g2 Q. s8 o0 U; x

7 g% W5 J+ ?& I4 Z2.清除valid_bit邏輯,有用到回授清除的方式,可能會造成其他不好的影響
# V+ R: A3 ]( u7 @+ r這些valid_bit如果跟著某些信的edge反應的話(latch), 問題會比較小, 不過我覺得你本來就會打算這麼做了0 o& j7 V" I, @" e4 c4 e% ^' k
9 Y* `2 h2 Q  ?8 K+ m) y, f" F
3.tigger level會用到連續加16次的組合邏輯tigger level會用到連續加16次的組合邏輯(把valid_bit全加起來),這樣會有較長的延遲時間,所以速度被拖慢了
& A" j1 O. ?3 N2 S( y" X相同的, 用ASIC製程做時也不會有你講的這些問題, 另外在判斷empty跟full時, 不用全判斷所有的bit (因為這是一個circle buffer)至於判斷其他的 如flag4, flag8...可以想看看有沒簡單一點的方法.
35#
 樓主| 發表於 2007-3-16 20:13:13 | 只看該作者
您好5 ^' U! ]" |$ C5 F2 }' ^8 f
我想到這個方法除了電路會比較大外還有其他缺點/ v& j2 g7 I% O4 a8 Y
1 q4 U  S# H3 K) ?3 G
1.不適合做成容量較大的FIFO2 U2 s( a7 U! C7 s0 \

5 d0 |: `! Z& ^% B: t- [2.清除valid_bit邏輯,有用到回授清除的方式,可能會造成其他不好的影響
6 b4 T4 g2 ?6 B  d6 F, p4 d5 N4 Z
7 o* C. ~& K1 ?+ B8 F+ g+ e% ?3.tigger level會用到連續加16次的組合邏輯(把valid_bit全加起來),這樣0 [5 r& z% K6 I$ o1 A6 B+ U$ w
   會有較長的延遲時間,所以速度被拖慢了2 V3 H/ V& V0 e8 \4 {/ c+ N
7 \4 \& A4 k5 }5 |/ ?" Q2 F
謝謝 版主 大大 再提供了另一個思考的方向
34#
發表於 2007-3-16 09:28:56 | 只看該作者
看起來是個好主意
5 M. L& K- y5 Q* G8 F! C. U
# J* y) r$ T& {, d1 _- P  F0 Z. z如果不管coding style的話, 這個想法很好" l5 Z5 L3 P$ o% m  C
; J, {7 D& Y& Z' Q" q
相同的, 如果不管coding style的話, 我也有另一個想法一直沒貼上來, 就是使用dual edge在/RD下降綠去記錄狀態, 在/RD週期可以讀到穩定的值, 另外在16x baud的上升跟下降綠也分別去update狀態, 有需要的話可以使用2組buffer length給二邊判斷, 我想這個方式也可以解決你之前問的3個問題. 不過還真的非常的違反coding style rule.
$ U  x  o) p! h% J; z跟你的方法比起來, 我的方法所產生的硬體似乎小一點點, 但是你的方法似乎比較簡單點.
4 R4 W0 n9 @6 D  _3 A# E7 {anyway, 互相交流吧.
0 W9 W' P" ]( S0 z. ?
4 |. I  t$ Q2 |, h% \改天有空的話來討論一下asynchrous circuit也不錯
33#
 樓主| 發表於 2007-3-15 23:46:35 | 只看該作者
您好/ l: f& W0 e! w: V; e  u: s
最近想到一種架構,用來做FIFO不曉得可不可行2 Q2 y$ n' ?3 k
如下圖所示% r* f0 F  p: v
/ `# Z4 H7 f. \* X9 s9 G! o8 a. T
先就full,empty討論,trigger level不管+ R& w' O% w7 j  q' v5 o
讓/RD脈波,16*baud rate週期大大於亞穩態出現的時間
+ ?. T4 q: {' r% ^. r" q% S$ h  r1 y  g$ J) m' y1 ]4 ]# v( z, j
1.用額外bit(valid_bit)來指出register是否有資料寫入
$ j  @. C1 j3 h, ?! D6 o  當寫資料到FIFO則相對應的valid_bit會一起被設定為1! [1 P! g; o8 w4 ^3 P
  當讀取FIFO,相對應的valid_bit會被清為0' t1 E1 Y( F, d% J  p  {
- r# }  ?  t( S5 B
2.wptr及rptr用bin count: I! p9 J, O' P5 a: h& Z

" n9 T. u/ g) U5 G; I4 x' S2 _3.full將所有valid_bit取and,empty將所有valid_bit取nor& ?7 T4 Q- X) _5 d1 A, Z

' q; b; E# a& M4.讀取狀態empty時,/RD下緣將empty訊號鎖住,如此在讀狀態時0 n9 M# C# P8 Z6 @+ s) v
  worst case(有一筆資料在FIFO可是讀到的狀態是空),這種case
8 u) e3 \5 g# h* D! y7 @1 I8 B  出現的機會不會太頻繁,就算出現也不過延遲一個讀取週期而已
4 q! r3 ?& Y9 g- b- t4 Y% R! {5 C7 l: D8 f0 |" M
5.16*baud rate下緣鎖住full,接收狀態機16*baud rate上緣動作
9 X: R7 y2 J  K7 Q  當接收狀態機要寫資料到FIFO時,如果遇到full(lock)=1時,下一個clk
0 @$ a6 }9 f- e$ B* t  週期再判斷一次full(lock)如果也是1,則判定FIFO真的滿了,否則直接  P0 S- z: n: ~- ?$ M- z5 m
  將資料寫入FIFO,如此就可避免可能會發生的worst case(當FIFO還有一% ]. K5 S1 M# q- ^! c
  個位置是空但被判定為已經滿了的狀況); u  d& Y& y% f  D* U/ N3 _

# L) [5 m  M/ V! _3 Q0 N# |% ~: [以上的推論不曉得是否正確

本帖子中包含更多資源

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

x

評分

參與人數 1Chipcoin +5 收起 理由
tommywgt + 5 好主意

查看全部評分

32#
發表於 2007-3-13 09:31:02 | 只看該作者
SORRY...上次回時也沒想那麼多
# r2 P0 j# P; ^$ L6 W不過那些問題總有答案的, 希望各位潛水的版友高手可以幫忙出點意見2 A( N  z1 j" e2 I
不然的話就變成只有我們二個人在討論了...( L7 l" w. u! c4 T7 Q9 v+ S, @

. }! W% _' t! M過幾天沒人回時我再找個時間來回吧!
31#
 樓主| 發表於 2007-3-12 21:33:33 | 只看該作者
版主 大大謝謝你再提供這些參考的資料
! Z" U9 p8 E9 U4 b2 k( k3 i我會好好的找來研究看看0 E! G( O" _" S3 n5 C$ m
7 |/ p6 ~+ f$ ?( V% p  l
我本身目前不是從事電子相關行業,不過對於
' {- H( M- e# DFPGA/CPLD,HDL,數位邏輯設計及單晶片等, {9 ]" l/ ^. D: y
都很有興趣,之所以要寫16550 code主要是想! K& b; f2 b. N& x2 U' E
挑戰看看自己能不能寫的出來,不過似乎沒那麼容易8 q0 P0 D. h1 n: W
7 P0 i! w# U! i: r& e7 D: Y* m
FIFO這部分我有上其他討論區問過,可是都沒人回覆
( X6 I( j  [/ q4 S感謝版主願意跟我討論這個問題; X. @( h* b8 K, I9 F' _
* @  u; i% s3 ~
再次謝謝啦
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-16 07:02 AM , Processed in 0.135518 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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