|
请问其中ASIZE为什么是4?我觉得应该是3.我在一本书上看到也是4.
6 J# ]0 H! O8 Mmodule fifo1(rdata, wfull, rempty, wdata, winc, wclk, wrst_n,rinc, rclk, rrst_n); " t$ H& C% c% p: X
parameter DSIZE = 8; parameter ASIZE = 4; - Z' I, l+ u; l( f% v7 n( x
output [DSIZE-1:0] rdata; ! t' ~" s( `2 [* }7 k
output wfull;
" m" T" ~8 ~# ^& Z' b! b2 @/ Aoutput rempty;
. h) Y; k0 L5 A; Z" X2 ]9 Xinput [DSIZE-1:0] wdata;
. P- a2 m9 W& l" i+ minput winc, wclk, wrst_n; 4 v5 {% h, [# z6 B& v4 @
input rinc, rclk, rrst_n;
7 Q& }* }- |- r6 m( F, o5 l1 Ureg wfull,rempty;
- |2 r6 t# [- v( u7 M1 \reg [ASIZE:0] wptr, rptr, wq2_rptr, rq2_wptr, wq1_rptr,rq1_wptr; ; e A0 R3 ^$ r+ P0 N% N/ @: L
reg [ASIZE:0] rbin, wbin;
0 a. s: ?8 G. U! Q. Z+ |5 M5 {4 jreg [DSIZE-1:0] mem[0: (1<<ASIZE)-1]; 7 A. b4 Y! c8 Z7 [9 G/ O
wire [ASIZE-1:0] waddr, raddr;
0 q) U6 G& _. Xwire [ASIZE:0] rgraynext, rbinnext,wgraynext,wbinnext; ' I. W3 c0 a" p$ _9 n
wire rempty_val,wfull_val;
2 u& m7 F4 `# W9 e5 e) |
* ^9 T5 Z; ^7 w# }$ s* O9 ~ vassign rdata=mem[raddr]; . O, Z! j, W% s* k2 r+ g
always@(posedge wclk) - o$ _, c. ?' y" ~" w
if (winc && !wfull) mem[waddr] <= wdata;
9 z2 b8 P* u" N0 l: w
' y; u: ~) Q$ p+ c) M# w. Qalways @(posedge wclk or negedge wrst_n)
' D) e8 r7 o0 m) y3 \# `& |if (!wrst_n) {wq2_rptr,wq1_rptr} <= 0; + G0 {7 M1 W+ @9 U8 J& \
else {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};
9 @. N$ T8 S' D) b# _& g" j( _9 G9 _# u0 D
always @(posedge rclk or negedge rrst_n)
, ~$ c( _" c7 ~ [' N3 i- Sif (!rrst_n) {rq2_wptr,rq1_wptr} <= 0;
1 v0 H/ [1 u, p; aelse {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr}; 8 Q5 ?( ~# z- b2 ^# ~. z" s
% P3 Q) g% F) L' I- a9 H G
5 p6 e* s. x- F# F' n8 ?/ ~+ malways @(posedge rclk or negedge rrst_n) // GRAYSTYLE2 pointer " D v) g9 y, j7 i
begin . @. U: e' i0 f, Q; ~
if (!rrst_n) {rbin, rptr} <= 0; p$ |1 X9 j2 |9 ?6 P
else {rbin, rptr} <= {rbinnext, rgraynext};
. ]- k' I0 |8 p: p- e6 a9 ]3 Qend
& p! H* }+ Z+ i. i/ R h( U& x# J* ?# e( P3 W/ h& o$ P# |; s4 J( b8 W
0 y2 \1 s) k6 passign raddr = rbin[ASIZE-1:0];
" l( L6 y( A# D8 B( Dassign rbinnext = rbin + (rinc & ~rempty);
* s0 D+ n8 V& w3 \9 K$ c. bassign rgraynext = (rbinnext>>1) ^ rbinnext;
) _8 [6 q6 B& d6 d0 N" L7 O+ U/ ?5 o# ^. W3 R( V2 G
# d$ z$ \% _6 i; {( r9 Kassign rempty_val = (rgraynext == rq2_wptr);
, A- j/ A% G0 s; F& }. S' [always @(posedge rclk or negedge rrst_n)
+ q A6 D7 S6 Gbegin
! J8 o/ U9 W# E/ O, [. Vif (!rrst_n) rempty <= 1'b1;
{) n! D* K9 c# F+ ielse rempty <= rempty_val; & i$ H8 g( h( b; p9 s; P. y4 y4 N
end 3 o/ _1 o4 z- `+ Q, _6 w9 P
( H: Y6 E0 R2 p. d# D; v! v
( q; e. v" C* l1 t, E' B/ p; D
always @(posedge wclk or negedge wrst_n) // GRAYSTYLE2 pointer
* O$ |) C3 F; s' C+ A7 h1 Mif (!wrst_n) {wbin, wptr} <= 0;
* `) K4 d4 ^' {" p: B telse {wbin, wptr} <= {wbinnext, wgraynext};
8 x3 F5 {8 {( X+ o9 {3 r9 F, R5 m: ?# L. y2 F
3 ]& Z r4 u7 B4 Yassign waddr = wbin[ASIZE-1:0];
& J' ], V& X) i6 C& F( Gassign wbinnext = wbin + (winc & ~wfull);
+ |4 W- E0 Q) j/ G" l+ J6 Jassign wgraynext = (wbinnext>>1) ^ wbinnext; 3 C$ I9 ]: x7 j- i& r+ J) F
assign wfull_val = (wgraynext=={~wq2_rptr[ASIZE:ASIZE-1], wq2_rptr[ASIZE-2:0]}); //:ASIZE-1]
. B t( V. [" p! q- }+ g6 R9 calways @(posedge wclk or negedge wrst_n)
: H% X8 p. D: {& Gif (!wrst_n) wfull <= 1'b0; 9 |0 n1 F5 u! Z$ F( b6 G
else wfull <= wfull_val; 1 c7 c; v4 v% D. b/ }
endmodule1 R* Y; I! o8 u0 g7 b% _+ f
2 _# |3 j& |/ y, h+ [[ 本帖最後由 xuduo6845 於 2009-9-4 11:25 AM 編輯 ] |
|