版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
////////////////////////////////////////////////////////////////////
* A4 ?2 c ?! P _% O// FileName: "Fifo.v"
9 y1 R+ g! w ?$ k2 X- V O) ^) ?// Author : Venkata Ramana Kalapatapu
. Q' l4 U$ l0 i& ?( j// Company : Sand Microelectronics Inc.: z, y' z# p$ c; u, P1 d0 Y( v' x
// (now a part of Synopsys, Inc.),' U( c+ ]1 L! b0 L+ p: n+ {( f( }
// Profile : Sand develops Simulation Models, Synthesizable Cores and
8 G' N1 _9 G8 G/ v7 Y// Performance Analysis Tools for Processors, buses and
) B+ h6 @) p' g* A// memory products. Sand's products include models for
) T( S' @1 R; [" K5 a# m// industry-standard components and custom-developed models
* _3 b% k$ u* G9 `2 S1 M; k' X// for specific simulation environments.! N! O8 W4 }) b" F9 m! b* d, c
//
+ T) Q( ~, i- ]: r4 f/ A////////////////////////////////////////////////////////////////////
/ p4 K4 | Q9 \6 P* w( X- m% U( d2 }! q) s% c3 A
`define FWIDTH 32 // Width of the FIFO.- G" V8 a! K, B
`define FDEPTH 4 // Depth of the FIFO.7 y, h% e* G+ f/ ? ^
`define FCWIDTH 2 // Counter Width of the FIFO 2 to power
. K1 ~% X+ s& N+ }. V* d7 ^' v // FCWIDTH = FDEPTH.
8 D7 C. W2 c, ^) q: I1 r Smodule fifo( Clk,
: B5 l" x/ {" q RstN,
8 h0 u: Q5 q- n& P! Q Data_In,
# Z N2 _0 O: t; h; y) n2 D FClrN,! t, ]. u, x, A) C2 Y; ~" O* e9 }
FInN,, _: O) n+ _% Y9 s9 i& c8 N
FOutN,
8 s; a( F$ a u( X2 S F_Data,! s/ f7 A4 J0 e$ m6 E
F_FullN,
4 o% j! z6 }' k* a) D F_LastN,
3 N0 [) V; f" q! g. ?9 ~( F F_SLastN,
; W4 W' ]/ g0 N4 V3 q* A# m F_FirstN,
; u4 R7 q& Y, ~' G F_EmptyN4 ?; [3 G5 s E7 \4 W+ F
);
( C9 S0 W V( |6 p/ j$ I7 O9 }' D5 J, }7 R
input Clk; // CLK signal.$ {; Q* {& t$ Y. g6 k
input RstN; // Low Asserted Reset signal.
. M% I4 C: h/ ~3 ~input [(`FWIDTH-1):0] Data_In; // Data into FIFO.
. v4 R! E7 k; v2 D, |9 J" binput FInN; // Write into FIFO Signal.
9 \0 @, S! ]2 p9 B1 _6 Dinput FClrN; // Clear signal to FIFO.
- _, H4 o' ?- ?6 @' Finput FOutN; // Read from FIFO signal. x6 l3 K2 C# K S( @3 Q, `
output [(`FWIDTH-1):0] F_Data; // FIFO data out.
* A% G& k4 @3 ]# o" toutput F_FullN; // FIFO full indicating signal.
* z) I7 {6 I$ \& a3 r& l* Xoutput F_EmptyN; // FIFO empty indicating signal.
|# ?4 i0 I1 x: Goutput F_LastN; // FIFO Last but one signal.
5 S3 E Q* X0 Y: |- r9 Poutput F_SLastN; // FIFO SLast but one signal.
, }) |9 U8 ~2 P S4 G, Z) @" Toutput F_FirstN; // Signal indicating only one. n% S; G( X9 j
// word in FIFO.! `8 `& d4 m0 j, U
0 o" b2 T) I2 x) ]9 b x) ireg F_FullN;
C" I( r5 x& e6 N5 Q. ureg F_EmptyN;$ C5 F A7 j+ a/ P) Y
reg F_LastN;# }. ]% t7 r- e" C$ A! Q: Y
reg F_SLastN;
1 ?3 a/ Y O- Q, i- K. Oreg F_FirstN;
, V* s( D. C- b( j; S W' i/ Freg [`FCWIDTH:0] fcounter; //counter indicates num of data in FIFO1 s; ~% x$ p! {
reg [(`FCWIDTH-1):0] rd_ptr; // Current read pointer.
: h( @6 x& B8 t. c4 Breg [(`FCWIDTH-1):0] wr_ptr; // Current write pointer.- G% I- q/ t9 r) C
wire [(`FWIDTH-1):0] FIFODataOut; // Data out from FIFO MemBlk
9 h7 I, Q C. C4 z$ Gwire [(`FWIDTH-1):0] FIFODataIn; // Data into FIFO MemBlk
1 l3 @2 J( q! E* cwire ReadN = FOutN;5 ?' `# N% j$ y. l4 e) X( B
wire WriteN = FInN;" m, Y# j7 I: p4 @
assign F_Data = FIFODataOut;: ?6 B" c# }. I7 N/ x0 r
assign FIFODataIn = Data_In;
; K O. k! d' C) z: P8 [9 S2 W3 D) X' r0 x1 g& c
FIFO_MEM_BLK memblk(.clk(Clk),8 Y8 }; L+ Q8 j0 H; j* U) Z1 A
.writeN(WriteN),
& F: r; Y: D! y* a( u7 h .rd_addr(rd_ptr),- R) [8 O) O+ a
.wr_addr(wr_ptr),2 O: W. f' @7 h: }/ B
.data_in(FIFODataIn),
1 f& B4 d6 I/ |" k) I. E9 ? .data_out(FIFODataOut)- F: [8 C, I& i4 ~& l
);
, ?' B0 u, e2 O [# s6 }; i, W // Control circuitry for FIFO. If reset or clr signal is asserted,
. G6 s1 b5 w6 I. }2 m% K // all the counters are set to 0. If write only the write counter
" G& X: K7 G% }% a4 J( ? // is incremented else if read only read counter is incremented) w( n/ N" d6 L. p1 r* w7 }
// else if both, read and write counters are incremented.9 a. F1 n: G; A7 O2 Z( ^
// fcounter indicates the num of items in the FIFO. Write only
( q. A6 r: B! J% R: X( ]& q7 U+ B( ]7 p // increments the fcounter, read only decrements the counter, and4 B1 e- G( Z7 C3 u. [( a
// read && write doesn't change the counter value.
0 y0 u8 ^' u5 f) q1 s) O. f/ ^ always @(posedge Clk or negedge RstN)
' \* ]( }$ R. R6 z& e- {5 ~ begin6 u* I( g& n6 E% b" {+ M8 k0 j0 h+ e: b
if(!RstN) begin
/ g& t0 b' u( @8 t1 w fcounter <= 0;
* G! ^* [& D! N/ e; F rd_ptr <= 0; H+ N/ a( Z$ ?) c% N& i, k
wr_ptr <= 0;
! ~# ?1 p; `; P1 v0 d% G" u' D end
9 V- J* p* U; z0 _) S else begin1 x. t# _* t( v- [" ?
if(!FClrN ) begin
" H7 t: {/ H( q3 q8 q/ j! s0 s fcounter <= 0;1 `' }8 Q& i1 n$ B5 @" Y
rd_ptr <= 0;6 z; o4 p4 ]) C( h6 I
wr_ptr <= 0;
* j1 A- g2 n' X* @* }( k H end
. y: S1 ]* _; v7 @ else begin4 k/ Z- D* l2 x$ x$ r( ?4 T; K
if(!WriteN && F_FullN)' b& @2 I# q9 e- M+ p; y
wr_ptr <= wr_ptr + 1;9 h! ^1 _6 _$ N0 }, c( ]
if(!ReadN && F_EmptyN)% Y# {5 H" K# @6 C/ M3 ^( C
rd_ptr <= rd_ptr + 1;
+ D0 K/ w9 Y$ G! w) S if(!WriteN && ReadN && F_FullN)9 a( k8 }( k1 c
fcounter <= fcounter + 1;/ K5 a4 j. E6 {* n
else if(WriteN && !ReadN && F_EmptyN)
$ }9 X$ P- k% A6 M- Z: q fcounter <= fcounter - 1;; n# j0 |+ q" w
end* {# o3 x3 L. d& k7 f) D& x
end" E* E* k/ I* t( b- ~7 R+ ?* J3 E9 p
end
7 d' F. A; b' r // All the FIFO status signals depends on the value of fcounter.9 p3 w, A; e3 ?# A( x; p1 q5 Q
// If the fcounter is equal to fdepth, indicates FIFO is full.
9 l7 k5 b) v+ J/ } // If the fcounter is equal to zero, indicates the FIFO is empty.3 T9 O2 H8 ]) v* x+ B6 k9 l
// F_EmptyN signal indicates FIFO Empty Status. By default it is
: Q( O. |7 s" K // asserted, indicating the FIFO is empty. After the First Data is" i8 {2 _! [+ A; Z' p
// put into the FIFO the signal is deasserted.
( |# p' [. p& K$ u always @(posedge Clk or negedge RstN)8 l( t3 d8 _4 @8 y, K# a+ X- ?
begin5 W. \2 O# R M1 r' n; ?' L
if(!RstN)8 \$ V+ N% ~& k# ]+ \% z& \) u: r: ?0 L
F_EmptyN <= 1'b0;7 H, N! f# l( M$ K4 _; i
else begin! t: T" y% K. m
if(FClrN==1'b1) begin
4 v. m4 }* R7 T$ r if(F_EmptyN==1'b0 && WriteN==1'b0)
" {* b, `+ [& T9 Z& U) V F_EmptyN <= 1'b1;8 A0 C2 K- ^- u9 A, M F ~9 c; ^
else if(F_FirstN==1'b0 && ReadN==1'b0 && WriteN==1'b1)
, b' J& E& s* }. ` F_EmptyN <= 1'b0;8 E1 H% I8 S. h( o2 H
end/ `& A a$ o# P( t; }
else4 }( | c2 v7 P7 {, k
F_EmptyN <= 1'b0;" p# d! G+ T5 _& M1 `% s% r
end
% K' g1 H. _5 A/ W5 {5 }; ^ end
$ w' `0 b* L9 U) K // F_FirstN signal indicates that there is only one datum sitting9 h6 q4 g, j0 Z& t2 j
// in the FIFO. When the FIFO is empty and a write to FIFO occurs,
, x2 x+ q6 A" d0 g2 j4 p // this signal gets asserted.
# r" i) x6 k6 f always @(posedge Clk or negedge RstN)
6 { _9 P4 {' r& ~1 w- a5 u! W begin
) O) L! Z: F4 U: F6 E if(!RstN)
j- x' Y, r3 }! j6 @7 }% W F_FirstN <= 1'b1;
6 Q0 n" k. M' j# L: d; j else begin
7 N; ^6 p( N K% m if(FClrN==1'b1) begin* y" v5 e: m& [2 b. [
if((F_EmptyN==1'b0 && WriteN==1'b0) ||
. `2 B- L* u/ N# v# v/ ~ (fcounter==2 && ReadN==1'b0 && WriteN==1'b1))/ k4 e4 c/ U2 J* V* Z8 A, J9 \
F_FirstN <= 1'b0;
; n$ i; W: o6 T: N0 b else if (F_FirstN==1'b0 && (WriteN ^ ReadN))* E% s& T( ^6 }% R- _$ }
F_FirstN <= 1'b1;
" t3 }; ]# d" {: ~1 ]( C* c end
$ p+ m. |6 l- j; ~9 \ else begin* ^4 k! C, t. m D$ B. J9 @0 T" m
F_FirstN <= 1'b1;! V/ f; q* k* H% T9 N3 q
end
# W- \* q: G! H( P( ^$ }: U" \2 m end
: r9 S5 U% U" F3 G' t$ x end
3 R9 d1 }2 z. w! y" l0 o6 m) Q4 ^
// F_SLastN indicates that there is space for only two data words
3 O0 S5 [. M7 d W //in the FIFO.
9 ^# M- G0 q9 p7 ?3 p; k/ f always @(posedge Clk or negedge RstN)
- {1 V1 m( N D1 x3 y0 q begin
# E# |$ Y$ b. ]5 b, Y* { if(!RstN)
: W1 X3 p# }1 i F_SLastN <= 1'b1;# w8 r3 J) s, `$ T( F l
else begin
1 }* A3 K( V: T3 [* ?) Z7 a; _ if(FClrN==1'b1) begin
! Z; M k" L- q9 d9 M# ~ if( (F_LastN==1'b0 && ReadN==1'b0 && WriteN==1'b1) ||* g1 P9 r# k, O8 v' f% [
(fcounter == (`FDEPTH-3) && WriteN==1'b0 && ReadN==1'b1))
2 c! }% E# O/ {, q0 c F_SLastN <= 1'b0;
0 a+ E6 A- h' n9 x8 o/ m
: v) }9 s. b% ]& X0 _ else if(F_SLastN==1'b0 && (ReadN ^ WriteN) )
$ s) O7 A( U% E" L& q% y9 Q6 s F_SLastN <= 1'b1;, ~4 F" I% \9 j% M8 r
end+ C: N7 |4 G# P! u1 v4 l3 F4 i
else% d4 k9 U" F$ Q: T1 E
F_SLastN <= 1'b1;
1 t+ y o v3 I* B5 V end
. Q6 @+ v1 h/ K; r end( ^. u1 k; f9 }' l0 U, Y5 x
// F_LastN indicates that there is one space for only one data* |4 X- M9 X1 q6 e ~
// word in the FIFO.
% b% H, c$ b/ d. z, l always @(posedge Clk or negedge RstN)2 H2 w$ f4 w7 @$ r
begin
% q/ V% h9 g; [& y4 H$ ]' [ if(!RstN)7 p" j7 ^) e4 w2 a$ v! [0 G
F_LastN <= 1'b1;7 l {3 O5 [6 [, V# m
else begin0 |' b% E* }/ Y$ n+ [. e% O
if(FClrN==1'b1) begin
* I5 N2 B/ u0 l3 B if ((F_FullN==1'b0 && ReadN==1'b0) ||/ w; b6 h; [/ O5 v* M* V7 }* V% l& t
(fcounter == (`FDEPTH-2) && WriteN==1'b0 && ReadN==1'b1))1 w5 L: u2 ]- c3 ?, f
F_LastN <= 1'b0;
& i* a7 E* I# o( C% _3 @ else if(F_LastN==1'b0 && (ReadN ^ WriteN) )( ?5 N, N" n' @( O! P
F_LastN <= 1'b1;5 u! W8 H8 k0 T
end
1 s" D4 H+ U7 n5 n else& {* w1 u' T! K4 k/ v
F_LastN <= 1'b1;8 ^9 g; y+ K2 W: k
end* r2 n/ J" ~! e/ l8 |
end5 Y5 n* r2 D: M: J; z& T4 p
( @' x7 i, Q: N( f
// F_FullN indicates that the FIFO is full.
" z& R2 T6 A! _0 c always @(posedge Clk or negedge RstN)
! ^0 k j& m, k begin
2 m) K8 _0 R8 M. } if(!RstN)
, X! i5 h' }: G K9 F F_FullN <= 1'b1;9 @% B3 l3 _3 P: U K5 s
else begin
; z" i7 h' [, v1 X if(FClrN==1'b1) begin, B$ C$ ^; d& p* j( W
if (F_LastN==1'b0 && WriteN==1'b0 && ReadN==1'b1) c9 N* J4 ]7 w" I( V
F_FullN <= 1'b0;
0 p. M" P5 I! {" o1 u else if(F_FullN==1'b0 && ReadN==1'b0)- _: q6 X0 w0 v" c
F_FullN <= 1'b1;
& f; J% c+ U( }& h* K end
) _" j# \: u# U; m/ D9 m else
7 u. Q1 ^6 u5 U3 R$ T; i F_FullN <= 1'b1;5 [$ c; M- _, s2 k
end9 w$ L) [* K; x& ^2 Q: W6 A8 v
end3 O/ I3 ~+ d: U
endmodule
1 I g/ N/ Q4 l8 z, A+ K& T$ O5 a0 X2 X/ @7 S) l% b9 B
( V* r# q5 x! q7 U n
///////////////////////////////////////////////////////////////////
& ]: |% \4 O9 m//7 I0 v9 h3 q% |: ?9 `# [
//
5 d$ R% \: U4 F6 R* A// Configurable memory block for fifo. The width of the mem" W9 ~ M( ^& x& e! o
// block is configured via FWIDTH. All the data into fifo is done
+ C' L6 f- A% V2 z/ ]# C# b// synchronous to block.( r0 m+ K3 N5 W2 m& ]8 v' {- s- N
//' `2 P! E- ?+ t- l6 W
// Author : Venkata Ramana Kalapatapu
5 O$ _2 R0 @9 q9 A: N/ W( g# r* Z//' Y* U, J3 Z; z6 e; s! s/ z
///////////////////////////////////////////////////////////////////
( U) a! I/ v% }+ P$ F6 X, x+ W% Hmodule FIFO_MEM_BLK( clk,
5 e# G' o: Z1 `' H" L, K3 c$ J8 T writeN,
! c8 x8 `7 W) n4 ^' Q8 a$ @8 R wr_addr,
; }$ _$ O7 B# H! u/ z# |( ] rd_addr,# D5 Q9 c& O% D1 m
data_in,
( ]& Y. }0 O, P. p6 h& F; O data_out
2 L% ~+ L& l5 X; V$ y3 { );' r0 b6 d6 D; a5 y9 ^9 ]1 F
5 k) h4 b- }+ J
input clk; // input clk.; D0 h: y6 g9 ^6 [+ _
input writeN; // Write Signal to put data into fifo.1 A6 }; w3 Q" ]
input [(`FCWIDTH-1):0] wr_addr; // Write Address.. g v2 j w# y
input [(`FCWIDTH-1):0] rd_addr; // Read Address.
# ^; S: M, `3 [# Binput [(`FWIDTH-1):0] data_in; // DataIn in to Memory Block
4 T; Q l' K4 I1 `# f7 l" a& noutput [(`FWIDTH-1):0] data_out; // Data Out from the Memory
) e* z6 I. v9 y& X2 ?: c% G // Block(FIFO)" \* I' a; B% v) ]2 m% I3 e8 V
wire [(`FWIDTH-1):0] data_out;
' t9 d- V3 b% |, T. U* m! b# k7 Creg [(`FWIDTH-1):0] FIFO[0:(`FDEPTH-1)];% J% p% ]* c M- n. Y3 ? e' w
assign data_out = FIFO[rd_addr];$ m6 p1 `4 I6 i% s- t X' j7 ~
always @(posedge clk)
/ ]) e; o) F5 O( @* z& Abegin
_. q, T. Y/ u( K! d9 R if(writeN==1'b0): j% \: R+ Q& o
FIFO[wr_addr] <= data_in;; P1 h; h5 t6 j+ D" L" m z
end
& B' A% ]6 [) P/ A+ l5 [ J& N% Jendmodule |
|