打怪升级之FIFO的多写入与多写出

两个模块都由一根线写入FIFO时可能遇到的问题

1.模块A和模块B都有FIFO的写入三线(write_clk; write_req; write_data),但最终FIFO只有一组写入三线。
2.还是A和B的两模块,但此时A和B的写入三线各自什么时候会使用不知道,存在同时调用三线写入的情况,此时写入的数据肯定会报废。

多线并一线问题

这个解决办法很简答,使用或门将各个地方的输入并起来就可以了。

不同模块同时写入问题

直观的解决的办法是:建立各模块的数据输入输出控制。模块的数据可以就近存在本地,也可以存在指定地址范围的大存储器中。建立新的FIFO写入控制模块,该模块用来接收各模块写入请求并告知各模块现在的FIFO写入三线状态。此时可以将FIFO视为某种形式上的总线,各模块依次调用总线向FIFO中存入数据,有点类似于安排一个交警在总线上指挥交通。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的Verilog代码示例,演示如何将两个FIFO交替写入第三个FIFO并输出。 ``` module fifo_interleave ( input clk, input rst, input [7:0] fifo1_data, input fifo1_we, input fifo1_full, output [7:0] fifo3_data, output fifo3_re, output fifo3_full ); // 定义FIFO1和FIFO2 reg [7:0] fifo1 [0:7]; reg [7:0] fifo2 [0:7]; reg [2:0] fifo1_ptr; reg [2:0] fifo2_ptr; reg [2:0] fifo3_ptr; // 定义FIFO3 reg [7:0] fifo3 [0:15]; reg [3:0] fifo3_ptr_wr; reg [3:0] fifo3_ptr_rd; // 初始化指针 initial begin fifo1_ptr = 0; fifo2_ptr = 0; fifo3_ptr = 0; fifo3_ptr_wr = 0; fifo3_ptr_rd = 0; end // FIFO1写入FIFO3 always @ (posedge clk) begin if (rst) begin fifo3[fifo3_ptr_wr] <= 0; fifo3_ptr_wr <= 0; end else begin if (fifo1_we && !fifo3_full) begin fifo1[fifo1_ptr] <= fifo1_data; fifo1_ptr <= fifo1_ptr + 1; if (fifo1_ptr == 7) fifo1_ptr <= 0; fifo3[fifo3_ptr_wr] <= fifo1[fifo1_ptr]; fifo3_ptr_wr <= fifo3_ptr_wr + 1; if (fifo3_ptr_wr == 15) fifo3_ptr_wr <= 0; end end end // FIFO2写入FIFO3 always @ (posedge clk) begin if (rst) begin fifo3_ptr_rd <= 0; end else begin if (!fifo1_we && !fifo3_full) begin fifo2[fifo2_ptr] <= fifo1_data; fifo2_ptr <= fifo2_ptr + 1; if (fifo2_ptr == 7) fifo2_ptr <= 0; fifo3_ptr_rd <= fifo3_ptr_rd + 1; if (fifo3_ptr_rd == 15) fifo3_ptr_rd <= 0; end end end // 从FIFO3读取数据 always @ (posedge clk) begin if (rst) begin fifo3_re <= 0; fifo3_ptr_rd <= 0; end else begin if (!fifo3_full) begin fifo3_data <= fifo3[fifo3_ptr_rd]; fifo3_re <= 1; fifo3_ptr_rd <= fifo3_ptr_rd + 1; if (fifo3_ptr_rd == 15) fifo3_ptr_rd <= 0; end else begin fifo3_re <= 0; end end end // 检查FIFO3是否已满 assign fifo3_full = (fifo3_ptr_wr == fifo3_ptr_rd + 1) || (fifo3_ptr_wr == 0 && fifo3_ptr_rd == 15); endmodule ``` 在这个模块中,我们使用了三个FIFO:`fifo1`和`fifo2`用于存储两个输入FIFO的数据,`fifo3`用于存储交替写入的数据。`fifo1_ptr`和`fifo2_ptr`用于跟踪`fifo1`和`fifo2`中的当前位置,`fifo3_ptr_wr`和`fifo3_ptr_rd`用于跟踪`fifo3`中的写入和读取位置。 在时钟上升沿时,我们检查`fifo1_we`和`fifo3_full`以确定是否可以将`fifo1`中的数据写入`fifo3`中。如果可以,我们首先将`fifo1`中的数据写入`fifo1_ptr`位置,然后将`fifo3_ptr_wr`位置处的`fifo3`写入`fifo1_ptr`位置处的数据,并将`fifo1_ptr`和`fifo3_ptr_wr`递增1。类似地,我们在时钟上升沿时检查`!fifo1_we`和`fifo3_full`以确定是否可以将`fifo2`中的数据写入`fifo3`中。如果可以,我们首先将`fifo2`中的数据写入`fifo2_ptr`位置,然后将`fifo3_ptr_rd`位置处的`fifo3`读取到`fifo3_data`中,并递增`fifo3_ptr_rd`。最后,我们使用`fifo3_full`标志来指示`fifo3`是否已满,并将`fifo3_re`标志设置为1,以指示可以从`fifo3`中读取数据。 此外,我们还定义了一个`clk`时钟信号以及一个`rst`复位信号,用于初始化所有FIFO和指针。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

考琪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值