在300000多ps时,PLL模块初始化完成,可以看到clk_20m,clk_100m,clk_sdram的波形了。
新建IP核FIFO
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随着数据的写入而增加
在累积了一段时间数据后,又迎来了读请求信号,看下图:(还是:上升沿判断,下一个上升沿读取。。。),不再赘述