推荐答案
测试一下
题目
模块A发出的数据经过6个周期到达FIFO,预满信号经过12个周期返回A模块;FIFO读出的数据经过10个周期达到B模块。A模块每个周期发出一个数据,B模块每3个周期发出一个数据。求FIFO的预满深度1和最小深度2
参考答案与知识点
参考答案
我们分析一下这个题。这是一个关于FIFO深度计算的问题,涉及读写速率和延迟。题目中给出了几个延迟:模块A发出的数据经过6个周期到达FIFO;预满信号(应该是almost full信号?)经过12个周期返回A模块;FIFO读出的数据经过10个周期达到B模块。A模块每个周期发出一个数据,B模块每3个周期发出一个数据。求FIFO的预满深度1和最小深度2。这里“预满深度1”可能指的是almost full阈值(即当FIFO中数据达到多少时发出预满信号),而“最小深度2”可能指的是FIFO的最小深度(即不会溢出的最小深度)。题目没有明确说明,但通常这类题中,预满深度是指预先设置的一个警戒水位,用于提前停止写入,以补偿反馈延迟。而最小深度是指保证不溢出所需的最小FIFO深度。
我们需要计算:写时钟频率?假设A模块每个周期发出一个数据,即写速率=1数据/周期(写时钟周期假设为T,但题目没有明确时钟频率,通常认为A和B的时钟可能不同?但题目说“每个周期”和“每3个周期”,可能指的是同一个时钟域?或者不同时钟域?但通常这类题假设同一个时钟,因为延迟单位是周期。所以统一使用同一个时钟周期为单位。那么写速率=1/周期,读速率=1/3周期(每3个周期读一个数据)。FIFO的写入和读出速率不同,需要计算深度。
但是注意有延迟:写入的数据经过6个周期才到达FIFO(即A发出数据后,要6个周期后才进入FIFO)。同样,读出的数据经过10个周期才到达B模块,这意味着读使能信号和实际读数据到达B有延迟?或者是读取延迟?另外,预满信号从FIFO返回A需要12个周期。预满信号用于停止A发送数据,防止FIFO溢出。
我们需要计算在反馈延迟存在的情况下,FIFO的最小深度和预满阈值。通常,预满阈值是指当FIFO中数据量达到某个值时,发出预满信号,A收到后停止写入。由于反馈延迟,A在发出写请求后,需要12个周期才能收到预满信号,所以预满阈值必须使得在反馈延迟期间不会溢出。
另一个角度:由于写速率大于读速率,FIFO深度需要足够大以吸收写多于读的数据。另外,读延迟10个周期可能影响读出的实际时间?但读数据是FIFO读取后经过10周期到达B,而读使能应该是B模块每3周期发出一次读请求?还是B模块每3周期消耗一个数据?题目说“B模块每3个周期发出一个数据”,可能是指B模块每3个周期读取一个数据(即读使能每3周期有效一次)。那么从FIFO读出一个数据后,经过10个周期到达B,这10个周期不会影响FIFO的读取操作本身,因为读操作是在FIFO端发生的,数据被读取后就会从FIFO中移出,然后经过10周期传输。所以读延迟不影响FIFO内的数据量变化,只影响数据的到达时间。所以计算FIFO深度时,只考虑读写速率和写延迟、反馈延迟。
通常的FIFO深度计算:写速率 > 读速率,需要深度来缓存累积的差值。考虑最坏情况:A连续写入,B每3周期读一次。每3个周期,A写入3个数据,B读走1个,净增2个。所以如果不考虑反馈,FIFO深度需要足够大。但这里A的写入收到预满信号控制:当FIFO中数据达到预满阈值时,FIFO发出预满信号,经过12周期到达A,A收到后停止写入。但A在停止之前可能还在写,因为信号延迟。所以需要计算预满阈值。
设预满阈值为P(即当FIFO中数据个数达到P时,FIFO发出预满信号)。从FIFO发出预满信号到A停止写入,这之间有12个周期的延迟。在这12个周期内,A可能继续写入数据(因为A每周期写一个),直到收到信号才停。所以,在发出预满信号的时刻,FIFO中已经有P个数据;之后12周期内,A会写入12个数据(假设A没有停止),同时B会读取多少个?B每3周期读一个,12周期内读4个。所以净增12-4=8个。所以FIFO中的数据量会达到P+8。为了保证不溢出,FIFO的最小深度必须大于等于P+8。另一方面,P的取值应使得在正常工作中不会过早触发预满导致空等?但题目要求的是预满深度和最小深度,可能我们需要根据不溢出的条件计算最小深度,并且预满深度通常设为某个值(比如最小深度减去一些余量)。但这里可能是求两个数值:预满深度(即阈值)和最小深度(即FIFO实际需要的大小)。
通常这种题中,预满深度是指当FIFO中的数据达到该值时,发出预满信号,这个值的选择要保证在反馈延迟期间不会溢出。也就是说,预满深度应该等于FIFO最小深度减去反馈延迟期间可能的写入净增量。设最小深度为D,那么预满深度P = D - (写延迟期间写入的净增量)。写延迟期间写入净增量:12周期内写入12个,读出4个,净增8个。所以P = D - 8。另外,D必须至少能容纳最大累积。
另一种思路:考虑最坏情况,连续写,读速率慢,那么FIFO会持续累积。因为是满反馈控制,所以最终会稳定在一个水平。但需要计算最小的D使得不会溢出。假设A在初始时连续写,FIFO逐渐增加,当达到P时发出预满信号,但A需要12个周期后停止,此时FIFO达到P+8。如果D < P+8,就会溢出。所以要求D >= P+8。而P是我们可以设定的阈值,通常我们希望P尽可能小以减少延迟?但这里求的是“预满深度1”可能就是指P。而“最小深度2”是指最小的FIFO深度D_min。那么我们可以令D_min = P+8。但P本身是多少呢?还需要考虑另一个因素:因为A停止后,B继续读
涉及知识点
- 时钟