Verilog将一个FIFO写数据1-20,并将奇数读出到FIFO2,偶数读到FIFO3内
时间: 2024-03-01 13:51:46 浏览: 72
Verilog写的FIFO程序
4星 · 用户满意度95%
下是一个简单的Verilog代码,它实现了将一个FIFO写入数据1-20,并将奇数读出到FIFO2,偶数读到FIFO3的功能。
```
module fifo_splitter (
input clk,
input rst_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] fifo1 [0:FIFO_DEPTH-1];
reg [31:0] fifo2 [0:FIFO_DEPTH-1];
reg [31:0] fifo3 [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 rst_n) begin
if (~rst_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
fifo1[wr_ptr] <= wr_data;
wr_ptr <= wr_ptr + 1;
count <= count + 1;
end
if (rd_en && count > 0) begin
if (fifo1[rd_ptr_1][0] == 1'b1) begin
fifo2[odd_count] <= fifo1[rd_ptr_1];
odd_count <= odd_count + 1;
end else begin
fifo3[even_count] <= fifo1[rd_ptr_1];
even_count <= even_count + 1;
end
rd_data_1 <= fifo1[rd_ptr_1];
rd_ptr_1 <= rd_ptr_1 + 1;
count <= count - 1;
end
if (odd_count > 0) begin
rd_data_2 <= fifo2[rd_ptr_2];
rd_ptr_2 <= rd_ptr_2 + 1;
odd_count <= odd_count - 1;
end
end
end
endmodule
```
这个模块有三个输入和两个输出。它包括一个FIFO1,它将写入的数据存储在其中,并且有两个输出FIFO2和FIFO3,它们存储从FIFO1中读取的奇数和偶数。
当写入使能信号wr_en为高电平时,数据wr_data被写入到FIFO1中。当读取使能信号rd_en为高电平且FIFO1中有数据时,数据被从FIFO1中读取出来。如果读取的数据的最低位是1,则它被写入FIFO2中;否则,它被写入FIFO3中。FIFO2和FIFO3的读取指针rd_ptr_2和rd_ptr_3分别被递增以读取队列中的数据。
阅读全文