Verilog将一个FIFO写数据1-20,并将奇数读出到FIFO2,偶数读到FIFO3内
时间: 2024-03-01 22:51:52 浏览: 46
下面是一个Verilog模块,它将1-20的数据写入FIFO,并将奇数读取到FIFO2,偶数读取到FIFO3。
```verilog
module fifo_splitter (
input clk,
input reset_n,
input wr_en,
input rd_en,
input [31:0] wr_data,
output [31:0] rd_data_1,
output [31:0] rd_data_2
);
parameter FIFO_DEPTH = 8;
reg [31:0] fifo [0:FIFO_DEPTH-1];
reg [3:0] wr_ptr;
reg [3:0] rd_ptr_1;
reg [3:0] rd_ptr_2;
reg [3:0] count;
reg [3:0] odd_count;
reg [3:0] even_count;
always @(posedge clk or negedge reset_n) begin
if (!reset_n) begin
wr_ptr <= 4'd0;
rd_ptr_1 <= 4'd0;
rd_ptr_2 <= 4'd0;
count <= 4'd0;
odd_count <= 4'd0;
even_count <= 4'd0;
end else begin
if (wr_en) begin
fifo[wr_ptr] <= wr_data;
wr_ptr <= wr_ptr + 1;
count <= count + 1;
end
if (rd_en && count > 0) begin
rd_data_1 <= fifo[rd_ptr_1];
if (fifo[rd_ptr_1] % 2 == 1) begin
fifo[rd_ptr_1] <= 0;
odd_count <= odd_count + 1;
end else begin
fifo[rd_ptr_1] <= 0;
even_count <= even_count + 1;
end
rd_ptr_1 <= rd_ptr_1 + 1;
count <= count - 1;
end
if (odd_count > 0) begin
rd_data_2 <= fifo[rd_ptr_2];
rd_ptr_2 <= rd_ptr_2 + 1;
odd_count <= odd_count - 1;
end
end
end
endmodule
```
该模块包括一个FIFO,通过写使能信号wr_en和数据wr_data将1-20的数据写入FIFO中。读使能信号rd_en和rd_data_1用于从FIFO中读取数据。如果读取到的数据为奇数,则将其写入FIFO2中,并通过rd_data_2输出,否则将其写入FIFO3中。
该模块还包括wr_ptr、rd_ptr_1和rd_ptr_2三个指针。wr_ptr指向FIFO的写入位置,rd_ptr_1指向FIFO的读取位置,rd_ptr_2指向FIFO2的读取位置。该模块还包括count、odd_count和even_count三个计数器。count用于计算FIFO中的数据数量,odd_count和even_count用于计算FIFO2和FIFO3中的数据数量。
在时钟上升沿和复位时,指针和计数器被初始化。当写入使能信号wr_en为高电平时,数据wr_data被写入到FIFO中。当读取使能信号rd_en为高电平且FIFO中有数据时,数据被从FIFO中读取出来。如果读取到的数据为奇数,则它被写入FIFO2中;否则,它被写入FIFO3中。FIFO、FIFO2和FIFO3的读取指针rd_ptr_1、rd_ptr_2和rd_ptr_3分别被递增以读取队列中的数据。
阅读全文