使用verilog写一个用reg搭建的FIFO
时间: 2024-01-24 08:17:32 浏览: 25
以下是使用 Verilog 实现一个用 reg 搭建的 8 字节 FIFO 的代码:
```
module fifo (
input clk,
input reset,
input write,
input read,
input [7:0] data_in,
output [7:0] data_out,
output full,
output empty
);
reg [7:0] mem [0:7];
reg [2:0] write_ptr;
reg [2:0] read_ptr;
always @(posedge clk) begin
if (reset) begin
write_ptr <= 3'b0;
read_ptr <= 3'b0;
end else begin
if (write) begin
mem[write_ptr] <= data_in;
write_ptr <= write_ptr + 1;
end
if (read) begin
data_out <= mem[read_ptr];
read_ptr <= read_ptr + 1;
end
end
end
assign full = write_ptr == read_ptr + 1 || write_ptr == 3'b0 && read_ptr == 3'b111;
assign empty = write_ptr == read_ptr;
endmodule
```
在上面的代码中,我们使用了一个 reg 数组 `mem` 来存储 FIFO 中的数据。`write_ptr` 和 `read_ptr` 分别表示写指针和读指针的位置。当写入数据时,我们将数据存储在 `mem` 中,并将写指针向前移动一位;当读取数据时,我们从 `mem` 中读取数据,并将读指针向前移动一位。
`full` 和 `empty` 分别表示 FIFO 是否已经满了和是否为空。当写指针处于读指针的下一位时,FIFO 就被认为是满的了;当写指针与读指针重合时,FIFO 就被认为是空的了。
需要注意的是,这里的 FIFO 是一个阻塞式的 FIFO,当 FIFO 已经满了时,写入操作会被阻塞;当 FIFO 已经为空时,读取操作会被阻塞。如果需要实现非阻塞式的 FIFO,可以使用其他方法来实现。