版主
  
主题
帖子
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
////////////////////////////////////////////////////////////////////
! M$ I' a2 M t3 i5 U6 A8 W// FileName: "Fifo.v" P: k f, [% S% r! H, x. m+ W
// Author : Venkata Ramana Kalapatapu
* R& D+ F$ v9 W/ `% q% |) h// Company : Sand Microelectronics Inc.
0 c( V- Y( t/ y6 e// (now a part of Synopsys, Inc.),$ W4 C* L' ]% D
// Profile : Sand develops Simulation Models, Synthesizable Cores and* u1 ]2 t2 U) n
// Performance Analysis Tools for Processors, buses and
! f8 \! C1 }* P* u7 X: r" W// memory products. Sand's products include models for+ {' X; K2 A) Z; x1 i: V7 y, p
// industry-standard components and custom-developed models, R# F) o5 Q7 h
// for specific simulation environments.
0 @# I. v4 |# J* b7 q//
$ F7 q9 M0 _# ]! B////////////////////////////////////////////////////////////////////
1 J! G% a( ~% m- W
% C( [% i& @1 Y Q+ [$ _& n7 y`define FWIDTH 32 // Width of the FIFO.
: D$ i. I( O! @ m4 F1 K, \ ``define FDEPTH 4 // Depth of the FIFO.5 K+ A9 O! ^7 h' Y: X
`define FCWIDTH 2 // Counter Width of the FIFO 2 to power
" l- q, b* ]0 i" D% D/ p1 i0 s // FCWIDTH = FDEPTH.4 z1 ~& P+ I6 @3 d* s* |
module fifo( Clk,# \& P$ a+ t* g; t. {
RstN,
6 H' d0 I8 J8 B% y: s8 _ Data_In,
3 l1 Y2 t2 j/ l6 f. ^: X FClrN,2 j3 t; M4 ?' X( w- X. w8 q
FInN,
( z1 P$ }0 Z4 o: y5 ^ FOutN,. B. _, L0 m9 I1 h
F_Data,
1 Q) d9 A+ |5 {0 e) L: G! r F_FullN,
" s& e3 R1 l8 n, I2 M F_LastN,$ W1 t1 b+ F) G
F_SLastN,
) B& t/ t! l% _. V7 Y- A! m F_FirstN,! d% z( `4 Z# g U5 r2 [9 [
F_EmptyN
, |4 ~2 x/ N6 g) [ );( n4 O7 B0 Q: w! s
$ }$ }9 O! T+ g2 A; z0 C- F
input Clk; // CLK signal.& K8 h$ ]" K8 A8 L
input RstN; // Low Asserted Reset signal.5 X( x( ~3 V6 q5 ]4 ]& P7 I/ ]5 S
input [(`FWIDTH-1):0] Data_In; // Data into FIFO.
! R4 K Y5 I4 y( Ginput FInN; // Write into FIFO Signal.
6 ~+ J1 b) X' J6 U+ [7 U2 r; Tinput FClrN; // Clear signal to FIFO.! j& f! {. r V' i/ g2 a& p% d2 S
input FOutN; // Read from FIFO signal.
9 E2 k( _/ H8 T$ p4 I6 |output [(`FWIDTH-1):0] F_Data; // FIFO data out.
8 C1 a0 W2 D; R( t' z7 F; Xoutput F_FullN; // FIFO full indicating signal.
- R5 z, X3 W8 o1 `* z; V7 s1 P7 aoutput F_EmptyN; // FIFO empty indicating signal.6 G2 K1 ?* h2 H) o
output F_LastN; // FIFO Last but one signal.
% s* ~. K% F* H9 \% m4 F* loutput F_SLastN; // FIFO SLast but one signal.8 R- Q. M: n5 i) T; O
output F_FirstN; // Signal indicating only one( q- [4 Z4 k% V& `1 s5 ]
// word in FIFO.
( T) D/ n/ X+ b8 c( G* q3 s) u. U! Q$ E- H; |+ {! [
reg F_FullN;+ n2 k/ m" ? v4 d- q0 p
reg F_EmptyN; f; E4 p1 L3 r: V( D" L Z
reg F_LastN;
' [* e7 T* {, V, preg F_SLastN;" s& c9 `: x) p4 C; c
reg F_FirstN;
6 U, Q9 {2 @' ~' d2 ^reg [`FCWIDTH:0] fcounter; //counter indicates num of data in FIFO
9 U: W+ J; _2 `& ^" r5 Treg [(`FCWIDTH-1):0] rd_ptr; // Current read pointer.
, I1 D' S0 c4 T& V2 g% q L& p9 [6 breg [(`FCWIDTH-1):0] wr_ptr; // Current write pointer.
3 b! ~' |6 R7 Q7 ~wire [(`FWIDTH-1):0] FIFODataOut; // Data out from FIFO MemBlk5 W s7 [5 F. o# K5 u
wire [(`FWIDTH-1):0] FIFODataIn; // Data into FIFO MemBlk8 I5 }) \" w3 ?$ T; J! F
wire ReadN = FOutN;4 z) a9 u7 B, n# w: a" A: I# V N
wire WriteN = FInN;
6 e2 a# x8 a: N5 p h1 c6 Bassign F_Data = FIFODataOut;6 P/ [ ?3 U! w$ b5 R% b
assign FIFODataIn = Data_In;( d+ `4 v/ b* k _0 D% ]
0 |. c( y8 ?/ s* w7 |
FIFO_MEM_BLK memblk(.clk(Clk),
, c0 Y' g7 D/ E# E" K8 E .writeN(WriteN),
4 O8 U- I$ `' C: v" {" a .rd_addr(rd_ptr),
. ~3 s1 r. z c$ P .wr_addr(wr_ptr),
* V, F( j0 y/ T/ o" A, X6 b .data_in(FIFODataIn),% ]2 R8 L9 W! g3 x( s, ^
.data_out(FIFODataOut)
# y; [: e- |3 T* V1 D+ x );
Z' X" y6 V9 K8 t Q // Control circuitry for FIFO. If reset or clr signal is asserted,1 R3 R, `# K9 y) a9 T& J6 H( m( }
// all the counters are set to 0. If write only the write counter
% m* b# D5 K; N; \ // is incremented else if read only read counter is incremented
( [! M2 X1 S1 k8 L0 M9 O7 C4 v // else if both, read and write counters are incremented.
6 |/ e G8 h1 u8 u, i8 c6 @ // fcounter indicates the num of items in the FIFO. Write only
: C; D4 G) v9 P0 D% o // increments the fcounter, read only decrements the counter, and7 K0 _, F5 d6 z6 d; V3 F
// read && write doesn't change the counter value.
# a# I1 Z3 P( {, W% e4 ] always @(posedge Clk or negedge RstN)5 _3 a0 Q8 l4 M8 F: A( V
begin' z1 Y/ X! A6 \4 p, o
if(!RstN) begin
5 d+ V* s5 M: ? fcounter <= 0;
& m' Y# T) F8 D8 ?- h rd_ptr <= 0;! S0 G# s2 x) g2 ^
wr_ptr <= 0;2 Q2 D& c- x; v4 @
end
. y, Y, c0 o/ f else begin
; u) c2 b1 F( [8 k* @: r) e if(!FClrN ) begin# ~* {8 o s% J9 L( W
fcounter <= 0;
4 j% A, I9 H8 h7 r. p+ k3 B; ? rd_ptr <= 0;( A0 w5 n. n# a/ `& N) }" o
wr_ptr <= 0;. j- P1 y4 O4 z }1 o
end
( t$ B, p: v( Y9 z2 U else begin
' J1 V, g$ @" \# W! A7 z, r if(!WriteN && F_FullN)
7 @$ \2 ~& B* }7 C0 n, B wr_ptr <= wr_ptr + 1;
8 K4 E# p0 y: [* n$ d! Y if(!ReadN && F_EmptyN)
3 p( U: v4 c2 h2 J* k- T! o rd_ptr <= rd_ptr + 1;/ r- ~3 S' V/ Z: }7 [4 _; G+ D5 E
if(!WriteN && ReadN && F_FullN)
1 ]8 r1 t) {# P8 {2 [' l7 y fcounter <= fcounter + 1;5 z. Q. f0 u# n: ~' M
else if(WriteN && !ReadN && F_EmptyN)) D6 G- ~1 ]4 c2 U, ^
fcounter <= fcounter - 1;9 F9 x5 T) f( I" O8 |, E( Z0 V
end
) H% I+ C: n% L: ` end" p5 |" ], Z4 o0 ^% m9 t
end; a1 o; y3 J) R; E
// All the FIFO status signals depends on the value of fcounter.
0 i) D* T7 z/ e; a$ z; Q; ^ // If the fcounter is equal to fdepth, indicates FIFO is full.
6 l! m: Z- Y/ Q // If the fcounter is equal to zero, indicates the FIFO is empty.! }( j4 @9 I9 S% H: \; i* Z' I
// F_EmptyN signal indicates FIFO Empty Status. By default it is1 r+ s% ]: ?9 \$ @" O- F* N0 f0 b
// asserted, indicating the FIFO is empty. After the First Data is
+ S/ x8 \& _/ B r! w // put into the FIFO the signal is deasserted.
; g- j* S, R; C3 V0 z8 ? always @(posedge Clk or negedge RstN)
Y9 Z1 U# ^: x# [ begin6 Z7 j6 ]" K) @" S* H) Q
if(!RstN)
/ c( P4 m$ b( U; i F_EmptyN <= 1'b0;0 C! m/ D6 C5 J3 ] X
else begin$ O) b0 W6 t% Q1 ]) A
if(FClrN==1'b1) begin
3 s$ H- J6 P& e) ]7 z if(F_EmptyN==1'b0 && WriteN==1'b0)
% h) n" g1 M$ R& ]6 m3 C: R F_EmptyN <= 1'b1;9 j- @! S: N. D" k [
else if(F_FirstN==1'b0 && ReadN==1'b0 && WriteN==1'b1)/ W# t- l/ l. e, |, u
F_EmptyN <= 1'b0;
+ m; g' I3 v* m! C end! l/ i7 n! f8 p& j$ {% `# I
else. I7 E, f5 M1 {! u2 s* i
F_EmptyN <= 1'b0;/ ?) N) q9 j! V4 o& V$ t
end) p4 \1 U. m0 H$ Q# ?
end9 J' E5 \1 M) x+ K# D7 H
// F_FirstN signal indicates that there is only one datum sitting
( u* j+ u g' o9 Z# p6 |- u // in the FIFO. When the FIFO is empty and a write to FIFO occurs,
4 i/ ~) f- I1 ?0 M // this signal gets asserted.
2 S3 n, ^$ M; l+ T always @(posedge Clk or negedge RstN)
' U* [- R* q0 d/ z4 g8 f1 u begin1 u! l3 [8 O$ r1 S `! e
if(!RstN)$ P' a3 L* l9 Z9 w% q
F_FirstN <= 1'b1;3 P% n; ^' A$ a6 w+ N% d
else begin
7 g* |/ j# h& M+ k- |8 y if(FClrN==1'b1) begin+ g7 l# c7 l9 n% y
if((F_EmptyN==1'b0 && WriteN==1'b0) ||
T6 U4 N# e0 Z2 S; z (fcounter==2 && ReadN==1'b0 && WriteN==1'b1))7 k: e- ^* \ Z+ \& I/ p$ Y
F_FirstN <= 1'b0;
i! O* v5 c3 ?6 D0 K4 D else if (F_FirstN==1'b0 && (WriteN ^ ReadN))& x/ E( A/ @6 a( o; I. P' ^( j
F_FirstN <= 1'b1;
. \+ K6 u. v' t/ s b9 Z+ h1 C7 K end
: l( T& F; @; S7 ?# n% ? else begin
& B- t( ^7 E. j1 ]9 k) ~3 u F_FirstN <= 1'b1;; v# k4 B8 S2 J' L2 E$ d
end
3 F2 i. I( N" [! x- F end
1 ?) f+ s8 `0 D& x0 X end
3 g/ t- G! d) y4 c) C! T6 l) x4 U8 ?2 f! q& s) z. E8 R
// F_SLastN indicates that there is space for only two data words* D N, J3 @. q4 ]' }
//in the FIFO. Q( ]9 ^ d5 I9 A
always @(posedge Clk or negedge RstN)$ @* r' l2 b& h5 `) F8 C( M
begin! w6 l) M+ t$ M1 e' T6 x, }
if(!RstN)
1 v/ e. f( p" q F_SLastN <= 1'b1;
* V8 W; m4 D2 `, t' O8 j- O! H else begin" ~" X ^3 a9 S2 I7 F- A
if(FClrN==1'b1) begin
! Z F( `) h6 ~% A8 _+ Z if( (F_LastN==1'b0 && ReadN==1'b0 && WriteN==1'b1) ||
9 C6 e; \6 @# ]. \* m (fcounter == (`FDEPTH-3) && WriteN==1'b0 && ReadN==1'b1))5 G; N5 S5 |& ?7 X k6 I8 @
F_SLastN <= 1'b0;
9 G N+ _0 w4 y
+ {, a% B$ i( S& f# x* K else if(F_SLastN==1'b0 && (ReadN ^ WriteN) )
5 i5 t% T% E3 K/ ]/ P0 R F_SLastN <= 1'b1;- |4 r! `- `% z2 {, x5 p4 G3 X7 D
end
: o) y2 c! Q+ P0 U8 o else3 s( T8 D M/ v" Z
F_SLastN <= 1'b1;
; L( G( E d2 q7 L: N, o end
4 m9 `6 g' O# e! R& \# D" V! ~ end$ F: |4 `! Y5 f+ E6 m: F( x: ?: E
// F_LastN indicates that there is one space for only one data' N! a3 y; S/ R/ Z- n- x
// word in the FIFO.
" j# D2 F" w" V3 X0 { always @(posedge Clk or negedge RstN)
# j, b" U7 Y1 u begin: @( U5 V& @- F5 V
if(!RstN)" f( U) H6 g% t5 w P6 \+ Z' g9 |: J8 a
F_LastN <= 1'b1;
# X8 e6 ~, r% v4 ?4 p( n) c6 O3 Y; K else begin
0 X6 E( U W' R/ c" s if(FClrN==1'b1) begin
- s2 |5 N) r" z/ y; E if ((F_FullN==1'b0 && ReadN==1'b0) ||; l+ x1 h5 F H9 d1 I2 W
(fcounter == (`FDEPTH-2) && WriteN==1'b0 && ReadN==1'b1))8 ^+ [' w+ A2 ^1 v+ Y) i
F_LastN <= 1'b0;" B& s( ^/ X9 B4 s, w* i t) Y1 E
else if(F_LastN==1'b0 && (ReadN ^ WriteN) )6 q3 X+ D% Q! P4 _
F_LastN <= 1'b1;) t0 B6 s5 U" X8 q
end+ ^1 u5 a& m4 k5 m
else4 e8 m/ w. B) q R; j( J0 j
F_LastN <= 1'b1;' ]3 S4 ?$ k$ H6 v. t L
end
0 ~2 H# \. F0 Y2 C& t1 u7 B end% o. S& N% `5 R7 c, O- u9 ~( u
: ]. P2 [5 M6 Z0 k# G/ E // F_FullN indicates that the FIFO is full.: Z. X$ S3 E* D$ ]) R( _: V( P" I
always @(posedge Clk or negedge RstN)4 P" u) e- _% ^# t( r/ X
begin3 v6 V5 G1 {. S
if(!RstN)5 o7 U. z" L; b* ^2 ^7 K5 ?
F_FullN <= 1'b1;
( S! X! ^7 i* s4 g' k else begin3 u6 Y3 N8 i0 N, l% V
if(FClrN==1'b1) begin3 c! S$ C, [8 J% q2 g% a7 ]
if (F_LastN==1'b0 && WriteN==1'b0 && ReadN==1'b1)
# {8 X( g: K! }6 g$ S) D( n6 d# i L F_FullN <= 1'b0;
` a7 a- y7 V# F6 S$ o# d else if(F_FullN==1'b0 && ReadN==1'b0)
" ` }. A! z+ F1 l F_FullN <= 1'b1;' V2 ?. ^3 f" D( ?# {3 a
end
2 L% S3 T% c; M# \* F* Q else, l) y) {% @- ^" q" q6 `
F_FullN <= 1'b1;
" I; h3 u- y6 z# N: U, N7 x- [ end
9 \ p& W" r6 F% d end* S/ _# E: L9 F7 d
endmodule0 r7 E& y3 b+ n( X
9 u* M: B) {, N Y. J+ G3 ^! r! e8 g7 c
///////////////////////////////////////////////////////////////////) X- U: C( I8 }6 \) Z) \; v
//2 H3 W, G4 K3 T4 T; @3 |
//
( l" V+ ?' Y9 [: ~$ u) o) s// Configurable memory block for fifo. The width of the mem
$ O# j H: P, D5 C2 O// block is configured via FWIDTH. All the data into fifo is done/ i5 M' d( w. U6 b- }5 O* R V" o
// synchronous to block.7 f, J! W: B- u) ^# W5 @; e D0 w
//
5 \; Q. T: f* q# s// Author : Venkata Ramana Kalapatapu* J/ s( r3 R& K6 }* \. ?6 l1 ?, t
//
( r% ]8 O( v0 X/ A- G9 @$ R/////////////////////////////////////////////////////////////////// j* [6 t! G) m' l& ]6 v5 H. W( K
module FIFO_MEM_BLK( clk,
e6 u8 @2 f! x- R. s8 C4 ^# n writeN,
, I8 d7 z" |" V4 L wr_addr,
/ T" x. {5 i" h/ T2 o3 @! ~ rd_addr,- A6 A4 t; [* L( s' n+ d! z% r
data_in,
2 }8 R5 ^/ `5 F data_out' c9 x. O6 }! Z' L
);$ Q" |& g3 ?7 f# e
- q5 k0 d5 k0 }* n% r( F6 ]" s
input clk; // input clk.' B5 l0 [+ j0 K$ g" O2 D" Y
input writeN; // Write Signal to put data into fifo.# c: y3 z) A; ^- X
input [(`FCWIDTH-1):0] wr_addr; // Write Address.( M1 T. @; S# T
input [(`FCWIDTH-1):0] rd_addr; // Read Address.! S' }3 Q4 O5 O2 q+ P
input [(`FWIDTH-1):0] data_in; // DataIn in to Memory Block
( @/ c4 {4 ]3 coutput [(`FWIDTH-1):0] data_out; // Data Out from the Memory
/ z+ a# ^/ V/ @- R0 q. X6 B, B // Block(FIFO)
" @( P9 l+ u2 w3 Ywire [(`FWIDTH-1):0] data_out;: z3 |, }. N4 n3 o% a6 ?. X: X
reg [(`FWIDTH-1):0] FIFO[0:(`FDEPTH-1)];
. G2 J8 B- V kassign data_out = FIFO[rd_addr];1 }. U! u: R: k" ?( }
always @(posedge clk)* A( `" D' d1 C! k: k
begin8 r4 H: m9 q5 X1 b4 y2 @
if(writeN==1'b0)$ c. O1 z) U+ T2 h5 p
FIFO[wr_addr] <= data_in;6 j1 k5 C: P9 r6 r9 }
end! q5 L. r% k) n
endmodule |
|