FPGA学习之路——FIFO读写

300000ps时,PLL模块初始化完成,可以看到clk_20m,clk_100m,clk_sdram的波形了。

新建IPFIFO

clk_20m       

rdclk

FIFO时钟

sdram_wr_ack  

(rdreq)

FIFO读请求信号

sys_data_in    

(data)

FIFO读出的数据

clk_100m    

(rdclk)

FIFO时钟

write_fifo_req       

(wrreq)

表示FIFO写请求信号

write_fifo_data_in      

wrusedw

写入FIFO的数据

wrf_use                (wrusedw)

(q)

当前FIFO队列里存在的数据个数(一般会用到存入个数,而不会用rdusedw(读出个数))

先看写FIFO的过程,每一个时钟(clk_100m)上升沿,判断写请求信号是否为高电平

如果为高电平

(1)在该上升沿时,数据线上的数据写入FIFO,

(2)在下一个时钟上升沿,wrf_use增加1,表示FIFO队列里的数据增加了一个。

在每个读时钟的上升沿,判断两个条件

(1)读请求信号是否为高电平,

(2) FIFO是否为空

如果高、不为空,那么在下一个read_clock的上升沿将数据读出,具体可看下图:

不难发现,第一个read_clock上升沿,FIFO为空;第二个上升沿,FIFO不为空,准备开始读出数据;第三个上升沿,读出数据,同时wrf_use要减1

wrf_use是由write_clock维护的,故在下一个写时钟的上升沿,更新wrrf_use 8变成7)。

****************************************************************************************************

再看一副图,下一个8*16bit 数据,道理还是和上面的一样。

下面看一下读请求为低电平的情况

不难看出,wrf_use随着数据的写入而增加

在累积了一段时间数据后,又迎来了读请求信号,看下图:(还是:上升沿判断,下一个上升沿读取。。。),不再赘述

猜你喜欢

转载自blog.csdn.net/lusics/article/details/53645266