用verilog 写一个 fifo深度是32的异步fifo
时间: 2023-03-19 14:23:53 浏览: 106
Verilog 异步fifo实现
好的,下面是用 Verilog 语言写一个深度为 32 的异步 FIFO 的示例代码:
```verilog
module async_fifo (
input clk,
input reset,
input wr_en,
input rd_en,
input [7:0] data_in,
output [7:0] data_out,
output full,
output empty
);
reg [7:0] fifo [31:0];
reg [4:0] wr_ptr;
reg [4:0] rd_ptr;
wire [4:0] next_wr_ptr;
wire [4:0] next_rd_ptr;
wire full_wire;
wire empty_wire;
assign full = full_wire;
assign empty = empty_wire;
assign data_out = fifo[rd_ptr];
// Wr_ptr
always @(posedge clk or posedge reset) begin
if (reset) begin
wr_ptr <= 5'd0;
end else if (wr_en && !full_wire) begin
wr_ptr <= next_wr_ptr;
end
end
assign next_wr_ptr = (wr_ptr == 5'd31) ? 5'd0 : (wr_ptr + 1'b1);
// Rd_ptr
always @(posedge clk or posedge reset) begin
if (reset) begin
rd_ptr <= 5'd0;
end else if (rd_en && !empty_wire) begin
rd_ptr <= next_rd_ptr;
end
end
assign next_rd_ptr = (rd_ptr == 5'd31) ? 5'd0 : (rd_ptr + 1'b1);
// FIFO Memory
always @(posedge clk or posedge reset) begin
if (reset) begin
fifo <= 0;
end else if (wr_en && !full_wire) begin
fifo[wr_ptr] <= data_in;
end
end
assign full_wire = (next_wr_ptr == rd_ptr) ? 1'b1 : 1'b0;
assign empty_wire = (wr_ptr == rd_ptr) ? 1'b1 : 1'b0;
endmodule
```
这个异步 FIFO 使用一个 32 个元素的寄存器数组作为 FIFO 内存,每个元素是 8 位的。输入时,`wr_en` 使能信号表示写入使能,`data_in` 输入数据,输出时,`rd_en` 使能信号表示读取使能,`data_out` 输出数据。当 FIFO 内存满时,`full` 输出高电平,当 FIFO 内存为空时,`empty` 输出高电平。由于这是一个异步 FIFO,所以不需要时钟上升沿同步读写。在写入时,首先检查 FIFO 是否已满,如果 FIFO 不满,则将数据写入 FIFO,写入指针 `wr_ptr` 加 1。在读取时,首先检查 FIFO 是否为空,如果 FIFO 不为空,则从 FIFO 中读取数据,读取指针 `rd_ptr` 加 1。如果读写指针到达 FIFO 的末尾,它们会回滚到 FIFO 的开头。
阅读全文