写一段VERILOG语言,异步FIFO逻辑
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
原文地址: https://www.cveoy.top/t/topic/yJY 著作权归作者所有。请勿转载和采集!