异步FIFO存在假空和假满两种状态。 假满状态:由于RD_PTR同步过来的时候需要两拍,这两拍其实可能发生了读操作,所以在写侧一看到fifo满的时候其实读测有了新的读,此时FIFO的状态实际上并不满,但已经判断为满,不允许写入了。 假空状态:由于WR_PTR同步过来的时候需要两拍,这两拍其实可能发生了写操作,所以在读侧...
output reg [DATA_WIDTH-1:0] rd_data, output reg rd_empty, output reg wr_full ); //这里的读写地址和读写地址指针不同,指针是本时钟域产生的,地址是另一个时钟域同步过来的,经过了打两拍 reg [ADDR-1:0] wr_ptr; //写指针,本时钟域的 reg [ADDR-1:0] rd_ptr; //读指针 ...
input rd_en,output reg [DATA_WIDTH-1:0] rd_data, output reg rd_empty, output reg wr_full );//这里的读写地址和读写地址指针不同,指针是本时钟域产生的,地址是另一个时钟域同步过来的,经过了打两拍 reg [ADDR-1:0] wr_ptr; //写指针,本时钟域的 ...
if(wr_ptr == FIFO_DEPTH-1)//注意这里,当写到fifo地址的最大值时需要从0开始写 wr_ptr <= {(ADDR_WIDTH+1){1'b0}}; elseif(wr_en && ~full) wr_ptr <= wr_ptr +1'b1; end end //- - - - - -rd_ptr- - - - - - - - - - - always@(posedgeclkornegedgerst_n) begin if(!
FIFO空标志位:很简单,只要读写指针相等即可。即wr_ptr ==rd_ptr。 写满状态的读写指针 FIFO满标志:与空标志不同的是,写指针要比读指针多走一圈FIFO的深度,此时虽然读写指针指向了同一个位置,但为了与读空状态作区别,我们引入比地址位多一位的地址声明。
登录后复制assign fifo_full_o = ((wr_ptr[$clog2(DEPTH)] != rd_ptr[$clog2(DEPTH)])&&(wr_addr== rd_addr)); 2.2 异步FIFO 同步FIFO可用于在同步时钟域传输多比特信号,但若要实现两个异步时钟域之间的数据传输,就要使用异步FIFO。 异步FIFO相较于同步FIFO最大的不同在于读/写时钟域是异步的,也...
当读地址rd_ptr赶上写地址wr_ptr,也就是rd_ptr完全等于wr_ptr时,可以断定,FIFO里的数据已被读空,而且只有在两种情况下,FIFO才会为空:第一种是系统复位,读写指针全部清零;另一种情况是在FIFO不为空时,数据读出的速率快于数据写入的速率,读地址赶上写地址时FIFO为空。空标志位的产生需要在读时钟域里完成,这...
如上图所示的同步模块synchronize to write clk,其作用是把读时钟域的读指针rd_ptr采集到写时钟(wr_clk)域,然后和写指针wr_ptr进行比较从而产生或撤消写满标志位wr_full;类似地,同步模块synchronize to read clk的作用是把写时钟域的写指针wr_ptr采集到读时钟域,然后和读指针rd_ptr进行比较从而产生或撤消读空标...
如上图所示的同步模块synchronize to write clk,其作用是把读时钟域的读指针rd_ptr采集到写时钟(wr_clk)域,然后和写指针wr_ptr进行比较从而产生或撤消写满标志位wr_full; 同步模块synchronize to read clk的作用是把写时钟域的写指针wr_ptr采集到读时钟域,然后和读指针rd_ptr进行比较从而产生或撤消读空标志位rd...
以空标志Empty的产生为例,当读写格雷码地址相等或者FIFO内还剩下一个深度的字,并且正在不空的情况下执行读操作,这时Emptr标志应该置为有效(高电平有效)。 即EMPTY<=(Rd_gray_addr=Wt_gray_addr)and(Read_enable=1)或EMPTY<=(Rd_next_gray_addr=Wt_gray_addr)and(Read_enable=1) ...