FIFO verilog
时间: 2023-09-10 10:13:10 浏览: 81
FIFO (First-In-First-Out)是一种常用的数据存储器件,它的读取顺序与写入顺序相同,即先进先出。在Verilog中,可以使用以下代码实现一个8位宽度、深度为16的FIFO。
```
module fifo (
input clk,
input rst,
input wr_en,
input rd_en,
input [7:0] data_in,
output reg [7:0] data_out,
output reg full,
output reg empty
);
reg [7:0] mem [15:0];
reg [3:0] wr_ptr = 4'b0000;
reg [3:0] rd_ptr = 4'b0000;
always @(posedge clk) begin
if (rst) begin
wr_ptr <= 4'b0000;
rd_ptr <= 4'b0000;
full <= 1'b0;
empty <= 1'b1;
end else begin
if (wr_en && !full) begin
mem[wr_ptr] <= data_in;
wr_ptr <= wr_ptr + 1;
if (wr_ptr == 4'b1111)
wr_ptr <= 4'b0000;
if (wr_ptr == rd_ptr)
full <= 1'b1;
empty <= 1'b0;
end else if (rd_en && !empty) begin
data_out <= mem[rd_ptr];
rd_ptr <= rd_ptr + 1;
if (rd_ptr == 4'b1111)
rd_ptr <= 4'b0000;
if (rd_ptr == wr_ptr)
empty <= 1'b1;
full <= 1'b0;
end
end
end
endmodule
```
在这个代码中,我们使用了两个指针wr_ptr和rd_ptr来指示写入和读取的位置。当写入数据时,数据被存储在指针所指向的位置,并将指针向后移动一位。当指针到达队列的最后一位时,将其重置为队列头部。当队列已满时,将设置full标志。当读取数据时,数据从指针所指向的位置读取,并将指针向后移动一位。当指针到达队列的最后一位时,将其重置为队列头部。当队列为空时,将设置empty标志。
阅读全文