关于这两天写的异步fifo代码是否遗漏数据问题

在这里插入图片描述
wr_fifo中:
在这里插入图片描述
rd_fifo中:
在这里插入图片描述
这两个地方是否有+1操作:
如果只有写数据有+1,读数据不+1,会出现数据漏写问题,读数据正常
在这里插入图片描述
图中画圈数据被漏掉。

如果都不+1,则运作正常,只是当状态计数器从2’d1状态转到2’d0状态后(即fifo满/空时),要一直等到fifo空/满之后才会再开始工作,稳定在读写交替的状态。如下图:读写使能完全不重叠。
在这里插入图片描述

如果都进行+1操作:还是会出现漏写数据的问题。读数据正常
在这里插入图片描述
如果只有读数据+1,写数据不+1:读写正常,而且读写操作有重叠部分,所以效率高一点。
在这里插入图片描述
上面读时钟10MHz,写时钟20Mhz。
所以是慢时钟下的操作+1,会更有效率?
明天调换时钟看看。

以下是一个简单的异步FIFO代码示例,使用Verilog语言编: ```verilog module async_fifo ( input clk, input rst, input wr_en, input rd_en, input [7:0] wr_data, output reg [7:0] rd_data, output reg empty, output reg full ); reg [7:0] fifo [0:7]; reg [2:0] wr_ptr = 0; reg [2:0] rd_ptr = 0; reg [2:0] count = 0; always @(posedge clk) begin if (rst) begin wr_ptr <= 0; rd_ptr <= 0; count <= 0; empty <= 1; full <= 0; end else begin if (wr_en && !full) begin fifo[wr_ptr] <= wr_data; wr_ptr <= wr_ptr + 1; count <= count + 1; empty <= 0; if (count == 8) full <= 1; end if (rd_en && !empty) begin rd_data <= fifo[rd_ptr]; rd_ptr <= rd_ptr + 1; count <= count - 1; full <= 0; if (count == 1) empty <= 1; end end end endmodule ``` 该模块具有以下输入和输出: - 输入信号: - `clk`:时钟信号。 - `rst`:复位信号。 - `wr_en`:使能信号。 - `rd_en`:读使能信号。 - `wr_data`:数据。 - 输出信号: - `rd_data`:读取数据。 - `empty`:FIFO是否为空。 - `full`:FIFO是否已满。 在每个时钟周期上升沿时,模块会执行以下操作: - 如果复位信号被激活,则重置FIFO,并将其标记为空。 - 如果使能信号被激活且FIFO未满,则将数据存储在FIFO中,并将指针向前移动一个位置。如果FIFO已满,则忽略入操作。 - 如果读使能信号被激活且FIFO非空,则将读取数据FIFO中读取,并将读指针向前移动一个位置。如果FIFO为空,则忽略读取操作。 这个异步FIFO模块使用了一个8字节的FIFO数组,指针`wr_ptr`和读指针`rd_ptr`分别指向下一个可入的位置和下一个可读取的位置。计数器`count`用于跟踪FIFO中当前存储的数据数量。`empty`和`full`信号分别表示FIFO是否为空和已满。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值