推荐答案
测试一下
题目
设计一个同步fifo,读写时钟相同,其中在写入时每100个时钟周期会写10个,具体哪个时刻写入不确定,在读出侧每10个cycle会读1个,计算FIFO的最小深度?
参考答案与知识点
参考答案
我们分析题目:同步FIFO,读写时钟相同。写入:每100个时钟周期写10个,具体写入时刻不确定;读出:每10个时钟周期读1个。求最小深度。
关键点:最坏情况下的写入与读出速率差异。写入速率:10/100 = 0.1 数据/周期;读出速率:1/10 = 0.1 数据/周期。平均速率相同,但由于写入突发和读出突发不同,需要考虑最坏情况下的最大未读数据量。
写入每100周期写10个,但具体时刻不确定。可能最坏情况是写入连续写10个?题目说“每100个时钟周期会写10个”,可能指每100个周期内,有10个写操作,但可以分散或连续。通常考虑最坏情况:写10个连续写入,然后等待90个周期;同时读每10周期读1个,读是均匀的?还是每10周期读一个,也是均匀的?由于读是每10周期读1个,是均匀的。需要计算最大累积差值。
因为是同步FIFO,读写时钟相同,但读写使能不同。我们需要考虑最坏情况下的写入突发长度(可能连续写10个)与读出速率的关系。
一种常见解法:考虑一个长时间窗口,比如100个时钟周期内,写入10个,读出10个(因为每10周期读1个,100周期读10个)。所以平均相同,但最坏情况:在写入开始连续写10个时,读也在进行,但读每10周期一个,那么10个连续写期间,读最多读1个(如果写发生在读周期内)?实际上需要考虑写入的相位。
由于写入时刻不确定,最坏情况可能是写入10个连续发生时,而读恰好没有在读?或者读的间隔导致数据积压。
通常计算最小深度的方法是:找出最大未读数据量。在同步FIFO中,读写时钟相同,但使能不同。可以看作:写使能每100个周期内有效10个周期,但可能连续;读使能每10个周期有效1个周期。最坏情况:写使能连续10个周期有效,读使能每10个周期有效1个,且读可能刚好错过写期间。这样在10个写周期内,读只有1个(如果读周期恰好发生在写期间内,可能读到1个),那么净增加9个数据。但还需要考虑后续。
实际上,更通用的方法是考虑一个“最坏情况”的突发。由于写是每100个周期10个,读是每10个周期1个,两者速率相等。但写入可能有“burst”特性。通常,对于这种问题,最小深度等于最大写入突发长度减去读出突发长度(考虑读速率)。这里最大写入突发长度是10(因为每100周期内最多连续写10个),而读每10周期读1个,所以在10个写周期内,最多读出1个(因为读间隔10,10个写周期内最多一个读周期),所以需要深度至少10-1=9?但需要考虑后续可能还有积压?因为读是均匀的,写完成后,后续读会逐渐消耗数据。但最坏情况是,在写突发期间,数据积压达到最大值,即9。那么FIFO深度至少为9?但实际中,我们还需要考虑写突发开始时的相位:如果写突发开始时刻,正好读也刚开始,那么读可能读到第一个写的数据?但不确定。最坏情况是写突发开始时,读刚刚结束,那么接下来的10个写周期,读只有一个(在中间某时刻),所以净增9。那么9就够了?
但需要确认:是否可能由于相位导致更大积压?例如,写突发可能跨越两个读周期?在10个写周期内,读最多一次(因为读间隔10,10个周期内最多一个读周期)。如果写突发正好从读周期之后开始,那么读周期在写突发的第几个周期?假设读每10周期一次,比如在周期0,10,20,...读。写突发从周期1开始连续10个写(周期1-10),那么读在周期10发生?周期10是第10个写周期?如果写周期是边沿触发,需要明确。通常我们考虑时钟上升沿。假设读使能在每个第10个时钟上升沿有效,那么如果写突发的第一个写时钟沿是周期1,那么周期10(第10个写时钟)时,读使能有效,此时可以读走一个数据。所以写10个,读走1个,剩下9个。如果写突发从周期0开始,读在周期0有效,那么第一个数据写入,同时读可能读走前一个数据?但这里写是连续,读在周期0读走一个(可能是之前的数据),之后周期10读走一个,那么写10个期间读走了两个?需要仔细:写突发10个,从周期0到9(连续10个周期)。读在周期0和10各一次。周期0的读可能读走一个之前的数据(假设FIFO中已有数据)或者读空?如果开始为空,那么周期0读使能但无数据可读,不算。通常考虑FIFO初始为空。那么写从周期0开始,第一个数据写入,周期0的读使能可能发生在写之前或同时?如果是同步边沿,需要明确时序。通常,在同一个时钟沿,写和读可以同时发生,我们通常认为读优先?或者可以同时进行?在FIFO设计中,通常读和写可以在同一时钟有效,读走的是旧数据,写的是新数据,那么读看不到新写入的数据。所以如果写使能和读使能在同一时钟沿,那么读的是之前的数据,写的数据不会在该周期被读走。所以周期0写数据,周期0读使能有效,但读的是之前的数据(如果之前有),如果没有,则读空。所以从周期0开始连续写10个,读在周期0(如果有读使能)不会读走周期0写入的数据,周期10的读使能可以读走周期9写入的数据?周期10读使能时,周期10写入的是第11个?其实连续写10个是周期0-9,周期10没有写。周期10的读使能可以读走周期9写入的数据。所以这10个写周期内,读使能两次:周期0和10。但周期0的读使能无法读走任何新写入的数据(因为新数据是周期0写入的),所以实际上
涉及知识点
- 时钟