返回列表 發帖
我來回看看好了...# `; L3 p5 T) I9 `9 Y) d

! `* |, `6 J+ J這是我剛想了一下畫的圖你先參考一下
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊

TOP

大部分都跟你想的差不多
3 v: J( \5 ]7 A* F7 V* E4 R/ p0 ]: W0 c$ }! q
那些信號也先估且如我假設一般
% S5 t$ W; |! z4 ~$ ~4 Twen是RX收到一筆完整的資料時所送出來的& K8 N1 t4 P' f; s, x
因此我想rptr 跟wptr會像這個樣子(這些都是我直接key的, 語法跟細節再麻煩你檢查一下)2 j8 F# Z8 [: l8 u5 `6 c8 N
prptr:process(nSysRst, nrd). @5 r, }7 C/ h3 A/ F0 k9 P4 s4 ^
begin/ @: z6 x" l+ n4 J
    if nSysRst='0' then; l" V7 T0 B  M4 h/ Z  s  q  g/ b$ R
        rptr <= "00000";; Q) a/ X: O  p3 ]# [4 J' M$ K: S
    elsif nrd'event and nrd='1' then0 \, L  F6 R) m1 n- d
        rptr <= rptr + '1';
6 I) g9 r8 p& i; Y3 E! Q    end if;
& o; ^  G0 ?, M* |, T& C- l4 yend process;
8 S8 M6 X% P$ d7 n4 b+ }  p' j8 D& V
pwptr:process(nSysRst, wck, wen)
" C% s- x0 h; N# i- c- q+ ?) Bbegin
. K- ]$ O; h1 Q    if nSysRst='0' then0 {3 N. W' [3 T; A: I5 F( h
        wptr <= "00000";' h; K( P0 A1 p( [$ t; w; W
    elsif wck'event and wck='1' then
6 B( |7 M$ d9 `, R$ l- @        if wen='1' then
& `/ a7 k" y7 {6 O            wptr <= wptr + '1';; B9 ?- R4 Q5 C5 I. ~
        end if;; H  Y9 T# F4 ?: n! K  P
    end if;
$ m6 y7 y$ A- q5 f- Send process;- G# l  [9 o9 D. M
4 b( J3 _" A% L- |9 N
假設buffer長度是16的話, wptr跟rprt為什麼都要用5bits 呢?2 p; E! Z" g, o( c
你一定猜的到主要是為了判斷full跟empty, 後面的code會拿來判斷

TOP

直接key怕按錯的話會消失, 所以分段key1 C7 Q% }1 J  j, d2 W7 t

, j! \: f7 a! A6 u$ T' j1 sRead buffer部分
% {+ t) {$ B( @4 w) A& f# a9 E- |3 b( D$ [7 k
--read_buffer
& P% L+ b! m, owith rptr(3 downto 0) select rdata <=
5 g0 h9 Y' V, k- c* r' |4 F    fifo(0) when "0000",! G: |; n0 ?+ B# b
    fifo(1) when "0001",
9 r* ~7 F! K2 ~4 N* ?1 W$ O+ V    fifo(2) when "0010",% F# p5 s' F9 V* |" s5 @
    fifo(3) when "0011",
# a0 W% a/ N0 ~    fifo(4) when "0100",
9 s  a) D) s, D    fifo(5) when "0101",  g7 R4 H; l. |
    fifo(6) when "0110",
. y1 _$ E4 o, E4 Z1 ^    fifo(7) when "0111",3 e& k8 k2 j" L- N' i
    fifo(8) when "1000",% ^& O, B/ R, q7 |, |
    fifo(9) when "1001",
9 P$ a: o2 o$ |* G    fifo(10) when "1010",
0 R: o. s) Q; h9 @& a( Y) L    fifo(11)when "1011",
# `( U+ W; u. G. L    fifo(12) when "1100",$ \2 b- `8 }2 M% e2 Q& O, \- U
    fifo(13) when "1101",
5 t* |, ]2 ?6 F; T    fifo(14) when "1110",! W6 Z, X( ?  |* t3 J4 P
    fifo(15) when others;

TOP

write buffer 部分
5 b2 k( \" K8 v+ {1 [# b* j# ~& V1 n! F9 k4 ]4 W- K8 J* J
write_buffer:process(nSysRst, wck, wen, wptr, wdata)
( l5 ?1 a6 I- Rbegin
# ]. u# M, i! Q, N6 M2 I+ T+ H* L    if nSysRst='0' then
4 C# f/ S) d* y0 N) m4 X% v        for i in 0 to 15 loop5 @3 C& h: k7 d/ A( b
            fifo(i) <= "00000000";
' A" X: B0 J9 m        end loop;
( f# f; e( y6 ]4 @4 ~0 G    elsif wck'event and wck='1' then
% E9 ^( K9 R+ K9 w' f        if wen='1' then- n- T* N, M: U) R' P& t2 R
            case wptr(3 downto 0) is& p1 O3 L! `" f5 b9 a1 s# v( G; B
                when "0000" => fifo(0) <=wdata;
) k* p- E8 t1 N6 w0 v1 C                when "0001" => fifo(1) <=wdata;
% c/ |6 w; H$ X! q2 \, A                when "0010" => fifo(2) <=wdata;5 a- T3 ^% y+ W" v' {+ ?$ m
                when "0011" => fifo(3) <=wdata;
: z) D+ P+ d# o9 X% T  D                when "0100" => fifo(4) <=wdata;
- ], x* a; l/ |% V* o                when "0101" => fifo(5) <=wdata;
6 {2 j; v6 c. c9 s                when "0110" => fifo(6) <=wdata;$ S( s7 s3 b  U
                when "0111" => fifo(7) <=wdata;7 T6 ~( a: [" |' a6 L9 R
                when "1000" => fifo(8) <=wdata;/ ^$ v! b7 A6 S/ f* @4 x6 ~, G
                when "1001" => fifo(9) <=wdata;
% {2 U/ H2 m  X, E                when "1010" => fifo(10) <=wdata;
  f, _" B$ M+ a" D( [$ R                when "1011" => fifo(11) <=wdata;+ i4 e+ Y) D& p4 B7 P! a! h
                when "1100" => fifo(12) <=wdata;
. S$ F' l. Q2 m- W2 ?0 Q3 t! I                when "1101" => fifo(13) <=wdata;% Y6 i( H9 ^9 o- l$ Q
                when "1110" => fifo(14) <=wdata;
& J' _2 G& q$ [6 ^! t3 y! o                when others  => fifo(15) <=wdata;
' X( B0 x" b+ g% n1 S" Y! W; {            end case;6 R" U, O1 n/ l* y' }& f
        end if;
" Z0 B6 h, ~3 Y, W    end if;- M- S# H8 C# F/ [7 L- _* n5 x4 K
end process;
5 k) ]0 `& }) G1 H' H! P- E5 ~  g' W2 R# x$ X9 v
[ 本帖最後由 tommywgt 於 2007-3-9 08:37 PM 編輯 ]

TOP

最後是你最關心的部分/ Z3 `' a2 }8 c* g
我先做些假設
/ v( `7 ~- u/ Q* ], F% T1) /RD動作時狀態不能改變
, m$ r* J' Q  m: H2 U: ]+ y2) wen動作時也不能改變狀態
% T( X# V0 P" P$ q% m如果只有這二個case的話以下這段code或許可行
. W- L, `$ a* B2 `# ^" P* S) `! W: D- P% D( _
status:process(nSysRst, wck, wen, nrd, wptr, rptr)
: K* D5 w+ W2 v' I( Q& m7 r, }begin
- i2 ^  T% X" R2 G5 b: a3 W+ Y" F    if nSysRst='0' then
& `! r3 i+ u! V! {- q5 H        full <= '0';
& g. A. D5 U- l, V) D1 G: D+ `0 ]: ]        empty <= '0';
% }5 V* P6 z- i5 M* l        flag1 <= '0';
1 k6 V3 S( b3 j/ _; J! V& p        flag4 <= '0';6 F+ \/ v' Q, A& c0 N
        flag8 <= '0';' e  H) E; Y* T" _9 W3 S
        flag14 <= '0';
" A& q# X3 X! e    elsif wck'event and wck='1' then
% o2 c% D& Z  ]1 E" M4 G4 w        if wen='0' and nrd='1' then
) Y# {5 I4 h9 D7 v            if wptr/=rptr then flag1 <= '1'; else flag1 <= '0'; end if;& q- P" |! ^9 }, [/ K( ]
            if wptr=rptr then empty<='1';  else empty<='0'  end if;
$ R: y* t( Y' V0 D! s$ z) r            if wptr(4)/=rptr(4) and wptr(3 downto 0)=rptr(3 downto 0) then full<='1'; else full<='0'; end if;
0 p# A! U% w3 m- [3 B  e            if wptr-rptr>"00011" then flag4<='1'; else flag4<='0'; end if;  Z% e2 V$ Y5 n( w9 X5 F
            if wptr-rptr>"00111" then flag8<='1'; else flag8<='0'; end if;
6 J7 L; ~& ?0 V; @            if wptr-rptr>"01101" then flag14<='1'; else flag14<='0'; end if;7 }- Q8 ]1 I5 j* T0 b! V" f2 ~
        end if;1 X% ~; q& Z  P3 }6 H  V
    end if;4 S6 u$ m+ ^0 {8 D, g8 Q
end process;- \  D* q' `7 n, c
. G% p$ x3 C9 Q+ i4 f, h8 F
[ 本帖最後由 tommywgt 於 2007-3-9 08:52 PM 編輯 ]

TOP

前題是wck的clock rate比/rd高1 b0 u6 t! o5 C4 A; s
$ E! \( n, C7 f: L2 F2 s
好像也沒思考太多, 直接key的, 有什麼問題再討論好了...

TOP

好像跟之前討論的結果有很大出入...管他的, 你看能不能用比較重要...

TOP

謝謝 版主 大大提供的參考範例
7 n: N  o8 L, y. j1 }* _& K" m6 ^# s( _
將code研究後,發現可能會有一些問題,所以將問題po上跟大家討論4 _6 Z  p4 X5 z  O
+ k0 H2 X+ X: S4 v9 A$ Z* G
1.9 r& |; ]8 @( T) n
   版主之前的兩個假設 "/RD動作時狀態不能改變"及"wen動作時也不能改變狀態"
  U2 L* b) }- a0 _   這兩個case是發生在best case,可是還要考慮到worst case就是/RD,wen同時發生& }: {# K) C+ Z, a' u
   wptr及rptr同時發生變化,同時兩者又互為判斷來源依據之一8 R6 m; W  p' z  M1 }. Z% c
2.$ S: [1 T  }4 v) v0 |) p
   由data sheet看起來,實際在操作上未必能符合wck的clock rate比/rd高
0 p- m6 h, l$ P( j& W' B   假設wck的clock用16xbaud rate或者直接用1.8432 Mhz,由下圖可以看出
" e  ~# H5 g3 Z: S- p   資料讀取週期RC最小280ns7 B6 Z& E5 }' |
3.0 n9 T$ s4 |/ c
   full,empty,trigger level等訊號之設定清除由wck觸發同步,可是當讀取週期% d0 b! _' ?7 X# u
   小小於wck週期的case,會有問題,以trigger level造成的INTR來講+ y, o4 P4 z8 c& Q2 X0 M% o1 ?
   當FIFO裡的資料都被讀完了以後,INTR不會立即變0,而要等下一個wck的時間' [! }1 {$ x- e, `: g, R- |0 ]
   而這段時間不會造成多餘的中斷被執行嗎
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊

TOP

第一個問題我想已經不是什麼嚴重的問題了/ _; P6 d4 J! X  f3 n

6 |; F! z& U7 V' m- J: c第二個問題, 如果你不介意把外接的clock接高一點的話也就OK,不過可能就無法達到你要的相容性了6 f5 S, V# ~( Y4 C
3 E7 |0 ^9 D! ]9 M% G4 e) l
第三個問題還是clock rate的問題
# A. J. Y) C5 d( d
8 Y; f( Q1 ?' D- R3 [第一個問題留給別人回答好了...
9 L; s9 h( ?0 Z% o2~3問題的確是問題沒錯, 誰來接手一下呢?
% a% N) N! f6 z2 Y, Q4 i4 O9 r2 p6 x2 @
addn大大一直都很細心, 做什麼的呢? 不介意的話請addn大大自我介紹一下! 讓大家多認識你一下吧!

TOP

[ref]asynchronous circuit

有關非同步電路, 先給你一些參考吧!' a) v, W8 p7 _* S/ b. L

! [) u  d$ ]0 P# K9 n[1] Bernard Cole, “Asynchronous logic moves toward mainstream acceptance”,  Embedded.Com, March 2006. [link]% }* s. G  o- s* g
[2] Chris Angelini, “Asynchronous Logic - Who Let The Clocks Out?” ,Computer Power User, May 2005. [link]6 f" G) y  n+ a" P) {# q
[3] David Geer, “Is it time for clock-less chips?”, IEEE Computer Magazine, May 2005./ c/ j  [: x* }3 C  [
[4] Website of USC Asynchronous CAD/VSLI group. [link]
  B, @# m: ?) K* u" j; Y: R# A[5] “Epson develops the worlds first flexible 8-bit asynchronous microprocessor,” Website of Epson, Feb. 2005. [link]
3 X: g/ |' l( O: l: G[6] “Asynchronous array of processors chip presented at ISSCC 2006”, EETimes.com, Feb. 2006. [link] / _8 X' R5 ^2 o. n
[7] I. E. Sutherland, “Micropipelines,” Communications of the ACM, Vol. 32, Issue 6., pp 720-738, June 1989.

TOP

版主 大大謝謝你再提供這些參考的資料% v! z! z  Y- i6 d6 M
我會好好的找來研究看看4 S3 V. D& ]7 P0 w
/ y2 _" U0 ?7 ?% `2 D( A
我本身目前不是從事電子相關行業,不過對於7 r# g! `1 U% k5 w# z
FPGA/CPLD,HDL,數位邏輯設計及單晶片等
7 g" m) m- \2 _& S# ?都很有興趣,之所以要寫16550 code主要是想  i( k5 h9 d/ U/ ~1 D' s
挑戰看看自己能不能寫的出來,不過似乎沒那麼容易
' S* N9 I) a7 ]; u5 H. Z( B; |$ l8 \, R* b9 J
FIFO這部分我有上其他討論區問過,可是都沒人回覆
) j0 r% A) \3 i+ z9 D感謝版主願意跟我討論這個問題
& V( D. d1 ?9 {% i  ?( N. k  e. [. N3 ?9 K8 F2 Y
再次謝謝啦

TOP

SORRY...上次回時也沒想那麼多
7 s! v2 h( m7 W2 ~" l) u' F不過那些問題總有答案的, 希望各位潛水的版友高手可以幫忙出點意見" t. a; j, y! D4 `# N3 v' f5 \
不然的話就變成只有我們二個人在討論了.../ J/ B6 \; J: x; c/ ?0 x1 ^0 w

$ s; v" E& P2 s5 ]- j5 C, i過幾天沒人回時我再找個時間來回吧!

TOP

您好% Z  r3 \9 Q! W3 }: ^
最近想到一種架構,用來做FIFO不曉得可不可行7 O3 q7 T, L5 ^" W) I8 G  N
如下圖所示: E( u  h  ^7 m8 C6 @, X
2 ]5 r/ s/ m) H* r$ a: ^
先就full,empty討論,trigger level不管
- a( V% W  U+ o% Z' [$ ^讓/RD脈波,16*baud rate週期大大於亞穩態出現的時間8 ^+ V8 L4 l  R: B( }
* @! H- B; a; v3 I- \, _
1.用額外bit(valid_bit)來指出register是否有資料寫入/ t2 T9 ~. R9 o1 ~
  當寫資料到FIFO則相對應的valid_bit會一起被設定為1
8 v4 t% p* B2 p0 f6 \0 r6 _2 k  當讀取FIFO,相對應的valid_bit會被清為0
7 ~: o( J( }8 P& x( ]) ~4 F& R+ ?
9 d8 V$ m4 u9 {/ K  |9 T7 i2.wptr及rptr用bin count
- a) z6 {' v. d8 a+ Y) W3 H# w# y# H" F. ?- [5 [+ e. ?
3.full將所有valid_bit取and,empty將所有valid_bit取nor1 T/ @; ^- W6 u7 I* K  K; N

, b( Q! W1 f9 p, `1 \, t1 l3 T+ e4.讀取狀態empty時,/RD下緣將empty訊號鎖住,如此在讀狀態時
) s* B0 {6 z' a5 Y4 B0 d7 c  worst case(有一筆資料在FIFO可是讀到的狀態是空),這種case+ O* M# v! \. Q0 u: Q
  出現的機會不會太頻繁,就算出現也不過延遲一個讀取週期而已, [4 M. _4 t, e( O
/ i2 y6 k3 A1 w2 o
5.16*baud rate下緣鎖住full,接收狀態機16*baud rate上緣動作
2 b, S& E# F& m# J. ?4 B/ \0 E  當接收狀態機要寫資料到FIFO時,如果遇到full(lock)=1時,下一個clk+ U& y/ d( q* f" L0 F
  週期再判斷一次full(lock)如果也是1,則判定FIFO真的滿了,否則直接
& d6 H: `/ c; y5 ~* l- m  將資料寫入FIFO,如此就可避免可能會發生的worst case(當FIFO還有一5 {  u9 O* Z. F# u
  個位置是空但被判定為已經滿了的狀況)
; z' I" t4 |8 f% z7 D0 ~5 T& K- B( s$ o9 L0 B5 X2 @
以上的推論不曉得是否正確
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊
1

評分人數

TOP

看起來是個好主意
6 }# V4 U' x, |& t9 H1 t6 V, i1 Z" }
如果不管coding style的話, 這個想法很好! p7 m+ A! c( s& W6 @
) f$ I7 ~( l% k' u  q* |
相同的, 如果不管coding style的話, 我也有另一個想法一直沒貼上來, 就是使用dual edge在/RD下降綠去記錄狀態, 在/RD週期可以讀到穩定的值, 另外在16x baud的上升跟下降綠也分別去update狀態, 有需要的話可以使用2組buffer length給二邊判斷, 我想這個方式也可以解決你之前問的3個問題. 不過還真的非常的違反coding style rule.. `5 H' f$ `. E: \
跟你的方法比起來, 我的方法所產生的硬體似乎小一點點, 但是你的方法似乎比較簡單點.
3 I" r7 k9 W- k* ^6 n* T$ aanyway, 互相交流吧.: K, t( B1 D$ t& B1 e9 F5 @5 e

. Y- |( S  r; U) r9 x改天有空的話來討論一下asynchrous circuit也不錯

TOP

您好
2 D! ~) \7 D  b. p! k% ^( R我想到這個方法除了電路會比較大外還有其他缺點, f% Z; j+ B6 M2 ?( C

7 {; F: ]9 q4 a8 h7 I' u+ v1.不適合做成容量較大的FIFO
$ I9 J, M- V4 n3 N4 z/ {  b$ I! a/ t+ B4 d6 z! J
2.清除valid_bit邏輯,有用到回授清除的方式,可能會造成其他不好的影響
+ i& Y* T4 [, O7 v  p5 j# A7 W% C2 f* j  k: v2 P( J
3.tigger level會用到連續加16次的組合邏輯(把valid_bit全加起來),這樣
$ c# ~; ]6 w- H& o2 F: \' J   會有較長的延遲時間,所以速度被拖慢了9 I1 h+ G9 f$ |8 g) n0 T

; ?/ c) I5 ~0 \( ?  y- J謝謝 版主 大大 再提供了另一個思考的方向

TOP

1.不適合做成容量較大的FIFO
! \$ r& k( z  A: ^我覺得這部分是OK的, 如果你是在PLD上驗証的話會覺得硬體很大
( v* p3 B) A/ G) c0 B但是做ASIC時你會發現其實很小的
% J; y6 [4 v2 V8 _/ U1 \
& }4 i6 ^: I6 J9 T: I; Y( ?- `8 v; L- w( _1 l+ v! x0 P9 U
2.清除valid_bit邏輯,有用到回授清除的方式,可能會造成其他不好的影響
9 _/ ~2 x0 V% T3 B# J  j, V這些valid_bit如果跟著某些信的edge反應的話(latch), 問題會比較小, 不過我覺得你本來就會打算這麼做了
0 V% i" ?! Q0 ]  L. U. _& }- s
7 F/ z4 w% s, K  @3.tigger level會用到連續加16次的組合邏輯tigger level會用到連續加16次的組合邏輯(把valid_bit全加起來),這樣會有較長的延遲時間,所以速度被拖慢了( c' i; {8 R  X8 U; K, |
相同的, 用ASIC製程做時也不會有你講的這些問題, 另外在判斷empty跟full時, 不用全判斷所有的bit (因為這是一個circle buffer)至於判斷其他的 如flag4, flag8...可以想看看有沒簡單一點的方法.

TOP

您好0 ~4 _4 S% i& M
# |0 L7 [! ^( l

! i# e; m5 P2 }5 O4 ?+ @9 K3 D/ f1.
% i" X- L/ l: c/ o* S; m   "另外在判斷empty跟full時, 不用全判斷所有的bit (因為這是一個circle buffer)"
9 @' p) C  p  x/ q: n+ S$ ~7 ?3 s1 j" b" N2 u
   不了解這段話的意思,可以在進一步說明嗎! M& a2 E5 M5 }/ `6 O9 W' t

2 i6 R7 ~: n) O( L+ x. f( t2.
6 e: n# B& H$ j1 F: t* Z/ J  我這方法是假設讓/RD脈波,16*baud rate週期大大於亞穩態(metastate)出現的時間
! i8 z7 A: V8 A) f. c! z3 P0 r9 H  才適用的,可是最近看一些關於亞穩態的文章,發現亞穏態維持的時間是不定的,有機會$ M1 g8 u" u+ t& o, E6 q. p
  超過/RD脈波及16*baud rate週期,這樣的話我想的這個方法就不能用了1 w, ]9 ?7 M+ K+ I: G
  請問有辦法評估亞穩態維持的時間嗎. H% g% ]; \- m9 n! @- `
  
6 Q% L* g4 ]2 e/ S謝謝, p  T  j& |; R5 r5 }7 z- y) {; Z

' F7 F/ U7 q& m. Q* S[ 本帖最後由 addn 於 2007-3-18 10:34 AM 編輯 ]

TOP

1. 這是一個很直觀的想法, 全部判斷所有的bit所需要的and / or gate數目跟用multiplexer後只判斷2個bit 所需要的and /or gate數目, 可以評估計算一下, 看哪個比較省, 上回我也沒算, 你可以算算看. 2 s0 l6 U& G) r! U) G! J5 j' M$ D
我舉個例子好了: 如果WPTR永遠指向下一個空的位置的話, 那麼empty/full也可以如此表示:& U8 W/ }0 w  c, q+ Y& l+ X
empty = true if valid[WPTR-1]=false6 f3 e9 x  i, R& F
full = true if valid[WPTR]=true
7 d# G# {2 ~  [# A可能還有其他case需要考慮, 畢竟設計的方法不是只有一種而已
- {; Y9 \' h  J: c( P* {8 I6 I/ X6 x1 g8 J$ ^; u. ]
2. metastate是一個random function, 我們不需要去評估metastate的時間有多長, 我們只要避免在出現的時候產生錯誤的輸出即可.

TOP

您好- V2 x+ Q) h" p2 S
關於 metastate
# x4 L- B; K. T5 P請問如果一個d-ff假設 clock頻率1 hz
( u  e  v+ r% s如果剛好發生metastate,metastate這個狀態
$ D3 h; |6 G) G) G1 L有沒有可能有機會維持1秒的時間長度呢
; t- ~: N& Y7 m( Z8 Q) E+ q! T
* X, ]  ?# _' Z9 f" s謝謝

TOP

答案是沒有
4 N: E  N* g4 D  d3 U$ F" e5 Y: |/ _
' c2 E; ?( x6 Z2 @5 ?$ ~metastate的時間長短是根據信號跟gate delay所得的, 也許設的計很糟糕時會出現us, 不然的話應該只會有ns的狀態

TOP

返回列表

站長推薦 關閉



查看