|
请问其中ASIZE为什么是4?我觉得应该是3.我在一本书上看到也是4.
: { T( S- f: Cmodule fifo1(rdata, wfull, rempty, wdata, winc, wclk, wrst_n,rinc, rclk, rrst_n); ; Z: Q' \; Q9 p
parameter DSIZE = 8; parameter ASIZE = 4; ' F& O* c' d- F \$ r* G
output [DSIZE-1:0] rdata;
- c Z6 _& k) [% s7 i% |/ o4 e ]output wfull; - Q9 |# W9 P" R6 M6 K( L3 j* R
output rempty; % O6 [8 z; y2 Q: b- E/ _6 z( a
input [DSIZE-1:0] wdata; + x2 l! i2 B& w8 B, |5 J7 `
input winc, wclk, wrst_n;
8 D p: P( V$ R- H2 Uinput rinc, rclk, rrst_n; 1 ?! T$ g6 k+ r5 u! y
reg wfull,rempty; . i0 p8 t2 Y# V! d% }1 M r1 F
reg [ASIZE:0] wptr, rptr, wq2_rptr, rq2_wptr, wq1_rptr,rq1_wptr;
9 Q# d. }# W4 [ b0 breg [ASIZE:0] rbin, wbin; ( m6 Q6 W! o# y- `
reg [DSIZE-1:0] mem[0: (1<<ASIZE)-1];
- Q0 c; E+ t3 C7 M4 hwire [ASIZE-1:0] waddr, raddr;
. s1 z% q6 ^1 m, A! K% J/ v( ]wire [ASIZE:0] rgraynext, rbinnext,wgraynext,wbinnext;
5 b. A( d& z; ewire rempty_val,wfull_val; ( H0 D" u3 ?: b& ?2 v4 b! U
4 U3 q/ i, v& X+ u. ^$ U2 _% B- I5 x% [assign rdata=mem[raddr];
/ T: B* o" e4 w, B) H0 W) ]always@(posedge wclk) + g E$ _# |. h7 k
if (winc && !wfull) mem[waddr] <= wdata;
6 V$ ~: S# z$ w% f/ ?8 Y. h* V+ ]! Q1 g
5 ?/ Y7 y4 d, I) e( T0 Yalways @(posedge wclk or negedge wrst_n) 8 W. F& f8 f6 p% Q
if (!wrst_n) {wq2_rptr,wq1_rptr} <= 0;
- u, b6 w+ ~" U; Yelse {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};
0 ~. q6 R$ O# i" r. ^
; H# _: C/ l; {always @(posedge rclk or negedge rrst_n) 0 F2 c i0 _3 J: w
if (!rrst_n) {rq2_wptr,rq1_wptr} <= 0; + z$ y( G/ E9 a7 a9 G! m8 |
else {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr};
& o5 h0 l8 a d0 r6 k. Q: ]& l
r# {; K+ a) n7 H( N6 J# D1 H9 i3 ?+ R
always @(posedge rclk or negedge rrst_n) // GRAYSTYLE2 pointer # D% ~/ M# q( p" K5 u. T
begin % l& u/ m8 u6 N, l. }) S/ G& [, M0 s
if (!rrst_n) {rbin, rptr} <= 0; * P" y& b3 p3 `7 Y) v
else {rbin, rptr} <= {rbinnext, rgraynext};
$ A# H8 n1 W1 W* `end 6 }8 u9 O) U3 k r7 B
4 v6 {5 Q2 [5 G# c: }
( D6 R/ L7 v1 V/ h+ Z0 ^
assign raddr = rbin[ASIZE-1:0];
1 ?1 y; j9 x; J3 A' T9 Q9 Kassign rbinnext = rbin + (rinc & ~rempty);
. b1 G7 P% J! v% ^- iassign rgraynext = (rbinnext>>1) ^ rbinnext;
}6 i8 W+ R( Y! t) E& B( a2 |7 t& h# [$ E$ L/ A
! C- f+ L( r: O7 o: {3 a1 w: Y
assign rempty_val = (rgraynext == rq2_wptr);
& M ^, e/ ~9 Q" I4 m' l+ Palways @(posedge rclk or negedge rrst_n)
& N, X/ G7 M- Nbegin 5 b1 i, P; a/ P
if (!rrst_n) rempty <= 1'b1;
0 h D, Y8 @0 x; s U* Qelse rempty <= rempty_val;
! C& T. P7 h8 r; W0 Fend
" ?: h4 u, a* k" j6 ?; @; W5 |5 X# u4 r6 k$ K4 k3 G& _5 E
2 F7 ]0 _; r" Q; valways @(posedge wclk or negedge wrst_n) // GRAYSTYLE2 pointer
$ a/ G6 a2 G" g6 Xif (!wrst_n) {wbin, wptr} <= 0; ) z: Y2 F' C- p/ k
else {wbin, wptr} <= {wbinnext, wgraynext}; , D1 g( C0 U! s" t
. v0 z7 @- k! B+ L8 b) a! v u" G
assign waddr = wbin[ASIZE-1:0]; " `" N" o+ s5 g; n0 h3 G
assign wbinnext = wbin + (winc & ~wfull);
0 N0 ~0 L7 i2 F2 t4 ^! |assign wgraynext = (wbinnext>>1) ^ wbinnext; ; i* C1 n7 s& p! [) b) ]$ M
assign wfull_val = (wgraynext=={~wq2_rptr[ASIZE:ASIZE-1], wq2_rptr[ASIZE-2:0]}); //:ASIZE-1]5 ~9 F4 u$ W3 }
always @(posedge wclk or negedge wrst_n) : N1 d1 Z. m" P3 @
if (!wrst_n) wfull <= 1'b0; ' q$ f! k( h: B$ p( }0 w
else wfull <= wfull_val; ; W& W/ i0 l5 `3 Q K9 a
endmodule* u U( O/ ]5 o3 w( n
: d2 F4 D, U* }6 J[ 本帖最後由 xuduo6845 於 2009-9-4 11:25 AM 編輯 ] |
|