|
- ------------------------------------------------------------------------------------
" @3 U6 l% s7 p, _0 o - library IEEE;
- U! l$ q' }" v l - use IEEE.std_logic_1164.all;
& e* \9 G: ?( B/ y4 h - entity fifo is8 a3 p) @: P8 r5 l3 a: w I
- generic (
% p' z) H: C! s9 y - depth : positive := 16* u7 g, [( `8 ~5 |' m
- );
! v: M+ A0 r& V+ Z2 o - port(
' Q' n2 J2 z. M8 f8 l - CLR : in std_logic;, Q; i+ J2 R8 d3 w9 w
- WCLK : in std_logic;
4 d8 H4 i7 t9 j0 b- P3 x! S - WE : in std_logic;
; q4 b- p m5 Y: L - RCLK : in std_logic;
* W' q$ V: \( o7 N - RE : in std_logic;( n! j3 t$ {3 r8 d
- DATA : in std_logic_vector(7 downto 0);1 T4 C/ `' c5 d; C) V. R5 Y1 K
- EMPTY : out std_logic;
* w/ J" o; A# i - FULL : out std_logic;
a: U! H( l& }& X6 h$ h7 r; F - Q : out std_logic_vector(7 downto 0) J& m6 j0 a( \& D* M1 J
- );
( O' C* G. L; J; I! m7 Y% h5 r - end entity;
: q. w: n ^& D5 e8 _ - library IEEE;
1 U% `: A$ u4 i" r! i8 i( s8 f' H - use IEEE.std_logic_unsigned.all;! x) I; H' a2 O: A
- architecture behavior of fifo is
9 V* h/ V8 U9 b" I6 a7 i& O# @1 { - constant fmax : positive := depth-1;
& w ?# }; u9 q - type fifo_array_type is array (fmax downto 0) of std_logic_vector(7 downto 0);
9 V7 H* O/ n" F - signal fifo_array : fifo_array_type;
1 ~- e4 ]5 G8 W; \ - signal WR_PTR : INTEGER range 0 to fmax;, A/ ~, P3 y% f+ K9 [0 a O
- signal RD_PTR : INTEGER range 0 to fmax;
' v7 r3 J2 O: [5 c9 D/ T8 P - signal count : INTEGER range 0 to depth;
* _2 s2 V4 P9 o: ]$ P: D$ t - begin% m/ U' b5 k! i( v# i
- CNT: process(CLR, WR_PTR, RD_PTR)
h9 x" S# }) t! m5 s+ R/ } - variable change : integer; * u T/ F. L/ I: q2 j
- begin . F3 r# T6 p# F0 L6 d( r- J) I( Z t3 k6 M
- if CLR = '1' then* S/ [: P0 @! M" y. Z* }( _
- count <= 0;
" x, h) a' [ O: X! c5 m9 S, Z - change := 0;
5 X& u: s: t$ ^' \5 H. |, v5 R7 t" C - else
5 W O' Z7 T& r4 M( l - change := 0;" e: w$ Z& d1 g4 Q
- if WR_PTR'event then7 s" Q, ^0 V* |- m1 A
- change := 1;9 r8 C( L7 E' h4 R
- end if;
) L0 S* O, U+ R0 E% w - if RD_PTR'event then
, w, m0 `% u: Q1 _% k l$ h4 ] - change := change - 1;
% J' W. f. `9 D& w; S: U - end if;
, M! @& d( p. L0 [ - count <= count + change;
% B# D5 s4 f& L W - end if;
' Q& B( _0 B0 @, @6 c - end process; l1 {8 t* j' c6 U
- STATUS: process(count)
t8 U, q7 H0 u" K - begin
2 D/ I* m( s; f ?4 E - if count=0 then/ r" m, W. {- R0 ~
- FULL <= '0';4 D$ I6 S5 E. R: c2 i* d* G
- EMPTY <= '1'; _1 |( _$ W% o, L
- elsif count=depth then1 b: t$ {# b7 F9 R( `; r% `! H
- FULL <= '1'; / k- F6 T: Y( S& o
- EMPTY <= '0';
1 Z5 r! B* _! W+ e" Q - else , B) \; v9 e: H5 `1 m
- FULL <= '0';
8 X, R! X3 s* \' L& d - EMPTY <= '0';
, |% `' O% f* Z! x6 c Y; e - end if;
+ G. M" e8 B( v' a3 f$ K3 k - end process;
複製代碼 |
|