FPGA的跨時(shí)鐘域問(wèn)題
掃描二維碼
隨時(shí)隨地手機(jī)看文章
這兩天調(diào)試圖像,有一個(gè)模塊輸出圖像出現(xiàn)閃屏現(xiàn)象,模塊環(huán)境定義如下:
由于涉及到進(jìn)出內(nèi)存操作,為了排除進(jìn)出內(nèi)存問(wèn)題,先屏蔽掉幀緩存模塊,發(fā)現(xiàn)圖像不閃,因此可以定位幀緩存引入的問(wèn)題。
再看幀緩存模塊,由于該模塊已經(jīng)過(guò)測(cè)試,復(fù)用性強(qiáng)穩(wěn)定性高,不會(huì)出現(xiàn)大問(wèn)題,這時(shí)對(duì)端口信號(hào)進(jìn)行監(jiān)測(cè)發(fā)現(xiàn)問(wèn)題。
輸入控制信號(hào)是36MHz,幀緩存模塊內(nèi)部工作時(shí)鐘是100MHz,因此需要對(duì)輸入控制信號(hào)同步到100MHz下。
輸入時(shí)序如下:
輸入i_a,i_b(脈沖信號(hào)),同時(shí)c = i_a && i_b;
因?yàn)楹竺婺K需要同時(shí)用到同步后的i_a信號(hào)以及c信號(hào),所以需要對(duì)i_a,以及c信號(hào)同時(shí)跨時(shí)鐘域,經(jīng)過(guò)同步模塊后,抓信號(hào)發(fā)現(xiàn)2個(gè)信號(hào)不再同步了。而每次抓信號(hào)看,同步后的i_a與c相差一個(gè)周期,而不同的綜合版本,相差的一個(gè)周期前后不一致。
這里我就犯了一個(gè)很?chē)?yán)重的錯(cuò)誤,就是多個(gè)信號(hào)分別跨時(shí)鐘域后進(jìn)行交匯,存在節(jié)拍上的不確定性。
即對(duì)于同樣的同步器,輸入信號(hào)a和b經(jīng)過(guò)同步以后,o_a與o_b不再保持原有的時(shí)序關(guān)系。
因此,為了解決該問(wèn)題,不再對(duì)i_a和i_b分別同步,而是只對(duì)i_a進(jìn)行同步,由o_a生成o_b信號(hào)。
這時(shí)就到了第二步操作:
assign o_b = o_a && flag;
其中,o_a與flag均為目標(biāo)時(shí)鐘域(100MHz)。此時(shí)再抓信號(hào),依然發(fā)現(xiàn)當(dāng)o_b為1時(shí),存在o_a為0的情況,這從邏輯上是怎么也解釋不通的,而且,兩個(gè)信號(hào)主要存在差一個(gè)周期的情況,因此還是懷疑同步問(wèn)題。
再看同步代碼,發(fā)現(xiàn)如下設(shè)計(jì):
最普通的做法,對(duì)輸入信號(hào)進(jìn)行延展,再用目標(biāo)時(shí)鐘采樣,得到同步后脈沖。
由于是慢時(shí)鐘域同步到快時(shí)鐘域,所以不存在采樣不到的問(wèn)題,但這里仍然有個(gè)很大的問(wèn)題,就是同步器的第一級(jí)寄存器會(huì)由于不滿足建立保持時(shí)間而產(chǎn)生亞穩(wěn)態(tài):
一般情況,跨時(shí)鐘域信號(hào)經(jīng)過(guò)第二個(gè)寄存器后會(huì)趨于穩(wěn)定,因此前面用d1與d2信號(hào)做同步輸出信號(hào)必然會(huì)因亞穩(wěn)態(tài)問(wèn)題導(dǎo)致輸出也呈亞穩(wěn)態(tài)。
因此簡(jiǎn)要修改代碼:
此時(shí)再抓信號(hào)看,各控制信號(hào)正常,再看圖像,也不再閃爍。
跨時(shí)鐘域問(wèn)題很多數(shù)字邏輯設(shè)計(jì)的教科書(shū)都有講到,對(duì)于芯片設(shè)計(jì)有專(zhuān)門(mén)的CDC檢查,但對(duì)于FPGA開(kāi)發(fā)來(lái)說(shuō),一般很少使用相關(guān)CDC工具,只能靠開(kāi)發(fā)者在設(shè)計(jì)的時(shí)候就考慮全面。
脈沖信號(hào)跨時(shí)鐘域最常用的就是NDFF方式:
(1)因?yàn)檩斎雜ig_in不一定在rx_clk的第一個(gè)時(shí)鐘沿采樣到,同時(shí)考慮到建立保持時(shí)間,輸入脈沖的持續(xù)時(shí)間必須大于2*Prx_clk;
(2)為了避免綜合工具對(duì)同步電路的優(yōu)化造成節(jié)拍上的不確定性以及亞穩(wěn)態(tài),輸入sig_in最好為時(shí)序邏輯,而synchronizer內(nèi)部不能有任何組合邏輯;
(3)多個(gè)不同信號(hào)進(jìn)行跨時(shí)鐘域后進(jìn)行交匯,則無(wú)法保證輸出信號(hào)的時(shí)序,上面第一個(gè)問(wèn)題就是這個(gè)道理;
(4)NDFF的第一級(jí)觸發(fā)器輸出信號(hào)存在不穩(wěn)定性,即亞穩(wěn)態(tài),一般要經(jīng)過(guò)第二級(jí)寄存器后信號(hào)會(huì)趨于穩(wěn)定,因此如果用第一級(jí)輸出作為最終輸出,結(jié)果依然會(huì)存在亞穩(wěn)態(tài)問(wèn)題,見(jiàn)上面第二個(gè)問(wèn)題。
跨時(shí)鐘域當(dāng)然還有很多其他方式,同步器只是最簡(jiǎn)單最常用的一種,常見(jiàn)的還有握手、FIFO等,也各有注意事項(xiàng)。
對(duì)于視頻流來(lái)說(shuō),數(shù)據(jù)路徑常用FIFO,而控制信號(hào)往往采用幀頭信號(hào)同步后,重新生成其他控制信號(hào)。
以上遇到的問(wèn)題,也是在設(shè)計(jì)中沒(méi)有考慮全面導(dǎo)致,以后還需多注意。





