又到了一年一度的招聘季節(jié),有粉絲私信問了一個(gè)問題,一個(gè)關(guān)于以前流傳出來的大廠面試的題目,個(gè)人覺得算是比較經(jīng)典的題目,也是工作中經(jīng)常遇到的一個(gè)問題,所以準(zhǔn)備寫一篇回答下。
題目內(nèi)容
有一個(gè)數(shù)據(jù)需要從A時(shí)鐘域同步到B時(shí)鐘域,數(shù)據(jù)位寬是512bit的,但是考慮到其他原因,目前只允許使用256bit異步FIFO(已經(jīng)考慮空度滿寫的保護(hù)),因此設(shè)計(jì)了一個(gè)方案,如下圖所示,請(qǐng)問該方案有什么問題?如何優(yōu)化?
分析
通過上圖我們可以看到,512bit的數(shù)據(jù),被分成了2組256bit的數(shù)據(jù),采用同一個(gè)寫使能信號(hào)寫入到2個(gè)不同的異步FIFO中。在讀這一側(cè),通過一個(gè)FIFO的空信號(hào),同時(shí)將2個(gè)FIFO中的數(shù)據(jù)讀出來。乍一看起來好像沒有什么問題,且仿真的話,也不會(huì)有問題。但是在實(shí)際芯片中卻不是這么回事。主要的錯(cuò)誤就是誤認(rèn)為完全相同的異步FIFO在空、滿信號(hào)狀態(tài)上表現(xiàn)也一樣。
我們知道異步FIFO的空滿信號(hào)是通過格雷碼地址經(jīng)過轉(zhuǎn)換后比較得到的,而格雷碼在穿越異步時(shí)鐘域的時(shí)候,由于亞穩(wěn)態(tài),有可能造成穿越的結(jié)果出現(xiàn)延遲。如下圖所示,在t1時(shí)刻,寫地址的格雷碼已經(jīng)由00變成01,即寫入了一個(gè)數(shù)據(jù)。讀時(shí)鐘r_clk在采樣的過程中,由于亞穩(wěn)態(tài)寫地址同步后,可能得到01,或者00,如果得到01,那么在t2時(shí)刻empty信號(hào)就可以拉低了,如果是00,那么在t2時(shí)刻empty不會(huì)拉低,需要在t3時(shí)刻拉低。
一句話總結(jié),對(duì)于2個(gè)完全一樣的異步FIFO,即使同時(shí)寫入數(shù)據(jù),在讀時(shí)鐘域,empty信號(hào)的產(chǎn)生也是不一樣的,同樣,在寫時(shí)鐘域,full信號(hào)的產(chǎn)生也是不一樣的。
解決方案
這個(gè)問題的解決方案其實(shí)很簡單,寫入測(cè),ready_o信號(hào)的產(chǎn)生不能只使用fifo_1的滿信號(hào),也要使用fifo_2的滿信號(hào),即ready_o = full1_n & full2_n(full低電平有效)。同理,在讀數(shù)據(jù)的時(shí)候,不能只看fifo_1是否空,必須是2個(gè)fifo都不空的時(shí)候才可能讀數(shù)據(jù)。
總結(jié)
其實(shí)上面這個(gè)題目在實(shí)際項(xiàng)目是經(jīng)常用到的。2個(gè)FIFO被同時(shí)寫入的時(shí)候,默認(rèn)為2個(gè)FIFO是同時(shí)不空的,通過上面的分析,我們知道異步FIFO不是這么回事,那同步FIFO呢?理論上來講,同步FIFO是同時(shí)不空的。但是不同廠家設(shè)計(jì)的FIFO,其特性可能也有差異,從代碼的可移植性和可靠性來講,也不建議采用一個(gè)FIFO為空就推斷另一個(gè)FIFO也為空的方案,必須嚴(yán)格遵守:使用哪個(gè)FIFO,就要使用它的空、滿信號(hào)。
-
fifo
+關(guān)注
關(guān)注
3文章
390瀏覽量
43903 -
信號(hào)
+關(guān)注
關(guān)注
11文章
2809瀏覽量
77170 -
時(shí)鐘域
+關(guān)注
關(guān)注
0文章
52瀏覽量
9582 -
異步FIFO
+關(guān)注
關(guān)注
0文章
20瀏覽量
8414
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
面試問題-難忘的面試經(jīng)歷
異步FIFO結(jié)構(gòu)及FPGA設(shè)計(jì)
高速異步FIFO的設(shè)計(jì)與實(shí)現(xiàn)
Camera Link接口的異步FIFO設(shè)計(jì)與實(shí)現(xiàn)
異步FIFO結(jié)構(gòu)及FPGA設(shè)計(jì)
![<b class='flag-5'>異步</b><b class='flag-5'>FIFO</b>結(jié)構(gòu)及FPGA設(shè)計(jì)](https://file1.elecfans.com//web2/M00/A5/0A/wKgZomUMNqiAaHBxAAAzLoZ4ZBg111.gif)
異步FIFO結(jié)構(gòu)及FPGA設(shè)計(jì)
異步FIFO的設(shè)計(jì)分析及詳細(xì)代碼
![<b class='flag-5'>異步</b><b class='flag-5'>FIFO</b>的設(shè)計(jì)分析及詳細(xì)代碼](https://file1.elecfans.com//web2/M00/A6/E5/wKgZomUMQR2Ad5ApAAA6R613b6c264.png)
基于FPGA的異步FIFO設(shè)計(jì)方法詳解
![基于FPGA的<b class='flag-5'>異步</b><b class='flag-5'>FIFO</b>設(shè)計(jì)方法詳解](https://file1.elecfans.com//web2/M00/A6/F1/wKgZomUMQWSAbU71AAARLRnbnew205.jpg)
基于異步FIFO結(jié)構(gòu)原理
![基于<b class='flag-5'>異步</b><b class='flag-5'>FIFO</b>結(jié)構(gòu)原理](https://file.elecfans.com/web1/M00/45/E2/pIYBAFp6m9GAAqAYAAAtL5hLm2c693.jpg)
異步fifo詳解
FIFO設(shè)計(jì)—異步FIFO
![<b class='flag-5'>FIFO</b>設(shè)計(jì)—<b class='flag-5'>異步</b><b class='flag-5'>FIFO</b>](https://file1.elecfans.com/web2/M00/88/BE/wKgaomRwac2AG6kWAAASYuKvLbc378.jpg)
評(píng)論