TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Verilog写的异步FIFO程序
' r8 u, F$ C4 j5 O+ ]) M//-----------------------------------------------------5 J. W, O2 a* m( ?; X
2 // Design Name : syn_fifo/ d& v3 L; t8 d: ^
3 // File Name : syn_fifo.v
$ m9 Y6 V `1 j/ a3 x a 4 // Function : Synchronous (single clock) FIFO# ^! B- W+ R: t1 [& X2 b
5 // Coder : Deepak Kumar Tala3 O8 x: R) B0 u; a- `
6 //-----------------------------------------------------
`" u4 [9 e6 q 7 module syn_fifo (
# R- v- V$ m9 M, e0 i1 ~ 8 clk , // Clock input
5 m8 S" D) f+ V7 C7 M \. ` 9 rst , // Active high reset) X) Z6 k+ t$ I- e ^0 ]
10 wr_cs , // Write chip select$ ~$ d/ c8 n$ m/ W+ M
11 rd_cs , // Read chipe select
- `8 S8 k" s: V5 Y 12 data_in , // Data input# S/ i# n; T% V! V
13 rd_en , // Read enable
! H! o/ O5 C9 t% I- e! H 14 wr_en , // Write Enable
0 G; j3 H" b; k2 M$ I 15 data_out , // Data Output2 F. E4 L& p+ ^6 q* v8 v
16 empty , // FIFO empty, F5 _1 g0 y9 U9 r4 D
17 full // FIFO full
9 G5 h, l0 B; ~2 s) ]7 t 18 ); + m! M! U* u; m: S5 X9 f, u
19
$ V4 W3 a' N7 x, `% O. [) \ 20 // FIFO constants
/ N( i9 h9 w# k& ]6 k 21 parameter DATA_WIDTH = 8;1 f) k9 e1 \% |2 ~$ M
22 parameter ADDR_WIDTH = 8;
3 Z, v5 E, ^" [4 f; m 23 parameter RAM_DEPTH = (1 << ADDR_WIDTH);
% g0 S3 N4 T2 h9 r 24 // Port Declarations
; w& f" v+ F7 A! ^! v 25 input clk ;7 @9 d" u# ~4 ~5 E% T
26 input rst ;
& F$ o4 c! k; r4 X! ~# p p+ y 27 input wr_cs ;4 s; m* u0 c8 ?) a: f5 H4 V
28 input rd_cs ;
/ J% U3 V/ R( E+ V6 K6 a9 O 29 input rd_en ;5 L& z/ ~. t* @7 t2 ?5 x' ^
30 input wr_en ;
( A6 C. x* x& \( n' A& b 31 input [DATA_WIDTH-1:0] data_in ;/ Q7 [8 r' p% J) d
32 output full ;# \, W: g5 T" {2 M/ O% J
33 output empty ;
7 C6 t$ o% x+ w& L 34 output [DATA_WIDTH-1:0] data_out ;
% ?8 r+ r0 u* S- r$ G1 M, t 35 I [. h: B' H6 p+ W1 ^
36 //-----------Internal variables-------------------
5 J. Z% G& ~& S 37 reg [ADDR_WIDTH-1:0] wr_pointer;
% b; X" \% ^) ~* e7 ?. ?) z 38 reg [ADDR_WIDTH-1:0] rd_pointer; d' E E z) K) N5 H: r2 q2 _
39 reg [ADDR_WIDTH :0] status_cnt;- Z: v6 C# ~/ o
40 reg [DATA_WIDTH-1:0] data_out ;# k: Y4 D! `# L( _/ n6 g9 Z# Z6 {' D
41 wire [DATA_WIDTH-1:0] data_ram ;
( `: ~/ n0 h* `( k 42
6 C& H( _+ L8 ], \( p5 b 43 //-----------Variable assignments---------------! L T s2 y0 E) D/ j, f8 y
44 assign full = (status_cnt == (RAM_DEPTH-1));
9 {0 l2 v( d$ I, V* p 45 assign empty = (status_cnt == 0);
% ?; d" e7 u/ _6 D 46
$ H: q) Q* I+ r: S6 V' Q% S' b* X0 f) x 47 //-----------Code Start---------------------------7 G# _: |, ^. G
48 always @ (posedge clk or posedge rst)( M Q! @( u# {* }. K9 n
49 begin : WRITE_POINTER
/ q: M( x X- D/ T! w! H 50 if (rst) begin( c- X' k# }, X
51 wr_pointer <= 0;4 l$ e$ E9 {% Z9 [ ]
52 end else if (wr_cs && wr_en ) begin
6 l+ Y2 g/ M1 o4 g( ?4 X- f 53 wr_pointer <= wr_pointer + 1;+ a7 U7 J! k$ L5 ]
54 end' g0 s: w. s; y" [" q; }( M
55 end! M! U7 m N" o) {( O+ @$ s3 e/ O
56 8 I, k) y" f8 z
57 always @ (posedge clk or posedge rst)
! }5 q7 \- a1 [- @ 58 begin : READ_POINTER2 {1 A: u. F, x- {
59 if (rst) begin8 I- Z# ?' u" ] l
60 rd_pointer <= 0;
2 {( l' X" M: v( T, i 61 end else if (rd_cs && rd_en ) begin; [4 }. ?5 H- [
62 rd_pointer <= rd_pointer + 1;* V( P& d0 `5 W8 D0 X% `+ S8 L
63 end' ~# d( I$ e: o5 p+ Y& P
64 end' e7 T; x! x5 d Q" V6 v9 n7 `. ?
65 0 B6 X# g, M6 L& d! L2 X9 c
66 always @ (posedge clk or posedge rst)9 w: b X$ C+ k8 ?9 p" o9 |
67 begin : READ_DATA. p; C' k' b+ g7 [8 e
68 if (rst) begin
& G; P+ |7 z+ w% n" t 69 data_out <= 0;
& r6 J+ z1 M; S2 x) A0 P0 _ 70 end else if (rd_cs && rd_en ) begin& z; Y0 E9 u/ p+ p: `# F2 F0 o
71 data_out <= data_ram;/ P' J7 U5 l+ U: }) u
72 end3 B, b& M" R$ X4 D2 R8 M; k
73 end; ]/ T8 B" \ L' [1 u
74
( n* Y$ @# V. h$ a 75 always @ (posedge clk or posedge rst); k' |7 X+ h+ D* G4 P+ Q, F+ z
76 begin : STATUS_COUNTER. C0 n8 s% x/ R2 Q
77 if (rst) begin1 p n! w; Q5 J4 C }
78 status_cnt <= 0;' U, a) V: g: Y# d+ J- @
79 // Read but no write.9 T) t: t1 X7 M# n% x% a% ^% R0 R
80 end else if ((rd_cs && rd_en) && ! (wr_cs && wr_en)
v2 D, I# T# \$ M 81 && (status_cnt ! = 0)) begin
6 [8 I6 w6 }8 Q* k* [& ` 82 status_cnt <= status_cnt - 1;
3 | |3 B* v( v 83 // Write but no read.; {' N# P/ {5 z# G; Q! v
84 end else if ((wr_cs && wr_en) && ! (rd_cs && rd_en)
; p7 a" ]& S7 U0 Q- `: i/ Z( q5 Y 85 && (status_cnt ! = RAM_DEPTH)) begin
/ N3 x8 O/ ]- P3 J* ~3 r0 D) r 86 status_cnt <= status_cnt + 1;9 V( S# H! V6 D- b' T# |
87 end
& H' S* {1 u/ k3 C 88 end 4 Q& N3 g# X7 w6 D; [3 F8 a Q
89 ! w, ~% ^4 X" d b. g
90 ram_dp_ar_aw #(DATA_WIDTH,ADDR_WIDTH)DP_RAM (
& w, V& q2 s$ ~$ f0 @) [9 M. d5 J 91 .address_0 (wr_pointer) , // address_0 input @* Y" m4 m: Q( J9 \
92 .data_0 (data_in) , // data_0 bi-directional6 ?2 o) G( _# P& W, h3 I
93 .cs_0 (wr_cs) , // chip select
0 M# H4 V+ h( J6 n 94 .we_0 (wr_en) , // write enable
% t( U B% ^8 S j- v7 W4 t9 v 95 .oe_0 (1'b0) , // output enable
% p( }) N9 Y' H 96 .address_1 (rd_pointer) , // address_q input0 ]+ E! L. o4 ]& H* T! N
97 .data_1 (data_ram) , // data_1 bi-directional0 c& d* e M" @+ L; @
98 .cs_1 (rd_cs) , // chip select
8 V. r( A4 u0 F, ^ 99 .we_1 (1'b0) , // Read enable3 a0 u) H% Z$ d% h/ ^
100 .oe_1 (rd_en) // output enable
$ n$ ^8 L, z! m101 ); 4 s7 Z8 S' w% D2 i- `* ]- [( k
102
8 ~, |- a% h7 m7 l! k Y7 s103 endmodule: N: }5 W0 v3 f3 K4 V. Y
|
|