fifo存储器举例:(注3).txt
上传用户:easylife05
上传日期:2013-03-21
资源大小:42k
文件大小:2k
源码类别:

VHDL/FPGA/Verilog

开发平台:

C/C++

  1. -- A First-in First-out Memory
  2. -- a first-in first out memory, uses a synchronising clock
  3. -- generics allow fifos of different sizes to be instantiated
  4. -- download from: www.fpga.com.cn & www.pld.com.cn
  5. library IEEE;
  6. use IEEE.Std_logic_1164.all;
  7. entity FIFOMXN is
  8.    generic(m, n : Positive := 8); --m is fifo depth, n is fifo width
  9.    port(RESET, WRREQ, RDREQ, CLOCK : in Std_logic;
  10.          DATAIN : in Std_logic_vector((n-1) downto 0);
  11.          DATAOUT : out Std_logic_vector((n-1) downto 0);
  12.          FULL, EMPTY : inout Std_logic);
  13. end FIFOMXN;
  14. architecture V2 of FIFOMXN is
  15.    type Fifo_array is array(0 to (m-1)) of Bit_vector((n-1) downto 0);
  16.    signal Fifo_memory : Fifo_array;
  17.    signal Wraddr, Rdaddr, Offset : Natural range 0 to (m-1);
  18.    signal Rdpulse, Wrpulse, Q1, Q2, Q3, Q4 : Std_logic;
  19.    signal Databuffer : Bit_vector((n-1) downto 0);
  20. begin
  21. --pulse synchronisers for WRREQ and RDREQ
  22. --modified for Synplify to a process
  23. sync_ffs : process
  24.         begin
  25.                 wait until rising_edge(CLOCK);
  26.                 Q1 <= WRREQ;
  27.                 Q2 <= Q1;
  28.                 Q3 <= RDREQ;
  29.                 Q4 <= Q3;
  30. end process;
  31. --concurrent logic to generate pulses
  32. Wrpulse <= Q2 and not(Q1);
  33. Rdpulse <= Q4 and not(Q3);   
  34. Fifo_read : process
  35.    begin
  36.       wait until rising_edge(CLOCK);
  37.       if RESET = '1' then
  38.          Rdaddr <= 0;
  39.          Databuffer <= (others => '0');
  40.       elsif (Rdpulse = '1' and EMPTY = '0') then
  41.          Databuffer <= Fifo_memory(Rdaddr);
  42.          Rdaddr <= (Rdaddr + 1) mod m;
  43.       end if;
  44.    end process;
  45. Fifo_write : process
  46.    begin
  47.       wait until rising_edge(CLOCK);
  48.       if RESET = '1' then
  49.          Wraddr <= 0;
  50.       elsif (Wrpulse = '1' and FULL = '0') then
  51.          Fifo_memory(Wraddr) <= To_Bitvector(DATAIN);
  52.          Wraddr <= (Wraddr + 1) mod m;
  53.       end if;
  54.    end process;
  55. Offset <= (Wraddr - Rdaddr) when (Wraddr > Rdaddr) 
  56.             else (m - (Rdaddr - Wraddr)) when (Rdaddr > Wraddr)
  57.             else 0;
  58. EMPTY <= '1' when (Offset = 0) else '0';
  59. FULL <= '1' when (Offset = (m-1)) else '0';
  60. DATAOUT <= To_Stdlogicvector(Databuffer) when RDREQ = '0' 
  61.             else (others => 'Z');
  62. end V2;