Chip123 科技應用創新平台

標題: 网上一个经典异步FIFO程序 [打印本頁]

作者: xuduo6845    時間: 2009-9-4 11:24 AM
標題: 网上一个经典异步FIFO程序
请问其中ASIZE为什么是4?我觉得应该是3.我在一本书上看到也是4.
1 Z- b/ s8 Z$ Gmodule fifo1(rdata, wfull, rempty, wdata, winc, wclk, wrst_n,rinc, rclk, rrst_n); . ], _, B/ N6 a5 ?
parameter DSIZE = 8; parameter ASIZE = 4;
- {0 o8 h* U6 F# N2 `4 loutput [DSIZE-1:0] rdata;
" y, z- N  t4 V; o7 G2 A; toutput wfull; # X& a: U" ]2 {5 O. `3 _+ l: [# s
output rempty;
: _" w. W. P( U( @input [DSIZE-1:0] wdata;
/ c9 B) o  a" g. z/ ninput winc, wclk, wrst_n;
/ N- e& w' N: a" |input rinc, rclk, rrst_n;
6 T: s6 ^- [6 B0 U# y, F; p* yreg wfull,rempty; . u2 ~/ E) L1 f1 x7 I
reg [ASIZE:0] wptr, rptr, wq2_rptr, rq2_wptr, wq1_rptr,rq1_wptr; : I- V$ K8 @2 F) R" v; g
reg [ASIZE:0] rbin, wbin; . K# x6 n8 f7 s- t$ h6 K
reg [DSIZE-1:0] mem[0: (1<<ASIZE)-1];
) o7 P; g- J& F/ `% g1 F  ~4 |wire [ASIZE-1:0] waddr, raddr; 3 y  P; j; t0 L! {& r* A
wire [ASIZE:0] rgraynext, rbinnext,wgraynext,wbinnext;
5 n( N( A) v; x8 L8 b9 vwire rempty_val,wfull_val;
. \; c  h  a3 t
. y2 S1 ~1 r$ P1 q6 b& Oassign rdata=mem[raddr];
: o3 n8 ~# y" `always@(posedge wclk)
4 w  K" E$ ^) G' T" Eif (winc && !wfull) mem[waddr] <= wdata; / I& g+ y3 g6 l! G6 Y8 A9 F
2 {% [$ ?0 f5 ~) p, G
always @(posedge wclk or negedge wrst_n) 9 j  n- E+ d$ C" V+ I  O
if (!wrst_n) {wq2_rptr,wq1_rptr} <= 0;
; g4 f8 f+ j+ f: v5 D+ Relse {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};
1 B& n8 W1 }) W3 [, Z
' Y! n- ~) y3 w' A5 calways @(posedge rclk or negedge rrst_n)
3 R: T9 N% h. R) U# Y! `: oif (!rrst_n) {rq2_wptr,rq1_wptr} <= 0;
, x+ R" b# W3 h5 m. q/ welse {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr};
- O7 p( L0 J: u( f- [# ?& n1 ^. F& ?+ W8 ~7 J, V
& J7 G+ G3 ]& u( i8 _
always @(posedge rclk or negedge rrst_n) // GRAYSTYLE2 pointer
* I% f# [8 f- [% c" [; |begin ) W9 X: Q& b& Y- L8 n7 v- x, j
if (!rrst_n) {rbin, rptr} <= 0; # K  A9 r4 a# B. p" d% p) ~, ~8 T
else {rbin, rptr} <= {rbinnext, rgraynext}; " i% i2 Q. W) @2 G, U; @
end & F0 k7 `3 w  p  j8 E

' {# O4 `0 N# ?0 V
& @* t1 S+ ~' c- iassign raddr = rbin[ASIZE-1:0];
$ U8 O7 ~% ]/ j; o; [) `3 h) Lassign rbinnext = rbin + (rinc & ~rempty);
6 c8 Q/ V6 `3 W0 V* Yassign rgraynext = (rbinnext>>1) ^ rbinnext; 8 K. h" w: n: x5 @/ O3 F- Y$ D
9 F4 K& h2 H5 P: T6 c# @" e) F) k
  i8 _) G4 {) T( K" H
assign rempty_val = (rgraynext == rq2_wptr); % }1 ]1 v0 {; I3 w
always @(posedge rclk or negedge rrst_n)
: w' Z4 j& |7 b) z. b# O$ w1 G/ fbegin , U& b( y: _; n1 X% I. N
if (!rrst_n) rempty <= 1'b1;
3 N- L! |1 Q& T' X' Celse rempty <= rempty_val;
! p6 L6 w: Y# c- t" m3 fend
# {8 H8 Q" a1 }9 X* O, H$ w. a0 h7 s( h5 ]' q& r( n3 r
, H, z; M  E. C+ I5 U8 H
always @(posedge wclk or negedge wrst_n) // GRAYSTYLE2 pointer
( D4 R/ G' b  I4 g/ n0 ?7 k) wif (!wrst_n) {wbin, wptr} <= 0; ; i8 Q  w+ s' x  E4 }) K
else {wbin, wptr} <= {wbinnext, wgraynext};
* g' Q: z" H7 p5 ^' K" v+ D
7 q6 V8 C/ `4 i. }2 p6 n# J$ D7 k& J% D2 N/ J" o
assign waddr = wbin[ASIZE-1:0]; ! _! x) N% L. {3 h4 V
assign wbinnext = wbin + (winc & ~wfull);
# O4 C# N+ e% N% G; P4 Zassign wgraynext = (wbinnext>>1) ^ wbinnext; ) A( x' {* I4 A) B7 K1 }
assign wfull_val = (wgraynext=={~wq2_rptr[ASIZE:ASIZE-1], wq2_rptr[ASIZE-2:0]}); //:ASIZE-1]
7 W9 [3 y' w; s2 T6 G( B2 N% _always @(posedge wclk or negedge wrst_n) 3 q- w$ P  i3 K( }
if (!wrst_n) wfull <= 1'b0; 6 B- ?* r0 y. Z8 p' ]/ ?9 c
else wfull <= wfull_val; 2 {1 k. m3 L$ m6 ]; p- X) L
endmodule# A4 N! u+ _2 m# N* v9 \) X

  F- S7 a2 k& g3 \2 U7 e+ A[ 本帖最後由 xuduo6845 於 2009-9-4 11:25 AM 編輯 ]
作者: addn    時間: 2009-9-8 09:17 PM
您好
9 V4 K6 S! j5 j$ ~" T1 i5 q: z3 \9 h5 ^) {5 O( ?
這個好久前有大概看過,現在忘了差不多了,只剩模糊印像," |$ p5 E6 _2 l3 b7 H. c
ASIZE = 4,實際memory address為ASIZE-1
1 S* j1 N' ]$ I1 ~$ d主要是這做法用了反射式gray 碼的原故,所以memory address為4bit6 b, j3 X- Y. F( b# u
轉換為反射式gray 碼就要變成5bit,最高bit可被用來做判斷.......細節你9 _- y' ^5 w! c
要在找看看,抱歉我只記得這樣
作者: tommy123    時間: 2009-9-29 04:21 PM
多一個bit主要是要用來計算 FIFO Full or Empty




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