异步FIFO实现
module fifo_16x16(
//fifo write
wr_clk,
wr_en,
almost_full,
full,
wr_data,
//fifo read
rd_clk,
rd_en,
almost_empty,
empty,
rd_data,
//reset
wr_reset,
rd_reset
);
//***************************************************************************************************
//
// Parameter DECLARATION
//
//***************************************************************************************************
parameter ADDR_WIDTH = 4 ;
parameter DATA_WIDTH = 16 ;
parameter ALMOST_FULL_GAP = 3 ;//离满还有 3 时,almost_full有效
parameter ALMOST_EMPTY_GAP = 3 ;//离满还有 3 时,almost_empty有效
parameter FIFO_DEEP = 16 ;
// *************************************************************************************************
//
// INPUT / OUTPUT DECLARATION
//
// *************************************************************************************************
input wr_reset ;//FIFO写时钟下的复位信号
input wr_clk ;//写时钟
input wr_en ;//写使能
input [DATA_WIDTH-1:0] wr_data ;//写数据
output almost_full ;//将满信号
output full ;//满信号
input rd_reset ;//FIFO读时钟下的复位信号
input rd_clk ;//读时钟
input rd_en ;//读使能
output [DATA_WIDTH-1:0] rd_data ;//读数据
output almost_empty ;//将空信号
output empty ;//空信号
// *************************************************************************************************
//
// WIRE DECLARATION
//
// *************************************************************************************************
wire [ADDR_WIDTH-1:0] wr_addr ;//FIFO写地址
wire [ADDR_WIDTH-1:0] rd_addr ;//FIFO读地址
wire [DATA_WIDTH-1:0] data_out_temp ;//FIFO读出地址
reg [ADDR_WIDTH:0] wr_gap ;//写指针和读指针之间的间隔
reg [ADDR_WIDTH:0] rd_gap ;//读指针和写指针之间的间隔
// *************************************************************************************************
//
// REGISTER DECLARATION
//
// *************************************************************************************************
wire [DATA_WIDTH-1:0