Verilog写三个FIFO,将1-20写入FIFO1,并分别将奇数输出给FIFO2偶数分配给FIFO3,并读出
时间: 2024-03-02 15:53:59 浏览: 73
好的,我来为您提供Verilog代码,实现将1-20写入FIFO1,并分别将奇数输出给FIFO2,偶数分配给FIFO3,并从三个FIFO中读出数据。
请注意,FIFO是“First In First Out”的缩写,也就是先进先出。因此,我们需要使用FIFO来实现数据的顺序存储和读取。
以下是Verilog代码:
```
module fifo_top(
input clk,
input rst,
input [31:0] data_in,
output [31:0] data_out1,
output [31:0] data_out2,
output [31:0] data_out3
);
reg [4:0] count;
reg [31:0] data_out;
fifo #(.DATA_WIDTH(32), .DEPTH(20)) fifo1 (.clk(clk), .rst(rst), .data_in(data_in), .wr_en(wr_en1), .rd_en(rd_en1), .data_out(data_out));
fifo #(.DATA_WIDTH(32), .DEPTH(10)) fifo2 (.clk(clk), .rst(rst), .data_in(data_out), .wr_en(wr_en2), .rd_en(rd_en2), .data_out(data_out2));
fifo #(.DATA_WIDTH(32), .DEPTH(10)) fifo3 (.clk(clk), .rst(rst), .data_in(data_out), .wr_en(wr_en3), .rd_en(rd_en3), .data_out(data_out3));
always @(posedge clk) begin
if (rst) begin
count <= 0;
end
else begin
if (wr_en1) begin
fifo1.write(data_in);
end
if (rd_en1) begin
fifo1.read(data_out);
if (count % 2 == 0) begin
fifo3.write(data_out);
end
else begin
fifo2.write(data_out);
end
count <= count + 1;
end
if (rd_en2) begin
fifo2.read(data_out2);
end
if (rd_en3) begin
fifo3.read(data_out3);
end
end
end
endmodule
module fifo #(
parameter DATA_WIDTH = 32,
parameter DEPTH = 16
) (
input clk,
input rst,
input [DATA_WIDTH-1:0] data_in,
input wr_en,
input rd_en,
output [DATA_WIDTH-1:0] data_out
);
reg [DATA_WIDTH-1:0] mem [DEPTH-1:0];
reg [4:0] wr_ptr = 0;
reg [4:0] rd_ptr = 0;
reg [4:0] count = 0;
always @(posedge clk) begin
if (rst) begin
wr_ptr <= 0;
rd_ptr <= 0;
count <= 0;
end
else begin
if (wr_en && count < DEPTH) begin
mem[wr_ptr] <= data_in;
wr_ptr <= wr_ptr + 1;
count <= count + 1;
end
if (rd_en && count > 0) begin
data_out <= mem[rd_ptr];
rd_ptr <= rd_ptr + 1;
count <= count - 1;
end
end
end
endmodule
```
在这个例子中,我们使用了三个FIFO,分别用于存储原始数据、奇数和偶数。在时钟的上升沿时,我们检查写使能和读使能信号是否为1。如果写使能信号为1且FIFO未满,则将数据写入数组,并将写指针自增1和计数器自增1。如果读使能信号为1且FIFO非空,则从数组中读取数据,并将读指针自增1和计数器自减1。最后,我们将奇数写入FIFO2,偶数写入FIFO3,并从三个FIFO中读取数据。
阅读全文