校招基础——FIFO深度
1、读写没有空闲周期。(fA>fB)
fA = 80MHz
fB = 50MHz
Burst Length = 120
读写之间没有空闲周期,是连续读写一个突发长度。
解法:
写一个数据需要的时间 = 1 / 80MHz = 12.5ns
写一个突发需要的时间 = 120 * 12.5ns = 1500ns
读一个数据需要的时间 = 1 / 50MHz = 20ns
每1500ns,120个数据被写入FIFO,但读一个数据需要20ns的时间
则1500ns内读出多少个数据,1500 / 20 = 75
剩下的没有读出,就存在FIFO中,则需要120 - 75 = 45
快捷方法:FIFO深度 =120 - 120*50/80 = 45
补充:
读写没有空闲,若fA<=fB,则FIFO不会写满,深度为1即可。
2、读写都有空闲周期。(读写速率大小随意,可以相等)
fA = 80MHz
fB = 50MHz
Burst Length = 120
两个连续写入之间的空闲周期为 = 1(写使能占得百分比为50%)
两个连续读取之间的空闲周期为 = 3(读使能占得百分比为25%)
解法:
每写入一个数据等待1个周期再写入下个数据,即2周期写入1个数据。
每读出一个数据等待3个周期再读出下个数据,即4周期读出1个数据。
写一个数据需要的时间 = 2 * (1 / 80MHz) = 25ns
写一个突发需要的时间 = 120 * 25ns = 3000ns
读一个数据需要的时间 = 4 * (1 / 50MHz) = 80ns
每3000ns,120个数据被写入FIFO,但读一个数据需要80ns的时间
则3000ns内读出多少个数据,3000 / 80 = 37.5,FIFO深度=120-37.5=83。
快捷方法:FIFO深度 = 120 - 120*(50/4)/(80/2)=82.5=83。
3、考虑背靠背,读写速率相等。
读写速率相等
每100个时钟写入80个数据
每10个时钟读取8个数据
突发长度为160 (这个条件其实多余)
解法:
每100个时钟写入80个数据,那剩下20个时钟周期去哪了?
每10个时钟读取8个数据,那剩下2个时钟周期去哪了?
剩下的周期在哪我们不管,只考虑最差的情况,即前20个时钟周期空闲,后80个周期写完80个数据,立马又是写请求,这次是前80个时钟周期写完80个数据,后20个时钟周期空闲。即连续的写入,又称为背靠背。也就可以看成一个突发写入是80+80=160。
写一个突发需要的时间:160时钟周期
则160个时钟周期内读出多少个数据,160*8/10=128。
FIFO深度 = 160 - 128 = 32。
4、考虑背靠背,读写速率不等。
fA = 20MHz
fB = 40MHz
每1000个时钟周期写入500个数据
每4个时钟周期读出1个数据
解法:
考虑到“背靠背”的情况突发长度则为500 * 2 = 1000
则为每1000个时钟周期写入1000个数据
每4个周期,读取一个数据。
写一个数据需要的时间 = 1 / 20MHz = 50ns
写一个突发需要的时间 = 1000 * 50ns = 50000ns
读一个数据需要的时间 = 4 * (1 / 40MHz) = 100ns
每50000ns,120个数据被写入FIFO,但读一个数据需要100ns的时间
可以计算出,50000ns内读出多少个数据,50000 /100 = 500
剩下的没有读出,就存在FIFO中,则需要1000- 500 = 500
5、以下关于FIFO描述正确的是(CD)
A.空信号是在写时钟域产生的,满信号是在读时钟域产生的
B.外部可以直接操作FIFO的读写地址
C.FIFO可以分为同步FIFO和异步FIFO
D.FIFO是先进先出的存储器
解答:A、“写满读空”。空信号是在读时钟域产生的,满信号是在写时钟域产生的;B、FIFO(First Input First Output,先入先出队列),外部不可以直接操作FIFO的读写地址。
6、单口RAM、双口RAM、FIFO三者之间的关系
单口只有一组数据线与地址线,因此读写不能同时进行,而双口有两组数据线与地址线,读写可以同时进行。RAM有地址线,可以对存储单元寻址,FIFO没有地址线,不能对存储单元寻址,此外RAM数据读完还有,FIFO数据读完就没有了。
7、伪双口RAM和真双口RAM的区别?
伪双口RAM,一个端口只读,另一个端口只写,且写入和读取的时钟可以不同,位宽比可以不是1:1,而真双口RAM两个端口都分别带有读写端口,可以在没有干扰的情况下进行读写,彼此互不干扰。