用Verilog把两个FIFO从0-99和100-199写入第三个FIFO中 ,当一个FIFO写入时另一个暂停
时间: 2024-05-03 16:19:01 浏览: 93
使用Verilog语言实现fifo功能
以下是用 Verilog 实现的代码:
```verilog
module fifo_merge(
input clk,
input rst,
input [7:0] data_in1,
input [7:0] data_in2,
input wr_en1,
input wr_en2,
output [7:0] data_out,
output reg rd_en
);
reg [7:0] fifo1 [0:99];
reg [7:0] fifo2 [0:99];
reg [7:0] fifo3 [0:199];
reg [6:0] wr_ptr1;
reg [6:0] wr_ptr2;
reg [6:0] rd_ptr;
reg [6:0] cnt1;
reg [6:0] cnt2;
reg [6:0] cnt3;
reg wr_en3;
initial begin
wr_ptr1 = 0;
wr_ptr2 = 0;
rd_ptr = 0;
cnt1 = 0;
cnt2 = 0;
cnt3 = 0;
wr_en3 = 0;
end
always @(posedge clk or negedge rst) begin
if (rst == 0) begin
wr_ptr1 <= 0;
wr_ptr2 <= 0;
rd_ptr <= 0;
cnt1 <= 0;
cnt2 <= 0;
cnt3 <= 0;
wr_en3 <= 0;
rd_en <= 0;
end else begin
if (wr_en1 == 1) begin
fifo1[wr_ptr1] <= data_in1;
wr_ptr1 <= wr_ptr1 + 1;
cnt1 <= cnt1 + 1;
if (cnt1 == 100) begin
wr_en3 <= 1;
rd_en <= 0;
end
end else if (wr_en2 == 1) begin
fifo2[wr_ptr2] <= data_in2;
wr_ptr2 <= wr_ptr2 + 1;
cnt2 <= cnt2 + 1;
if (cnt2 == 100) begin
wr_en3 <= 1;
rd_en <= 0;
end
end
if (wr_en3 == 1) begin
fifo3[wr_ptr1+wr_ptr2] <= fifo2[rd_ptr];
rd_ptr <= rd_ptr + 1;
cnt3 <= cnt3 + 1;
if (cnt3 == 200) begin
wr_en3 <= 0;
rd_en <= 1;
cnt1 <= 0;
cnt2 <= 0;
cnt3 <= 0;
end else if (rd_ptr == 100) begin
wr_en2 <= 0;
rd_en <= 1;
end else if (rd_ptr == wr_ptr2) begin
wr_en2 <= 1;
rd_en <= 0;
end
end
end
end
assign data_out = fifo3[rd_ptr];
endmodule
```
这个模块有 8 个输入输出端口:
- `clk`:时钟信号,用于同步读写操作;
- `rst`:重置信号,将所有寄存器和计数器清零;
- `data_in1`:第一个 FIFO 的写入数据;
- `data_in2`:第二个 FIFO 的写入数据;
- `wr_en1`:第一个 FIFO 的写使能信号;
- `wr_en2`:第二个 FIFO 的写使能信号;
- `data_out`:第三个 FIFO 的读出数据;
- `rd_en`:第三个 FIFO 的读使能信号。
在 `always` 块中,我们先处理了重置信号,然后根据写使能信号将数据写入第一个或第二个 FIFO 中。每当一个 FIFO 写满时,就将写使能信号和读使能信号设置为 1 和 0,暂停另一个 FIFO 的写入操作。当第三个 FIFO 满时,将读使能信号设置为 1,同时清空所有计数器和写使能信号,以便重新开始读写过程。
阅读全文