TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Verilog写的异步FIFO程序
" T0 {( M( a. K0 }//-----------------------------------------------------
: H' d- Y7 b1 G5 M2 E! Q 2 // Design Name : syn_fifo
, l/ m' O. b# F) I( z' x4 G 3 // File Name : syn_fifo.v
% `8 a% D! f+ y+ P* z* k 4 // Function : Synchronous (single clock) FIFO' c+ p* B" X7 n
5 // Coder : Deepak Kumar Tala
# k/ o; b3 x1 d5 v5 a1 j% U 6 //-----------------------------------------------------
" i& V# u& s4 `, R# U 7 module syn_fifo (6 g1 e: [" ~1 D) {- h# ~
8 clk , // Clock input
: R0 A) b0 x! a& ] s+ S 9 rst , // Active high reset! H3 A5 j! p' k8 s$ d
10 wr_cs , // Write chip select- Q! f2 w2 v" t1 G
11 rd_cs , // Read chipe select
" k( _: n- I+ e& I3 \. e: X, I2 Y 12 data_in , // Data input5 S# y' b6 \$ X* T3 p2 ?5 b
13 rd_en , // Read enable+ c# ~( O& J% E* k4 A- ?
14 wr_en , // Write Enable7 W9 r8 W6 N9 U) i! ~* q
15 data_out , // Data Output5 o1 k, r: A! j t+ x, g- _
16 empty , // FIFO empty
, C/ `2 R* q3 v) C0 s! T 17 full // FIFO full
* a/ f( T; z+ K7 Q" _4 l; W 18 ); 4 }1 C; z4 x8 \# F
19
8 y# z# q# C+ N8 y. E 20 // FIFO constants
- \6 ^ Z4 [3 h1 y 21 parameter DATA_WIDTH = 8;
, P$ x# H: v* O \6 z 22 parameter ADDR_WIDTH = 8;
+ K) S* D1 |6 q7 X 23 parameter RAM_DEPTH = (1 << ADDR_WIDTH);1 \9 b: n3 i/ X+ G" [* M
24 // Port Declarations* A1 i! K- s' R q$ Z! T+ Z1 y
25 input clk ;, q2 J, f3 L Z3 S+ G# H
26 input rst ;5 c: y! u6 x; F5 G* n) c5 T
27 input wr_cs ;
1 h1 {2 Z) r6 c7 i+ z6 w. `! C/ A4 i 28 input rd_cs ;$ O. p* p. @7 a& f
29 input rd_en ;4 S# M; @; j, s7 o& I. Y
30 input wr_en ;
1 u' L* O' K% `. W- F 31 input [DATA_WIDTH-1:0] data_in ;
7 o# _$ j3 @6 ^2 d: s 32 output full ;" \. v7 p1 R* ?: ?- O2 x. l3 ?
33 output empty ;
9 d9 P7 v: g6 ], W! N+ w 34 output [DATA_WIDTH-1:0] data_out ;
+ `" f$ `, M0 d7 z7 _6 X 35 8 i. |( l; A5 N& O
36 //-----------Internal variables-------------------
+ a1 t1 n5 U. q 37 reg [ADDR_WIDTH-1:0] wr_pointer;2 m% }, y8 |& y' m8 _
38 reg [ADDR_WIDTH-1:0] rd_pointer;( \- r$ U# V4 p% F0 B& F: D
39 reg [ADDR_WIDTH :0] status_cnt;
# K# @8 j" M1 Z$ c$ A2 O6 v& T 40 reg [DATA_WIDTH-1:0] data_out ;6 m8 |- X7 S: H7 h% }, n6 u( [& j9 p1 }
41 wire [DATA_WIDTH-1:0] data_ram ;& F' d* q1 n: H
42 e8 r! a. G7 n+ X$ o( }
43 //-----------Variable assignments---------------( ?% }& W* S4 S3 g! {4 Q0 @$ c/ C
44 assign full = (status_cnt == (RAM_DEPTH-1));8 {( ~ ]; d: o% g
45 assign empty = (status_cnt == 0);
2 U C* p/ G$ e0 j K' k$ W* p 46 0 V2 A3 C6 L5 m8 G1 ]
47 //-----------Code Start---------------------------, _4 |0 S$ ~% j) Y. @# d
48 always @ (posedge clk or posedge rst)
; J# ]4 } V) c9 m! z7 ? 49 begin : WRITE_POINTER! y5 f* W2 x4 Y, q
50 if (rst) begin" c& @( p; Q/ g- b
51 wr_pointer <= 0;) G g9 P0 D2 \
52 end else if (wr_cs && wr_en ) begin5 J0 O4 r5 T7 y6 i
53 wr_pointer <= wr_pointer + 1;7 r1 a4 I2 X) Z2 J( H7 x
54 end/ H" c9 L, r9 e' P; {
55 end
3 |5 c, z) t" l* v E/ k 56
! d% `6 N- f; J" K7 o 57 always @ (posedge clk or posedge rst)
9 v9 F1 y1 |; u, w9 x 58 begin : READ_POINTER
5 f3 y* x- N( k$ E 59 if (rst) begin+ r! `* ~) J: J) F% @6 e" T3 a" @
60 rd_pointer <= 0;$ k" Z* `# I. y j! n0 Z
61 end else if (rd_cs && rd_en ) begin j; a7 |4 L& m% n" S' ~5 S/ z
62 rd_pointer <= rd_pointer + 1;: T5 j9 @% S2 a3 ^ j
63 end
) n- O! H, C3 S8 D# | 64 end9 [% z' D* s3 W5 w# n. C9 ^4 O2 O# p
65 ' X1 M) l" ^+ b3 [
66 always @ (posedge clk or posedge rst)/ ^; B! T% B; \! s# C
67 begin : READ_DATA
0 x0 Z8 n. \7 W1 G 68 if (rst) begin
/ D3 S+ `4 v* I% J. i$ |& z 69 data_out <= 0;
2 A1 [, N& E- s; { 70 end else if (rd_cs && rd_en ) begin
% F7 e; J' g1 F+ A$ E 71 data_out <= data_ram;. w( o& h- z' r/ v" D* G0 }; D
72 end4 @/ w ~( N+ D4 \7 m
73 end3 T/ ]) S" I4 }4 j
74 1 @8 h0 s5 ]: O6 r7 C# l" w1 M" ?$ D& J
75 always @ (posedge clk or posedge rst)
9 [; Q1 q# x6 w; H2 x0 [ 76 begin : STATUS_COUNTER z/ c, m" P. Q
77 if (rst) begin( a& J F+ E8 e# ]" D0 U. m: ^
78 status_cnt <= 0;
1 g) {; I7 ?3 M6 x 79 // Read but no write.6 J: b9 n, Q T+ m
80 end else if ((rd_cs && rd_en) && ! (wr_cs && wr_en)
* `3 O1 ]7 l& _; q; S1 T' h 81 && (status_cnt ! = 0)) begin
; O, H' a8 S8 ` 82 status_cnt <= status_cnt - 1;7 a# T) \, C, p
83 // Write but no read.+ f2 o2 q% V) o" w! x$ D
84 end else if ((wr_cs && wr_en) && ! (rd_cs && rd_en)
1 h1 O/ ?/ U: m$ |" j& u0 @9 C! [5 H 85 && (status_cnt ! = RAM_DEPTH)) begin
: J/ x) p; q6 m S* f, Y 86 status_cnt <= status_cnt + 1;
& e9 {. C& n' a4 {: h) v 87 end( [9 r( F- l: J- o
88 end - Z2 F d7 Q: \& I
89
% G! x7 s6 ?: [: ~# _ 90 ram_dp_ar_aw #(DATA_WIDTH,ADDR_WIDTH)DP_RAM (' |3 |/ a0 z/ N6 o
91 .address_0 (wr_pointer) , // address_0 input
. W0 y7 v' L$ q: r% ]' r0 G5 ` 92 .data_0 (data_in) , // data_0 bi-directional9 @3 [5 h% n$ Q, v; u) q
93 .cs_0 (wr_cs) , // chip select* d y2 X+ `6 I7 ?
94 .we_0 (wr_en) , // write enable( ^6 [: C* |9 B& P! w1 [
95 .oe_0 (1'b0) , // output enable. F" v. e3 ?. u1 B
96 .address_1 (rd_pointer) , // address_q input; b% \: a5 C* X+ [- n( l9 @4 A
97 .data_1 (data_ram) , // data_1 bi-directional) E' I# ]# m( E5 x9 F
98 .cs_1 (rd_cs) , // chip select
4 ^4 Y0 g2 E4 z& { 99 .we_1 (1'b0) , // Read enable, _, Z; S; S% R" Y
100 .oe_1 (rd_en) // output enable4 i9 \/ C7 N* k8 n! u
101 ); 2 {/ u' |3 W" Y+ [4 \* [, k
102 : d% U. o$ [) @- y% m5 W1 S9 d
103 endmodule1 g7 L4 b! H$ G/ j: m
|
|