如何用Verilog把两个FIFO从0-99和100-199交替写入第三个FIFO中并写出
时间: 2024-05-06 22:16:51 浏览: 95
FIFO的Verilog实现
首先,我们需要定义FIFO的接口和深度。下面是一个简单的FIFO模块:
```verilog
module fifo (
input clk,
input rst,
input wr_en,
input rd_en,
input [7:0] data_in,
output [7:0] data_out,
output full,
output empty
);
parameter DEPTH = 16;
reg [7:0] mem [0:DEPTH-1];
reg [7:0] rd_ptr = 0;
reg [7:0] wr_ptr = 0;
reg [7:0] count = 0;
assign full = (count == DEPTH);
assign empty = (count == 0);
assign data_out = mem[rd_ptr];
always @(posedge clk) begin
if (rst) begin
rd_ptr <= 0;
wr_ptr <= 0;
count <= 0;
end else begin
if (wr_en && !full) begin
mem[wr_ptr] <= data_in;
wr_ptr <= wr_ptr + 1;
count <= count + 1;
end
if (rd_en && !empty) begin
rd_ptr <= rd_ptr + 1;
count <= count - 1;
end
end
end
endmodule
```
然后,我们可以实例化两个FIFO模块并将它们连接到第三个FIFO中。在这个例子中,我们假设每个FIFO的深度都是100。
```verilog
module top (
input clk,
input rst
);
parameter DEPTH = 100;
wire [7:0] data_out_1;
wire [7:0] data_out_2;
wire full_1;
wire full_2;
wire empty_1;
wire empty_2;
fifo fifo_1 (
.clk(clk),
.rst(rst),
.wr_en(1),
.rd_en(0),
.data_in({1'b0, 8'h00}),
.data_out(data_out_1),
.full(full_1),
.empty(empty_1)
);
fifo fifo_2 (
.clk(clk),
.rst(rst),
.wr_en(1),
.rd_en(0),
.data_in({1'b0, 8'h64}),
.data_out(data_out_2),
.full(full_2),
.empty(empty_2)
);
fifo fifo_3 (
.clk(clk),
.rst(rst),
.wr_en({full_1, full_2}),
.rd_en(1),
.data_in({data_out_1, data_out_2}),
.data_out(),
.full(),
.empty()
);
// write out data
always @(posedge clk) begin
if (!rst && !empty_3) begin
$display("Data: %d", fifo_3.data_out);
fifo_3.rd_en <= 1;
end
end
endmodule
```
在这个例子中,我们实例化了三个FIFO模块,分别表示两个输入FIFO和一个输出FIFO。输入FIFO 1 和 2 分别写入 0-99 和 100-199 的数据,然后交替地写入第三个FIFO中。输出FIFO每次读出两个数据,因此它的深度应该是至少2。最后,在时钟上升沿时,我们从输出FIFO中读出数据并打印出来。
阅读全文