Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

[問題求助] uart 16550 FIFO問題

[複製鏈接]
1#
發表於 2007-3-1 14:06:04 | 顯示全部樓層
非常抱歉, 這個本來的討論被我不小心刪了才要害你重貼, 那天回了很多, 這次我就回的簡潔一點好了
1 _6 H, C) f3 j( o+ S. V0 h& `/ H) R/ B8 c- p) @5 D
; Y6 p( ~( y# Y6 U; t5 U0 c  ]' t: @
對於類似因不同clock所引起的問題我的看法有二個:+ u' w5 K, ^* E' `
1) 使用handshake來完成資料交換 (包括status)
: f) v! U! ?% ^8 r2 P/ |1 |( N2) 使用較高的clock
, `% I( T& O4 `% t" ?9 t/ m3 u$ K$ {+ c
由於第2點你已經有提過了, 所以我就針對第2點討論好了6 Q3 Y/ a8 \4 L  s" I" g
使用較高的clock可以有二個方式:
4 W; j  m, O  a1) 使用二個clock之間較高的那一個
! `* c% z$ b+ b/ }* R2) 使用更高的clock
9 K$ o+ E* Q& T: q- |& `/ h; d4 j4 g4 L6 H
無論是選1或2, 都會遇到你說的那個問題: I4 d( z9 \6 ?8 }! k
我們的目的是不管選用哪種方式都希望可以很穩定的讀取到正確的資料, 接下來我們以RX FIFO來討論好了- W' n" N: M6 Z0 Y, m' k1 i6 E
假設我們在/RD時(讀STATUS)剛好有一筆資料進到RX buffer, 可能對empty及full造成以下幾個可能
6 x" Q7 E- A: B+ }9 I1) 本來emptyl變成沒有empty
. X  i% u1 e/ O: |" E1 Z; P2) 本來沒有full變成full
8 |; C. g' P1 q" J' J5 u3) 本來不是empty而且buffer也還夠所以empty跟full都沒改變6 n8 ]; k; R4 w/ k3 b
$ ?5 U* i  `3 N; o) r$ Z
對於case2, 3因為不會造成任何問題, 所以估且不加以討論, 討論case 1的話會發現在/RD出現時有可能8 x! ]$ w0 d1 S: f
1) /RD讀到empty, 故CPU會以為沒資料而去處理別的事, 過會兒再來讀status時才把資料捉走4 c& J: g! l1 I, U# G  B
2) /RD讀到沒有empty, 程式直接捉走FIFO的資料
+ t" @+ F0 s$ [8 k: i; s; X) _/ S7 v" x8 z
我只能說以上二種情況也不會有問題的, 主要的原因是這幾個信號都是1 bit. $ @3 v  z6 X7 W- v- F' X/ T
) \0 |1 n: m) _0 P& z$ @
再回到你顧慮的問題討論5 X8 f  h. L1 y6 v5 `
假設說這個status是超過1 bit, 例如: buffer資料的長度, 假設FIFO長度是8的話, 那麼這個值要有3 bits類似的情況發生在/RD時有可能因為011->100時讀到111, 這個也是你圖中所表示的問題, 針對類似的問解決方法應該不少, 我在這提出一個個人的看法 (這個問題用handshake的方法也是可以解決的)  j1 l- x* Q7 e
8 `" S' Y5 U$ f  G+ x3 }
下圖是說將資料多COPY一份, 這一份資料的UPDATE跟原來的資料差了一個clock cycle! s* ?0 `. Q, ~# i) a4 ?
假設在/RD時剛好發生資料改變的話, 只有一個值會有問題, 透過VOTE找出沒問題的那二個再決定輸出哪一個穩定的值即可7 V3 f! @: t; T* V

& B* E1 X1 y0 X9 _( c4 m以上, 希望會有幫助

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-3-1 14:07:07 | 顯示全部樓層
類似因為不同clock而造成的問題在設計時常會遇到
" Y, N) i* Y6 b
* N4 {! Y$ V0 d5 B6 R有人有別的好答案嗎?
3#
發表於 2007-3-2 12:10:36 | 顯示全部樓層
其實在早期我遇到這類的問題也是用這樣子的方法, 近來我不太使用這個方法了, 這個方法一定可行, 但是就如你問題所說的, 會有一大堆timing的問題, 一個沒有注意到就會留下bugs
% g5 g- y* ]( S& m! g: b
4 }. r+ K& y& m# y你的思考很周詳, 顧慮也都沒有錯, 繞在一堆timing打轉時, 腦袋一定很吃力." R( B* d) J* [1 U# A: F
# {7 k2 ?. n2 K; h6 o8 L- l
回到我本來的答案, 加以修改還是可以解決你的問題, 在一堆timing打轉時, 一定要非常小心什麼時候會出現什麼信號, 以及這個信號跟別的一大堆信號之間的關係, 只要這些關係都弄清楚的話的, 自然會慢慢的有答案, 在找到不會有問題的答案之前已經不知道跑了多少次的模擬了. 我講的這些你一定很清楚而且感同身受...; W8 z; ]) I) Z: o  Z4 u9 ^; L
' L9 Q1 t8 m& q$ n7 u0 v
有人說做演算法實現的人比較厲害, 看看這麼多的問題, 幾乎不會出現在演算法實現上, 所以我常常覺得不認同這句話. 一些AE在使用別人設計的IC時常會不保留的直接批評, 殊不知IC designer在這上面花了多少苦心, 深深害怕一個不小心, 多少心血就要再來一次.../ ]! K& _$ I  D% x9 O9 Y
) L# i: [4 z; ~2 M) d  l
對於你的問題我可以給另一個建議: 很多時候我們常會思考說, 當什麼信號或者狀態出現時, 要做什麼相對的回應, 只是我覺得這個回應不見得必須是即時的. 舉個例子, 在/RD出現時並不是非得把對的資料送出去不可, 在/RD的falling edge到rising edge之間的時間還很長, 資料只要在rising edge加上setup time時間之前送出去就可以確保資料的正確無誤(當然是愈早愈好), 這中間還有好長的時間可以做很多事的. 要啟動一個事件去做一件事也不見得只有一個狀態, 例如在/RD之前, /CS一定會先出現, 這中間一定還有什麼好處可以做什麼事的(這只是個假設, 因為有時會遇到AE把/CS直接接地或者讓/CS跟/RD, /WR一起出現的CASE)
* {4 A" w5 R; H# v  F
% M. s% n/ t% m+ q另外你可能對我講的handshake有點誤解, 很抱歉應該是我沒講清楚造成的
4 p4 O9 M! q4 e8 h( Y+ G. o, `在research上有個電路叫asynchronize circuit直接翻譯就變成了非同步電路, 講非同步電路有時會令人誤解, 有時講非同步電路時講的是單純的類似ripper counter那類的電路, 在research上的非同步電路是利用一些handshake的方法來完成, 資料的交換之間並沒有clock, 當然也可以快速且正確的完成工作, 跟16550的時序是沒有任何關係, 就算你整個設計都用asynchronize circuit來完成, 還是可以做到interface timing跟16550完全相容.
8 q1 P9 h! }* n- J至少目前, 我遇到這類問題時都用這樣子的方法來實現, 硬體不見得比較大, 電路也比較穩定.
8 m3 l4 ?& p* Y3 \8 U4 I# y
+ I% F% |- ]; Z' O: T; V: S* F' {講了這麼多似乎沒有直接回答你的問題, 不過討論這類的問題常需要一來一回的, 這樣PO文似乎不太有效率, 所以我先分享一些我的經驗給你看看, 看是否對你會有所幫助.
4#
發表於 2007-3-6 10:13:54 | 顯示全部樓層
意思並沒差太多
/ F; }% }+ k( h9 J
8 V9 C, h; ?! p0 y5 h/ F  e) [( @換個方式講好了) h1 E3 x2 [8 I$ Q3 E4 K
在狀態改變時, 總是要有相對應的信號出現, 但是別的電路對於這個信號是否需要立即處理可以視情況決定, 而這個信號會停留多久也是看你的設計決定. 一個信號出現時間不管經過多少個clock cycle在 "電路上都很容易解讀為只出現一次" .8 e7 t  ~& A' o
這也是個解決的好方式.
5#
發表於 2007-3-6 15:54:32 | 顯示全部樓層
需要我寫個code貼上來嗎?
6#
發表於 2007-3-6 23:18:36 | 顯示全部樓層
嗯...感謝你把standard cell based design flow貼出來, 可以給沒做過digital IC的人瞭解一下下
7#
發表於 2007-3-8 00:39:42 | 顯示全部樓層
addn大大( h1 W5 Z0 \$ q9 H' |! Z# f/ O
6 @  E# |) [7 i. F
其實我這一陣子好忙, 所以常常有點無力感...
+ ^- W1 [* J: J& M$ ]4 [8 ^# A: F; v" k7 b3 f
你想一下這個東東, 如果再沒答案的話我再PO個CODE上來好嗎?
4 z0 V% K3 w5 a5 {; p+ G4 ]$ G# X# z8 o  @
你可以試著把那個ptr改成gray code counter看看嗎?
8#
發表於 2007-3-9 19:56:47 | 顯示全部樓層
我來回看看好了...  ~: g, @5 a2 U! T
( m% s, ~* O6 Q1 W) F: {) u
這是我剛想了一下畫的圖你先參考一下

本帖子中包含更多資源

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

x
9#
發表於 2007-3-9 20:07:12 | 顯示全部樓層
大部分都跟你想的差不多
! d, [7 ]$ n. m4 s% g4 g' b1 o8 f
' _5 e. X- N* A  r+ {! {$ w/ K: }3 _那些信號也先估且如我假設一般6 _7 u9 h7 T$ U' s' V% X! p
wen是RX收到一筆完整的資料時所送出來的8 K3 h  j9 z1 D* @( p
因此我想rptr 跟wptr會像這個樣子(這些都是我直接key的, 語法跟細節再麻煩你檢查一下)
/ j( \+ G0 n; Y# T& yprptr:process(nSysRst, nrd)
1 L  a- ]2 s# O. z3 `begin4 q& ]3 {' I  @; T  k3 t- Q  W
    if nSysRst='0' then$ S* Z) U* c$ i1 o7 j6 ]% g- }! [
        rptr <= "00000";
! A; e8 d$ {- E. Q- W. V) d1 V5 m1 R8 l    elsif nrd'event and nrd='1' then
1 Y$ A1 N3 e# U0 G        rptr <= rptr + '1';
8 Z- S8 }# f7 ]1 D7 Y    end if;
0 H% y0 `; B( i* ~9 [0 ]" pend process;
7 j' ^' k! _8 |
2 w+ c# K6 C/ M' I6 N" j/ _pwptr:process(nSysRst, wck, wen)
* q) y: v- S! M- g7 _/ O% M) xbegin: @1 A) g+ [* }
    if nSysRst='0' then
8 W4 n( U$ A- @; u& ], A) Q* k        wptr <= "00000";6 e1 P* s9 p, m. n4 s8 a# d: Z
    elsif wck'event and wck='1' then$ ], ~$ Y! z6 F. f
        if wen='1' then& z' e4 K. t9 K- W7 X* Y
            wptr <= wptr + '1';
% y9 y/ {1 p% z: i        end if;; v$ o: P4 \* J, d' d5 ~6 }- i
    end if;8 D" u0 |* Q  C( D7 O: X
end process;
" v2 e, e0 e; I  i" O6 Z% F; s9 h3 Y+ ]$ ^
假設buffer長度是16的話, wptr跟rprt為什麼都要用5bits 呢?: j0 t2 x* E3 d; v8 j9 |6 F) V) [
你一定猜的到主要是為了判斷full跟empty, 後面的code會拿來判斷
10#
發表於 2007-3-9 20:12:35 | 顯示全部樓層
直接key怕按錯的話會消失, 所以分段key
4 ]* M5 p# T& I1 A' Q% b, x9 n& [7 n2 F4 h' `; q
Read buffer部分% {4 E7 `) [- {+ s, k( c/ N1 |
- M) e# C7 w# Y+ c1 V
--read_buffer$ [+ J9 L) A2 z! ]3 r
with rptr(3 downto 0) select rdata <=3 B! \) q; `6 ~- Y
    fifo(0) when "0000",
% `" a7 f. z% a9 ^1 |    fifo(1) when "0001",
' E  u& Q3 _$ v; \& e9 I    fifo(2) when "0010",$ q9 D4 U* x1 A; p
    fifo(3) when "0011",9 p5 R1 a( G2 `, ~' P/ X) q
    fifo(4) when "0100",: W' D; h) u6 `" Z) ?& C/ u
    fifo(5) when "0101",; W9 @' `+ N. @" I4 f9 N
    fifo(6) when "0110",9 u) i" y6 R! G: |% z7 U
    fifo(7) when "0111",
! V) m# T7 E9 O( y! k4 ]    fifo(8) when "1000",
! f$ u$ ~& F/ V$ v    fifo(9) when "1001",5 S$ a+ r( f# y( k2 ?% f/ O- b
    fifo(10) when "1010",
2 ]2 ]" u) D0 h5 Q2 D6 e9 G' Y  W    fifo(11)when "1011",
9 q- X' v+ L; M    fifo(12) when "1100",
7 h3 M  {# L0 `    fifo(13) when "1101",
/ J% W* \) v; f6 P    fifo(14) when "1110"," U* Z% S8 k  g
    fifo(15) when others;
11#
發表於 2007-3-9 20:18:11 | 顯示全部樓層
write buffer 部分3 Q. }$ H7 O( {8 e$ d! M- ^- i
! }* B0 j" ]$ w; C3 M4 w
write_buffer:process(nSysRst, wck, wen, wptr, wdata)8 Y+ z9 \- ~# z$ J4 y
begin
, d. e% Z& s3 T: b5 E    if nSysRst='0' then
( J* [" k, E, }( ~- c4 p        for i in 0 to 15 loop
' H% f7 Q/ e* d5 v2 q2 D            fifo(i) <= "00000000";
) h7 i. [3 I* w, `& `( j9 a- n        end loop;9 b- ~% w- v( a2 L* r
    elsif wck'event and wck='1' then
1 ], }4 k! s0 G$ I/ N, n* o# K        if wen='1' then
; F: |0 R0 I$ Y% s8 f" x- |7 I            case wptr(3 downto 0) is5 X0 R% }/ @, a0 [6 e( k
                when "0000" => fifo(0) <=wdata;: _  C& h! R& ^
                when "0001" => fifo(1) <=wdata;
* x2 j) H) M; G: F                when "0010" => fifo(2) <=wdata;$ W/ N* O: C1 a: U. I8 w1 m( A
                when "0011" => fifo(3) <=wdata;
) \- S9 R  P. ^& [1 |                when "0100" => fifo(4) <=wdata;% v# U& o! |# Y! ]; ]9 u  t- Q
                when "0101" => fifo(5) <=wdata;
* x3 a: |" _7 P                when "0110" => fifo(6) <=wdata;
1 }$ A7 O; j. D/ v6 B                when "0111" => fifo(7) <=wdata;
/ p4 p6 q2 g4 V( \                when "1000" => fifo(8) <=wdata;
' q, [# U3 f* ?+ e- U; F$ G0 t: g                when "1001" => fifo(9) <=wdata;, M$ w& ^1 D; R
                when "1010" => fifo(10) <=wdata;
  i( H7 i1 k' k0 F                when "1011" => fifo(11) <=wdata;% g$ T3 V: k2 Q+ T% h
                when "1100" => fifo(12) <=wdata;
3 q: ^& l$ S: j! \$ V                when "1101" => fifo(13) <=wdata;
' j% c$ l9 Z$ }/ K                when "1110" => fifo(14) <=wdata;
" ]$ i/ v: H/ N6 A9 M                when others  => fifo(15) <=wdata;) K: c# S4 J. D, G6 N9 C3 y+ y
            end case;
* _8 c" g+ e! Y  @+ k* x3 s        end if;
! C# f/ v3 t5 I' A9 D, d    end if;4 V6 u& |! c' ~* s
end process;8 M. e- U! c8 E& d+ O- d# Y

" O8 G2 u3 s' {" j0 s[ 本帖最後由 tommywgt 於 2007-3-9 08:37 PM 編輯 ]
12#
發表於 2007-3-9 20:31:43 | 顯示全部樓層
最後是你最關心的部分
, y3 N- g. j1 G6 a0 Z- ~我先做些假設
8 L$ Z8 ^" ?/ q/ k& z7 Q) w7 S1) /RD動作時狀態不能改變9 ~. W" U, A# M$ ~. c6 g8 T& Q, j( c
2) wen動作時也不能改變狀態8 u& x6 l$ J9 p" I  E  X9 D" y) H
如果只有這二個case的話以下這段code或許可行3 L* H. J: U( A) N$ Y8 O- R

4 q5 m* C! K$ F5 [6 d( Z: sstatus:process(nSysRst, wck, wen, nrd, wptr, rptr)
) j9 Y3 Q9 L) w+ }% s4 @- s* b/ Kbegin4 Z) r7 s. Z$ D9 W/ c& D
    if nSysRst='0' then. S0 ^; A4 `: j7 Q* D
        full <= '0';
8 o% m) Y' ]$ t9 O        empty <= '0';% u* K( n! S5 \
        flag1 <= '0';
9 `: A1 |" N  R        flag4 <= '0';
9 l2 U! v8 P1 w: w        flag8 <= '0';2 P9 Y2 ]+ p+ d) B. @0 C; k
        flag14 <= '0';
$ B( j: x6 k1 V+ o" D    elsif wck'event and wck='1' then+ U' ^5 m, n& O% U" N$ e+ H4 Q
        if wen='0' and nrd='1' then
1 G/ W3 k- m: q6 G# Q            if wptr/=rptr then flag1 <= '1'; else flag1 <= '0'; end if;
* U% Z- R3 Q: m3 c            if wptr=rptr then empty<='1';  else empty<='0'  end if;8 H" d6 P, C* P& D
            if wptr(4)/=rptr(4) and wptr(3 downto 0)=rptr(3 downto 0) then full<='1'; else full<='0'; end if;7 m# i8 X) i9 J  z* ?+ e, w
            if wptr-rptr>"00011" then flag4<='1'; else flag4<='0'; end if;
( z7 k! ], r$ B8 T: }            if wptr-rptr>"00111" then flag8<='1'; else flag8<='0'; end if;
( q2 C$ ?' p% g            if wptr-rptr>"01101" then flag14<='1'; else flag14<='0'; end if;
2 }0 f* Y" Y* Y: c" W        end if;
) ^! R, f7 g3 D9 P  `9 I9 C    end if;( F3 l9 C  @) d1 I0 m* Z# R: g
end process;( r& o4 R8 q4 V- E: b& e$ f$ {

$ o  U' G: l& \5 V/ f* M& G[ 本帖最後由 tommywgt 於 2007-3-9 08:52 PM 編輯 ]
13#
發表於 2007-3-9 20:33:41 | 顯示全部樓層
前題是wck的clock rate比/rd高/ {' D! ?* F; o& r6 g
# \+ u; Y. B1 v4 m, V
好像也沒思考太多, 直接key的, 有什麼問題再討論好了...
14#
發表於 2007-3-9 20:39:03 | 顯示全部樓層
好像跟之前討論的結果有很大出入...管他的, 你看能不能用比較重要...
15#
發表於 2007-3-10 23:42:10 | 顯示全部樓層
第一個問題我想已經不是什麼嚴重的問題了5 C! x: x' ~+ o" P: y

, K; C2 x, ]& ^0 P第二個問題, 如果你不介意把外接的clock接高一點的話也就OK,不過可能就無法達到你要的相容性了, A( m( C1 q' B" E4 Y
. Z1 Y; Y3 C8 i9 c
第三個問題還是clock rate的問題6 ?' Y( X- ^0 }- t1 h( I
) C& E; E# ~' b- N0 O5 F
第一個問題留給別人回答好了...% Y1 d  a: u- u2 n" t* Q
2~3問題的確是問題沒錯, 誰來接手一下呢?+ D$ p- l$ P2 q" A2 B1 T& `
# Z9 s- a) \6 K5 v& u" F& I
addn大大一直都很細心, 做什麼的呢? 不介意的話請addn大大自我介紹一下! 讓大家多認識你一下吧!
16#
發表於 2007-3-12 19:55:51 | 顯示全部樓層

[ref]asynchronous circuit

有關非同步電路, 先給你一些參考吧!8 \7 V- X5 N7 d) s6 _& h/ m

, J) z: U) U$ X( h% F" V) A[1] Bernard Cole, “Asynchronous logic moves toward mainstream acceptance”,  Embedded.Com, March 2006. [link]8 V- O; j- V% T, b  V( E2 x
[2] Chris Angelini, “Asynchronous Logic - Who Let The Clocks Out?” ,Computer Power User, May 2005. [link]( V; q: e5 J$ X  h/ m
[3] David Geer, “Is it time for clock-less chips?”, IEEE Computer Magazine, May 2005.# i7 G3 J( A) O7 S2 l/ u* t
[4] Website of USC Asynchronous CAD/VSLI group. [link]* s. Y5 d" G* P# Q; h0 B! N
[5] “Epson develops the worlds first flexible 8-bit asynchronous microprocessor,” Website of Epson, Feb. 2005. [link]
3 v- l6 o+ R1 R: }0 X[6] “Asynchronous array of processors chip presented at ISSCC 2006”, EETimes.com, Feb. 2006. [link] * J: _" D" J0 ^, \# v! ]
[7] I. E. Sutherland, “Micropipelines,” Communications of the ACM, Vol. 32, Issue 6., pp 720-738, June 1989.
17#
發表於 2007-3-13 09:31:02 | 顯示全部樓層
SORRY...上次回時也沒想那麼多1 M7 X' u) D& h
不過那些問題總有答案的, 希望各位潛水的版友高手可以幫忙出點意見+ W/ h( m) R1 u+ r2 [
不然的話就變成只有我們二個人在討論了...6 t' D+ X6 C/ u, C0 s% u
3 E) K. K$ T1 H/ ?. {3 P
過幾天沒人回時我再找個時間來回吧!
18#
發表於 2007-3-16 09:28:56 | 顯示全部樓層
看起來是個好主意% O+ r, q+ T' Z' x

. Z& I8 t2 U5 P, D" B( H- L如果不管coding style的話, 這個想法很好; d% O& j9 S) y' j- {; f. R1 I5 m

7 r$ Q) D2 K, d4 C0 O% c, Z5 w相同的, 如果不管coding style的話, 我也有另一個想法一直沒貼上來, 就是使用dual edge在/RD下降綠去記錄狀態, 在/RD週期可以讀到穩定的值, 另外在16x baud的上升跟下降綠也分別去update狀態, 有需要的話可以使用2組buffer length給二邊判斷, 我想這個方式也可以解決你之前問的3個問題. 不過還真的非常的違反coding style rule.
/ E2 ~( h0 A& R7 D$ c2 J跟你的方法比起來, 我的方法所產生的硬體似乎小一點點, 但是你的方法似乎比較簡單點.% o9 H6 s2 ]/ F# G& ]8 R% ^) S" y. W
anyway, 互相交流吧.2 s9 T4 @0 e) }  v$ I
9 ^! T4 z' j5 ~( e- n& B) B
改天有空的話來討論一下asynchrous circuit也不錯
19#
發表於 2007-3-17 10:56:27 | 顯示全部樓層
1.不適合做成容量較大的FIFO/ S6 |+ z5 s* P$ u6 ^5 T
我覺得這部分是OK的, 如果你是在PLD上驗証的話會覺得硬體很大# f& ~& R# S: u6 |! \# X
但是做ASIC時你會發現其實很小的; i" C  R0 b; J( W3 `* b

; t' \7 b5 R' d5 Y, T* h" x+ `6 x& K& E0 G8 c
2.清除valid_bit邏輯,有用到回授清除的方式,可能會造成其他不好的影響- v1 l, i2 G) q- k1 N+ L& J
這些valid_bit如果跟著某些信的edge反應的話(latch), 問題會比較小, 不過我覺得你本來就會打算這麼做了
: [1 Z$ E. \: k( _7 |# a% _% ?* Q( S; |8 Y5 }7 N( F9 ?/ w% r4 E. C
3.tigger level會用到連續加16次的組合邏輯tigger level會用到連續加16次的組合邏輯(把valid_bit全加起來),這樣會有較長的延遲時間,所以速度被拖慢了  r: h+ F9 \% P; i8 d  V& E
相同的, 用ASIC製程做時也不會有你講的這些問題, 另外在判斷empty跟full時, 不用全判斷所有的bit (因為這是一個circle buffer)至於判斷其他的 如flag4, flag8...可以想看看有沒簡單一點的方法.
20#
發表於 2007-3-18 12:55:01 | 顯示全部樓層
1. 這是一個很直觀的想法, 全部判斷所有的bit所需要的and / or gate數目跟用multiplexer後只判斷2個bit 所需要的and /or gate數目, 可以評估計算一下, 看哪個比較省, 上回我也沒算, 你可以算算看. 0 V8 S. e. A+ d6 X4 n& H4 a
我舉個例子好了: 如果WPTR永遠指向下一個空的位置的話, 那麼empty/full也可以如此表示:
: D; P1 P; k% b5 s) J/ f2 |- A0 Cempty = true if valid[WPTR-1]=false( h0 w/ C4 w* @7 H( ^0 z' Z: ?/ `$ g
full = true if valid[WPTR]=true2 z# X9 z/ L* [, P. U/ b2 r6 l
可能還有其他case需要考慮, 畢竟設計的方法不是只有一種而已8 i8 h% j* ~( z1 n1 R; v& b

) ~, t! S8 A8 v2 H2. metastate是一個random function, 我們不需要去評估metastate的時間有多長, 我們只要避免在出現的時候產生錯誤的輸出即可.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-14 12:33 PM , Processed in 0.132007 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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