// read pointer always@(posedge clk or negedge rst_n) begin if(~rst_n) begin read_pointer <= 'b0; end else begin if( rd_en && !rd_empty) begin if( rd_pointer == DATA_DEPTH - 1) begin rd_pointer <= 'b0; end else begin rd_pointer <= rd_pointer + 1'b1; end end end end // read operation always@(posedge clk or negedge rst_n) begin if(~rst_n) begin read_data <= 'b0; end else begin read_data <= fifo_buffer[rd_pointer]; end end // write pointer always@(posedge clk or negedge rst_n) begin if(~rst_n) begin wr_pointer <= 'b0; end else begin if( wr_en && !wr_full) begin if( wr_pointer == DATA_DEPTH - 1) begin wr_pointer <= 'b0; end else begin wr_pointer <= wr_pointer + 1'b1; end end end end // write operation always@(posedge clk or negedge rst_n) begin if(~rst_n) begin fifo_buffer[wr_pointer] <= 'b0; end else begin fifo_buffer[wr_pointer] <= read_data; end end // current fifo_cnt in fifo_buffer always@(posedge clk or negedge rst_n) begin if(~rst_n) begin fifo_cnt <= 'b0; end else begin fifo_cnt <= fifo_cnt + 1'b1; end end // empty and full assign full = (fifo_cnt == DATA_DEPTH); assign empty = (fifo_cnt == 0 );