module Async_FIFO( input clk, //时钟信号 input rst_n, //复位信号,低电平有效 input wr_en, //写使能信号 input rd_en, //读使能信号 input [7:0] data_in, //写入数据 output [7:0] data_out, //读出数据 output full, //FIFO满标志 output empty //FIFO空标志 );

parameter WIDTH = 8;  //FIFO宽度
parameter DEPTH = 16; //FIFO深度

reg [WIDTH-1:0] fifo [0:DEPTH-1];  //FIFO数组
reg [3:0] wr_ptr;   //写指针,最高位表示溢出
reg [3:0] rd_ptr;   //读指针,最高位表示溢出

assign full = (rd_ptr[4] == wr_ptr[4] && wr_en && ~rd_en);  //FIFO满标志
assign empty = (rd_ptr == wr_ptr && ~wr_en && rd_en);  //FIFO空标志

always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        wr_ptr <= 4'h0;
        rd_ptr <= 4'h0;
    end else begin
        if (wr_en && ~full) begin
            fifo[wr_ptr[3:0]] <= data_in;
            wr_ptr <= wr_ptr + 1;
            wr_ptr[4] <= (wr_ptr == rd_ptr);
        end
        if (rd_en && ~empty) begin
            data_out <= fifo[rd_ptr[3:0]];
            rd_ptr <= rd_ptr + 1;
            rd_ptr[4] <= (rd_ptr == wr_ptr);
        end
    end
end

endmodule

写一段VERILOG语言,异步FIFO逻辑

原文地址: https://www.cveoy.top/t/topic/yJY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录