本篇作为FPGA FIFO基本介绍(FIFO Geneerator(13.2))的补充文档,解释Native 接口fifo的两种数据输出时序问题。
一、延迟现象出现原因
不止fifo会出现延迟一个时钟的现象,axi等也会出现延迟现象,有时还会出现延迟2-3个时钟,但是有时一个时钟都不延迟。代码延迟有什么规律吗?他们究竟会延迟几个时钟?
答案是一个时钟都不会延迟。所有的延迟均是其条件未满足,条件未满足当然不执行。在vivado仿真中一般忽略语句执行所需时间。同一时刻,满足条件的语句同时执行。
always @(posedge clk) befin
if (!rst_n) begin
a <= 0;
b <= 0;
end
else begin
a <= 1;
if (a)
b <= 1;
end
上述代码段,在rst_n拉高后的第一个时钟上升沿clk1时,a<=1。if语句中a是此时刻到来前的值0。所以,clk1后a=1,b=0;clk2到来,clk2到来前a=1,所以执行b<=1。从现象上,看出现了延迟,但实际上并没有。
二、standard fifo与fwft fifo
我们都知道,当ra_en拉高时,fifo才输出数据,就类似上面a拉高,b才会拉高为1。fifo内部的判断rd_en拉高才输出数据的机制,就决定了输出会比rd_en延迟一个时钟。这也正是standard fifo中输出延迟的原因。
但是为什么fwft fifo没有出现延迟呢?实际上,fwft提前拉高了rd_en,先输出一个数据放入寄存器准备着,但是不让你看到。然后等外部rd_en拉高的同时才一起输出。
我们可以把这个提前输出的数据当成预制菜假冒现做的。做菜需要时间,不可能听到客人点菜就出菜。所以standard fifo就是老老实实的听到客人点菜(rd_en=1),做完才端上来(延迟一个时钟)。而fwft,就是整个预制菜,听到客人点菜(rd_en=1),就把预制菜端上来,说现做的(无延迟输出)。从客人的角度,你叫了菜就立马有了。从厨师的角度,老板让提前做一份菜,留着。
注意老板让提前做一份,还有被提前做的那份菜,是在厨房(ip核)内部发生的,顾客(ipcore使用者)一般无法看到。