两块同步FIFO实现乒乓操作

乒乓操作

同步FIFO实现乒乓

fifo1进行写,fifo2进行读(第一次没有可读,考虑数据流入的第一个周期很短)
fifo控制模块,写完fifo1指定深度后,拉低写使能,转而拉高fifo2的写使能
两块fifo,前提是一个fifo存储不够,或者写速率大于读速率

module fifo_pingpang(
 input rst_n,
 input clk,
 input [7:0]data_in,
 input wr_en,
 output reg fifo1_wr_en,
 output reg fifo2_wr_en,
 output reg fifo1_rd_en,
 output reg fifo2_rd_en,
 output [7:0]data_out
);


wire [8:0] fifo_cnt1;
wire [8:0] fifo_cnt2;

wire [7:0]data_out1;
wire [7:0]data_out2;
assign data_out=fifo1_rd_en?data_out1:data_out2;

parameter idle = 4'b0000,
         start = 4'b0001,
          ping = 4'b0010,
          pang = 4'b0100;
              
reg[3:0]state;
reg[3:0]next_state;
//
always@(posedge clk or negedge rst_n)begin
if(!rst_n) state<= idle;
else state <= next_state;
end
//
always@(posedge clk)begin
 case(state)
  idle:if(wr_en) 
       next_state <= start;
       else next_state <= idle;
  start:if(fifo_cnt1 == 9'd500)
        next_state <= ping;
        else next_state <= start;
  ping:if(fifo_cnt2 == 9'd500)
        next_state <= pang;
	    
  • 11
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
乒乓FIFO是一种特殊的FIFO(First In First Out)队列,它允许在读取数据时同时写入新的数据,并且在写入新数据时同时读取已有的数据。以下是一个使用Verilog实现乒乓FIFO的简单示例: ```verilog module PingPongFIFO ( input wire clk, // 时钟信号 input wire reset, // 复位信号 input wire write_enable, // 写使能信号 input wire read_enable, // 读使能信号 input wire [7:0] write_data, // 写入数据 output wire [7:0] read_data // 读取数据 ); reg [7:0] fifo_mem [1:0]; // FIFO内存 reg [1:0] read_index; // 读取索引 reg [1:0] write_index; // 写入索引 always @(posedge clk or posedge reset) begin if (reset) begin read_index <= 2'b00; // 复位时重置索引 write_index <= 2'b00; end else begin if (write_enable) begin fifo_mem[write_index] <= write_data; // 写入新数据到FIFO write_index <= write_index + 1; // 更新写入索引 end if (read_enable) begin read_data <= fifo_mem[read_index]; // 从FIFO读取数据 read_index <= read_index + 1; // 更新读取索引 end end end endmodule ``` 在该Verilog代码中,使用两个2位宽的索引(read_index和write_index)分别用于读取和写入FIFO的数据。在时钟上升沿触发时,根据控制信号(write_enable和read_enable)进行相应的读写操作,并更新索引。同时,使用一个二维数组(fifo_mem)作为FIFO的存储器,可以保存8位宽的数据。读取操作将读取指定索引位置的数据并传递给输出端口(read_data),写入操作将将输入端口(write_data)的数据写入指定索引位置。 通过此Verilog代码,可以实现一个简单的乒乓FIFO模块,能够同时读取和写入数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值