版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
////////////////////////////////////////////////////////////////////
9 o: m- x: N4 \' j// FileName: "Fifo.v"
8 I8 }* n* n, h5 t6 |) C// Author : Venkata Ramana Kalapatapu6 ]7 r1 S' r0 J7 d( C/ ~
// Company : Sand Microelectronics Inc.; N1 d$ J1 Z4 P" ^4 w
// (now a part of Synopsys, Inc.),
: K7 E4 u, H1 s" m( ]% U8 c9 a// Profile : Sand develops Simulation Models, Synthesizable Cores and
( \+ s* I9 s5 ?' Y. A; a: D" ~# n// Performance Analysis Tools for Processors, buses and
& F! d9 i" ?$ L4 l6 C- j// memory products. Sand's products include models for" ~ J, d8 n6 d$ k! W' L3 k
// industry-standard components and custom-developed models8 j& v: L/ `$ W; @
// for specific simulation environments.
) r' c- ^. D+ M* Y- e//% P. p7 S, }' q7 J
///////////////////////////////////////////////////////////////////// \$ e& d% g0 z4 d9 f6 l
5 o! k% y- M$ B( E: ^" l5 U
`define FWIDTH 32 // Width of the FIFO.
R! o0 Z" o/ q$ t. @2 [`define FDEPTH 4 // Depth of the FIFO.
( l. v+ H& _, f" q- B" `* u`define FCWIDTH 2 // Counter Width of the FIFO 2 to power5 P3 K- w0 X. F/ }( l( |5 n3 C* V
// FCWIDTH = FDEPTH.% T! _/ l3 m4 X, ~+ x. [
module fifo( Clk,! i7 B1 G8 }/ E( z& I
RstN,9 F1 B7 U+ i6 y% k1 V: E' ]5 W8 U. w
Data_In,
. H e% [# O. [5 u3 Q% R% m FClrN,
# g2 X0 \/ h% _) }; U FInN,
2 p- h n1 Z' j2 p% A FOutN,
( x- V" m8 u7 ?4 p F_Data,
* V1 ?+ n. O! m* X) T; C F_FullN,
( j: ^5 F) ^0 }# | F_LastN,0 M, N5 d; ~* P0 O+ [) n
F_SLastN,
+ ?" M4 ]4 r- A F_FirstN,
" E: }; d7 v" ~4 G4 b. o F_EmptyN0 S, T% E$ m0 @( Q+ |9 Z
);
5 s+ w- _; C/ Z8 f% c5 w' G
. f7 \" j8 a z: e8 j; tinput Clk; // CLK signal.4 B# K- s9 D6 x; F/ ?2 Q5 _
input RstN; // Low Asserted Reset signal., n& h+ V6 r* d1 b0 r4 z
input [(`FWIDTH-1):0] Data_In; // Data into FIFO.
% J# Y! D7 V+ w% q8 A7 qinput FInN; // Write into FIFO Signal.4 q, A$ n- j ~& A. E9 _1 i5 o! l$ x
input FClrN; // Clear signal to FIFO.- b: b8 L3 T. B5 `2 N5 ?6 [' T U
input FOutN; // Read from FIFO signal.
1 \4 A! m: y- d5 \/ K1 Q: Houtput [(`FWIDTH-1):0] F_Data; // FIFO data out.
4 V4 q8 A( }; \2 @# A( Zoutput F_FullN; // FIFO full indicating signal.) b! ]) M m1 d9 H1 o6 Z) H$ c
output F_EmptyN; // FIFO empty indicating signal.1 c. A6 [0 \$ S5 \9 ~
output F_LastN; // FIFO Last but one signal./ H3 u9 U" B5 |, f
output F_SLastN; // FIFO SLast but one signal.
* ~ z* s. N4 e5 w* f8 O* g$ V c8 zoutput F_FirstN; // Signal indicating only one" U4 l/ D5 f. m# A) s6 |7 U% ~7 ?, \
// word in FIFO.
& {9 {) M, ~' t* V$ }: q* i0 q* s6 [6 D0 j4 n, \0 n
reg F_FullN;
" C: A6 g6 N% C* {2 Areg F_EmptyN;
$ m" v: W6 H4 i( Greg F_LastN;
6 n/ @* i3 S, N) n# |reg F_SLastN;% h- Z8 g$ I4 `" T7 @% \3 {
reg F_FirstN;% G0 x- o& l! p6 P' A' U2 a* B4 x
reg [`FCWIDTH:0] fcounter; //counter indicates num of data in FIFO
/ f9 e# z- \- j- {( Z1 B7 c6 wreg [(`FCWIDTH-1):0] rd_ptr; // Current read pointer.
# v+ d3 t9 Z/ ^ g1 zreg [(`FCWIDTH-1):0] wr_ptr; // Current write pointer.
* x4 \+ g) f) L1 |+ A. Awire [(`FWIDTH-1):0] FIFODataOut; // Data out from FIFO MemBlk. F9 M. X4 o. X- k3 R
wire [(`FWIDTH-1):0] FIFODataIn; // Data into FIFO MemBlk
* N9 T* v9 B6 J# T* kwire ReadN = FOutN;4 {" O2 R5 B+ N
wire WriteN = FInN;
; E+ v, w/ }/ f; ]assign F_Data = FIFODataOut;
' H. B/ G/ a1 z; w7 R: [assign FIFODataIn = Data_In;
0 S, V. y1 q+ L3 l" i) I- S; {2 l5 |' ~0 ]7 d- V) X
FIFO_MEM_BLK memblk(.clk(Clk)," K8 _/ _! A) B4 q
.writeN(WriteN),
; b U3 q6 Z0 N4 V9 k .rd_addr(rd_ptr),
' |! t6 _0 ?2 h4 A" B; j .wr_addr(wr_ptr),- L: N% h9 E0 @- c: @
.data_in(FIFODataIn),' T7 H8 w0 L' L0 W0 p2 N3 T& F& z
.data_out(FIFODataOut)
3 v0 \! N7 G6 \ );
; J0 l% c% n8 w0 _. S! i4 E1 S // Control circuitry for FIFO. If reset or clr signal is asserted,/ h$ |: H- g& T9 V9 B
// all the counters are set to 0. If write only the write counter9 l; w' S5 p$ {6 S
// is incremented else if read only read counter is incremented K0 Q- J( }- ?0 h, p
// else if both, read and write counters are incremented.
$ w9 f/ p# X, k; U3 ~ // fcounter indicates the num of items in the FIFO. Write only
( c1 v$ b1 b8 V // increments the fcounter, read only decrements the counter, and
- d3 F* ~* x% P! V, I+ |( c1 I% g5 I1 R // read && write doesn't change the counter value.
) ^5 {1 j; \; x" M7 ^6 i S2 h7 g always @(posedge Clk or negedge RstN)
9 F$ @- o, M, c& Q$ e7 @. A begin+ R, a! Y8 E0 {" ~$ N: n
if(!RstN) begin
. }! Q6 o( h! W* k# R% m fcounter <= 0;+ N H. D2 P# Q' A6 \( m
rd_ptr <= 0;
4 g. Q: C" @6 O" [ wr_ptr <= 0;# g8 e9 d9 G; `2 z# k
end
8 d2 ^" _6 Z% E* `5 G else begin0 q) ]1 {% \" X
if(!FClrN ) begin$ m8 x1 _/ z6 w4 I- K
fcounter <= 0;
# T# O! u6 E/ T( {2 F rd_ptr <= 0;" _" S! w( k- z. c8 c
wr_ptr <= 0;
4 L& I1 J# V8 u( z( j+ h6 U end
: _# W$ X" k7 q( g+ a' P" r0 x else begin, U* E* p5 X V) b& f' s) ^
if(!WriteN && F_FullN)
: k5 x3 s* n- [; F& ?/ @ wr_ptr <= wr_ptr + 1;
7 X2 |3 T9 S: ^1 \1 z) b if(!ReadN && F_EmptyN)6 D% W6 L% ^2 P X
rd_ptr <= rd_ptr + 1;; A Y$ v7 }. T2 n b5 v& S" \
if(!WriteN && ReadN && F_FullN)9 k/ x6 l: f) U1 w3 m: m( S
fcounter <= fcounter + 1;
& W6 Q9 ~/ P$ s9 L6 p$ Y+ ? else if(WriteN && !ReadN && F_EmptyN)
) R4 \3 O8 o+ z: A& E' i fcounter <= fcounter - 1;
4 z/ {. I8 [0 K3 Q% w/ G' A5 X1 O" { end
8 S2 }5 t1 ?/ R/ P' Z. { end
$ C6 Z- G0 E, E9 I7 T end
6 @. Y H n" j& A6 I$ d( n( t // All the FIFO status signals depends on the value of fcounter.+ ^( k5 Y* ?- M& H1 F% X
// If the fcounter is equal to fdepth, indicates FIFO is full.5 e; \0 A/ L) r0 ~6 X# i, t
// If the fcounter is equal to zero, indicates the FIFO is empty.
5 B u2 B# j0 Y/ p* y |, _3 u // F_EmptyN signal indicates FIFO Empty Status. By default it is' r1 v0 W4 Y' [
// asserted, indicating the FIFO is empty. After the First Data is
7 H5 y- M% }: m4 M4 K" S! y$ K$ F // put into the FIFO the signal is deasserted.
* A! _* ~2 y+ z; s0 r always @(posedge Clk or negedge RstN). N* R8 M! O R$ L
begin8 d* g/ @ H) c
if(!RstN)- B/ A0 y2 d+ P8 d+ D
F_EmptyN <= 1'b0;# @& \$ C+ k t
else begin; `; T) z. S F/ ^0 J. L9 o
if(FClrN==1'b1) begin9 A6 u* q' _+ |3 b/ y8 q( [
if(F_EmptyN==1'b0 && WriteN==1'b0)
6 o# v- Y% u7 {. [ F_EmptyN <= 1'b1;- f% V( [. W8 d0 x3 O
else if(F_FirstN==1'b0 && ReadN==1'b0 && WriteN==1'b1)
; t$ j& [; z8 r6 }. j; d F_EmptyN <= 1'b0;, j& f# N; i4 F0 [6 ~4 k
end
, j9 ^+ |: I0 X: ] else+ t6 P- l, ] g8 n% ~) q+ I
F_EmptyN <= 1'b0;3 Q1 o$ \/ V. h
end% D6 }( D# E# ^* m9 G
end
) O7 O: q* |* u // F_FirstN signal indicates that there is only one datum sitting
, j7 k0 j* z( p! `* i2 J // in the FIFO. When the FIFO is empty and a write to FIFO occurs,, B2 C* Q- x* B2 x6 c
// this signal gets asserted.
3 W" |% p6 L) V% A always @(posedge Clk or negedge RstN)
6 E) J+ f9 w8 e- H% l begin
7 p' Q2 d% k; _8 d if(!RstN)
* P% r$ ~0 R# U' o F_FirstN <= 1'b1;
2 M+ [. F6 b* m9 M" m5 o else begin" D2 }6 J' D0 t6 @0 D c/ c8 d
if(FClrN==1'b1) begin& p0 E. q' H Z0 z6 J
if((F_EmptyN==1'b0 && WriteN==1'b0) ||
; [+ w) `9 e E, b2 S# B7 e: b (fcounter==2 && ReadN==1'b0 && WriteN==1'b1))
. D5 a3 v& z" `0 N Y* } F_FirstN <= 1'b0;7 q: S& p, r, S0 D u9 p
else if (F_FirstN==1'b0 && (WriteN ^ ReadN))( {7 x* @' O9 M5 X, L
F_FirstN <= 1'b1;( t* l j" L4 q1 o
end/ D" T: R: e5 H& v: k3 {% f+ b5 s
else begin
$ d0 H. S/ A+ P. |8 f6 a F_FirstN <= 1'b1;$ ?2 ]8 I8 O& A! W% y0 i3 z
end
1 Q- r7 q/ D( J$ k end5 z8 c. S' ~& c
end
: Z" |% T$ W) n1 J5 S
( v0 I8 c9 f( k$ t3 T6 T0 _ // F_SLastN indicates that there is space for only two data words
. J0 P- R1 F+ b1 @# { //in the FIFO.
" y4 G9 r( ?+ H% G' d ^7 O always @(posedge Clk or negedge RstN)
. x/ Y9 [6 j+ j$ a+ t! |5 s; ` c begin
6 C/ Q: V* [! }1 ?" s$ s# n- k( P; f if(!RstN)5 ]- D4 ~) A" l! p
F_SLastN <= 1'b1;
6 c) ?( i: @- {& E$ U else begin
: T0 C+ _9 b) ` R if(FClrN==1'b1) begin
! O7 H# \ C. o7 D( g, I I& c, o3 S if( (F_LastN==1'b0 && ReadN==1'b0 && WriteN==1'b1) ||
8 H- x% V+ w5 {& i/ E& p ?6 f (fcounter == (`FDEPTH-3) && WriteN==1'b0 && ReadN==1'b1))2 |( C# g6 U: x, o4 Z
F_SLastN <= 1'b0;) s( c0 a% C( J1 Y
4 A0 C, E, ?+ x4 p; P$ w' i; e else if(F_SLastN==1'b0 && (ReadN ^ WriteN) )
9 E1 Z, [/ E. r+ g! y F_SLastN <= 1'b1;
+ O3 A6 F' m/ q9 r. p end( {! `" I: G5 B' n
else
4 I, ?- `' r/ s, i$ ?& z F_SLastN <= 1'b1;% m# ~" V, E* k
end
4 i9 k. Y% g( }: e6 V/ F1 j end0 [3 Z0 y& ^' b5 J+ s. @* s. d
// F_LastN indicates that there is one space for only one data. F- J0 h1 Z: ]& f- g4 K1 Y, Y6 a
// word in the FIFO.
6 }6 D4 s5 i$ t always @(posedge Clk or negedge RstN)! j P9 v! b, y9 i8 E8 I" l5 N6 N
begin, E1 ~$ i6 p4 B# N% K
if(!RstN)
1 E( } H: e7 T! d F_LastN <= 1'b1;4 j$ `; O! D! H( I8 _
else begin
3 Y, _6 T4 _6 c$ W( b1 R if(FClrN==1'b1) begin' z! }; P0 F8 ~ a
if ((F_FullN==1'b0 && ReadN==1'b0) ||
% {) G: [- H J, _ (fcounter == (`FDEPTH-2) && WriteN==1'b0 && ReadN==1'b1))
9 [$ n7 `! z+ y2 o" [' W5 H F_LastN <= 1'b0;+ C( A) h, `( @: W0 E8 Q1 f2 U
else if(F_LastN==1'b0 && (ReadN ^ WriteN) )
h$ d9 q& n5 I4 i7 s: F; G F_LastN <= 1'b1;
5 R0 g. [0 k! x! _4 N2 ] end7 R+ }/ U- b1 ]: T. x n
else! C2 Q9 y2 n1 O' c
F_LastN <= 1'b1;
& a0 U, u, C, h2 B) V$ _ end
; X' l! ?! _6 c$ A" S end4 G" s" X$ U+ m$ t: C+ g9 B$ T
+ ~# t+ G' e4 }4 r3 e
// F_FullN indicates that the FIFO is full.
. v: C' W2 z3 y4 Q D9 O2 k6 L always @(posedge Clk or negedge RstN)
" D: d4 t$ R+ M! G6 K4 @ begin! X8 ?. d7 @# J* ^+ V
if(!RstN)
+ f% r1 Q. [( V% U" c& W6 G/ q F_FullN <= 1'b1;
& r- d* |, \ D9 Y) ?1 i, P& W else begin
6 f; a1 N, u) O8 ^ ? if(FClrN==1'b1) begin, G1 R8 m0 @% f7 r# i: E- G
if (F_LastN==1'b0 && WriteN==1'b0 && ReadN==1'b1)6 f$ ~5 e7 K, X* N
F_FullN <= 1'b0;1 A: Y7 o- f% [' I" L
else if(F_FullN==1'b0 && ReadN==1'b0)# X, O& i% A: I: o% v
F_FullN <= 1'b1;
! M) E7 z- _4 t& O" G end1 n6 b( I$ n8 w
else
# q% N5 `* X4 \! l F_FullN <= 1'b1;: y! _2 l0 R; |/ q" S( e) [
end
; q! H5 {8 }; w- E- S% v l3 f1 } end) K; w7 l$ [: r" \, r$ X# C$ N
endmodule) s U/ X9 K: g: G
4 b6 r: j' |6 {* P5 E
( \+ Z3 e& u1 |///////////////////////////////////////////////////////////////////
) z" K: G7 x: ?$ B1 k//# e2 a; d% Q& e. x5 O
//
# b0 A; n4 o3 K' M// Configurable memory block for fifo. The width of the mem
* H- `- F/ V- A// block is configured via FWIDTH. All the data into fifo is done; s2 c' c3 t9 Z; j/ N9 }/ b
// synchronous to block.# [6 f* d! @; z+ a6 n
//
# ?8 Y& X: N: F. c# |// Author : Venkata Ramana Kalapatapu
5 U, V$ i) u$ s+ g, T9 O$ @//1 b3 M/ v0 q! e$ G0 S4 [) Q
//////////////////////////////////////////////////////////////////// |( W9 W* v% R
module FIFO_MEM_BLK( clk,
/ N) h/ b' G0 a/ Q3 L writeN,
9 S8 |' A& b# W3 m4 C wr_addr,9 p; c* [( I% E: Q
rd_addr,
, X- ]+ X$ U+ @; A data_in,
% \% Q; b& X$ C5 D1 g data_out8 [& i e3 J! }2 p& b
);; q. k/ N ~% D7 I, B5 T5 s. O
- [3 r4 A) B! ~( Qinput clk; // input clk.
$ _. Z0 ?) c6 C9 i, Qinput writeN; // Write Signal to put data into fifo.
, D3 x. d1 @0 E4 a8 [# Qinput [(`FCWIDTH-1):0] wr_addr; // Write Address.
+ r3 l7 Y/ m# P, r( kinput [(`FCWIDTH-1):0] rd_addr; // Read Address.
( c4 _4 u# O6 W' j) H8 Finput [(`FWIDTH-1):0] data_in; // DataIn in to Memory Block
4 o, \4 E* R. _( u1 J' foutput [(`FWIDTH-1):0] data_out; // Data Out from the Memory
9 c$ Y; E0 w# p // Block(FIFO)6 u4 t+ `" x. h9 n
wire [(`FWIDTH-1):0] data_out;7 ?; I8 I" C5 k
reg [(`FWIDTH-1):0] FIFO[0:(`FDEPTH-1)];( v/ ]7 a2 S9 N6 J, V+ Z; z
assign data_out = FIFO[rd_addr];) T7 ~- d+ f C8 O9 c& V. U
always @(posedge clk)4 F/ S0 b& [5 J
begin: O7 i3 W1 J- H
if(writeN==1'b0)$ z, O B: F0 K6 q2 @
FIFO[wr_addr] <= data_in;$ H& ]; O- y ?3 ]2 s
end3 p+ H8 u; H6 J1 p2 C# \* N1 t
endmodule |
|